Skip to content

Routing

Basic routes

gleam
router.new()
|> router.get("/posts", posts_ctrl.index)
|> router.post("/posts", posts_ctrl.create)
|> router.get("/posts/:id", posts_ctrl.show)
|> router.put("/posts/:id", posts_ctrl.update)
|> router.delete("/posts/:id", posts_ctrl.destroy)

A handler has the signature:

gleam
fn(Conn(body), List(#(String, String))) -> Response(ResponseData)

The second argument is the matched path parameters.

Path parameters

gleam
import mistweaver/request as mw_request

router.get("/users/:username", fn(c, params) {
  let username = mw_request.path_param(params, "username") |> option.unwrap("")
  mw_response.html(200, "Hello " <> username)
})

Wildcard routes

gleam
router.get("/static/*", fn(_c, _params) { mw_response.not_found() })

Scopes

Scopes group routes under a prefix with shared middleware:

gleam
router.scope("/api", [middleware.json_headers], fn(r) {
  r
  |> router.get("/users", users_ctrl.index)
  |> router.post("/users", users_ctrl.create)
})

Scopes nest:

gleam
router.scope("/", [rescue.middleware, auth.load(secret)], fn(r) {
  r
  |> router.get("/", home)
  |> router.scope("/admin", [auth.require(secret, to: "/login")], fn(r2) {
    r2
    |> router.get("/dashboard", admin_ctrl.dashboard)
  })
})

Static files

gleam
router.scope("/static", [middleware.static_files(
  under: "/static",
  from: "priv/static",
)], fn(s) {
  s |> router.get("/*", fn(_c, _params) { mw_response.not_found() })
})

Released under the Apache 2.0 License.