Application¶
Mutable route builder for the Hobby web framework.
Register routes via .> method chaining (get, post, etc.), then
call build() to validate and freeze the routes into a
BuiltApplication. Pass the result to Server to start listening.
use hobby = "hobby"
use stallion = "stallion"
use lori = "lori"
actor Main is hobby.ServerNotify
let _env: Env
new create(env: Env) =>
_env = env
let auth = lori.TCPListenAuth(env.root)
let app = hobby.Application
.> get("/", {(ctx) =>
hobby.RequestHandler(consume ctx)
.respond(stallion.StatusOK, "Hello!")
} val)
match app.build()
| let built: hobby.BuiltApplication =>
hobby.Server(auth, built, this
where host = "localhost", port = "8080")
| let err: hobby.ConfigError =>
env.err.print(err.message)
end
be listening(server: hobby.Server,
host: String, service: String)
=>
_env.out.print(
"Listening on " + host + ":" + service)
Application is ref — it is a builder that produces snapshots. You
can build routes, call build() to freeze a snapshot, add more
routes, and build again. Each BuiltApplication is independent.
Constructors¶
create¶
Returns¶
- Application ref^
Public Functions¶
get¶
Register a GET route.
fun ref get(
path: String val,
factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val,
interceptors: (Array[RequestInterceptor val] val | None val) = reference,
response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference)
: None val
Parameters¶
- path: String val
- factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val
- interceptors: (Array[RequestInterceptor val] val | None val) = reference
- response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference
Returns¶
- None val
post¶
Register a POST route.
fun ref post(
path: String val,
factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val,
interceptors: (Array[RequestInterceptor val] val | None val) = reference,
response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference)
: None val
Parameters¶
- path: String val
- factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val
- interceptors: (Array[RequestInterceptor val] val | None val) = reference
- response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference
Returns¶
- None val
put¶
Register a PUT route.
fun ref put(
path: String val,
factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val,
interceptors: (Array[RequestInterceptor val] val | None val) = reference,
response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference)
: None val
Parameters¶
- path: String val
- factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val
- interceptors: (Array[RequestInterceptor val] val | None val) = reference
- response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference
Returns¶
- None val
delete¶
Register a DELETE route.
fun ref delete(
path: String val,
factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val,
interceptors: (Array[RequestInterceptor val] val | None val) = reference,
response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference)
: None val
Parameters¶
- path: String val
- factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val
- interceptors: (Array[RequestInterceptor val] val | None val) = reference
- response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference
Returns¶
- None val
patch¶
Register a PATCH route.
fun ref patch(
path: String val,
factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val,
interceptors: (Array[RequestInterceptor val] val | None val) = reference,
response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference)
: None val
Parameters¶
- path: String val
- factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val
- interceptors: (Array[RequestInterceptor val] val | None val) = reference
- response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference
Returns¶
- None val
head¶
Register a HEAD route.
fun ref head(
path: String val,
factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val,
interceptors: (Array[RequestInterceptor val] val | None val) = reference,
response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference)
: None val
Parameters¶
- path: String val
- factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val
- interceptors: (Array[RequestInterceptor val] val | None val) = reference
- response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference
Returns¶
- None val
options¶
Register an OPTIONS route.
fun ref options(
path: String val,
factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val,
interceptors: (Array[RequestInterceptor val] val | None val) = reference,
response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference)
: None val
Parameters¶
- path: String val
- factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val
- interceptors: (Array[RequestInterceptor val] val | None val) = reference
- response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference
Returns¶
- None val
route¶
Register a route with an arbitrary HTTP method.
fun ref route(
method: Method val,
path: String val,
factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val,
interceptors: (Array[RequestInterceptor val] val | None val) = reference,
response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference)
: None val
Parameters¶
- method: Method val
- path: String val
- factory: {(HandlerContext iso): (HandlerReceiver tag | None)} val
- interceptors: (Array[RequestInterceptor val] val | None val) = reference
- response_interceptors: (Array[ResponseInterceptor val] val | None val) = reference
Returns¶
- None val
add_request_interceptor¶
Add an application-level request interceptor.
Request interceptors run before the handler on every request. Application
interceptors run before group interceptors, which run before per-route
interceptors. The first interceptor that returns InterceptRespond rejects
the request — the handler is never created.
App-level interceptors also run on 404 responses where no route matched.
Parameters¶
- interceptor: RequestInterceptor val
Returns¶
- None val
add_response_interceptor¶
Add an application-level response interceptor.
Response interceptors run after the handler responds, before the response goes to the wire. Application interceptors run before group interceptors, which run before per-route interceptors. All interceptors run — there is no short-circuiting.
App-level response interceptors also run on 404 responses where no route matched.
Parameters¶
- interceptor: ResponseInterceptor val
Returns¶
- None val
group¶
Consume a route group, flattening its routes into this application.
The group's prefix is applied to each of its routes. Group-level interceptors are preserved separately for tree building — they are registered on path nodes, not concatenated onto routes. The group is consumed — no further registration on it is possible.
Parameters¶
- g: RouteGroup iso
Returns¶
- None val
build¶
Validate routes and freeze them into a BuiltApplication.
Returns BuiltApplication on success or ConfigError if a
configuration error was detected (overlapping group prefixes,
invalid group prefix, conflicting param or wildcard names, empty
param name, empty wildcard name).
The Application is not consumed — you can add more routes and call
build() again. Each BuiltApplication is an independent
snapshot.
Returns¶
- (BuiltApplication val | ConfigError val)