HTTP servers

A server declaration binds an address, routes, and effect requirements into a declarative HTTP server.

Declaration

cleat
import "std/server"
import "std/json"

fn health(req: server.Request) -> Result[server.Response, string] {
    return Ok(server.json_response(200, json.encode(HealthStatus { status: "ok" })))
}

fn get_user(req: server.Request) -> Result[server.Response, string] needs { net } {
    let id = server.get_param(req.params, "id")
    return Ok(server.json_response(200, json.encode(User { id: id })))
}

server API {
    addr: ":8080"
    needs { net }

    get "/health" = health
    get "/users/:id" = get_user
    post "/api/review" = handle_review
}

Fields

FieldRequiredDescription
addr:yesListen address (e.g., ":8080", "localhost:3000")
needsyesMust include net
RoutesyesAt least one route required

Route syntax

text
method "path" = handler_function

Methods: get, post, put, delete, patch

Path parameters

Segments starting with : are extracted as named parameters:

cleat
get "/users/:id" = get_user
get "/users/:id/posts/:post_id" = get_post

Access via server.get_param(req.params, "id").

Starting the server

cleat
fn main() -> int needs { net } {
    return match API.start() {
        Ok(_) => 0,
        Err(e) => {
            io.println("error: ${e}")
            1
        },
    }
}

Server.start() blocks until the process receives SIGINT or SIGTERM, then performs graceful shutdown.

Handler signature

cleat
fn handler(req: server.Request) -> Result[server.Response, string] needs { ... } {
    // ...
}

Handlers that return Err(msg) automatically produce a 500 JSON response.

Request fields

FieldTypeDescription
methodstringHTTP method
pathstringURL path
bodystringRequest body
querystringRaw query string
headers[]server.HeaderRequest headers
params[]server.ParamPath parameters
request_idstringCorrelation ID

Response helpers

FunctionDescription
server.text(status, body)Plain text response
server.json_response(status, body)JSON response with Content-Type header
server.error_response(status, message)JSON error response
server.redirect(status, location)Redirect response

Correlation IDs

The server automatically extracts X-Request-ID from incoming requests. If absent, it generates a UUID. This ID:

Compiler enforcement

Edit this page on GitHub