Skip to content

Application

[Source]

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.

class ref Application

Constructors

create

[Source]

new ref create()
: Application ref^

Returns


Public Functions

get

[Source]

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

Returns


post

[Source]

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

Returns


put

[Source]

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

Returns


delete

[Source]

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

Returns


patch

[Source]

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

Returns


[Source]

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

Returns


options

[Source]

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

Returns


route

[Source]

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

Returns


add_request_interceptor

[Source]

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.

fun ref add_request_interceptor(
  interceptor: RequestInterceptor val)
: None val

Parameters

Returns


add_response_interceptor

[Source]

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.

fun ref add_response_interceptor(
  interceptor: ResponseInterceptor val)
: None val

Parameters

Returns


group

[Source]

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.

fun ref group(
  g: RouteGroup iso)
: None val

Parameters

Returns


build

[Source]

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.

fun ref build()
: (BuiltApplication val | ConfigError val)

Returns