# Wayfinder: Typesafe Routing in Gleam
[](https://hex.pm/packages/wayfinder)
[](https://hexdocs.pm/wayfinder/)
## Introduction
This is a package to generate a typesafe router for a gleam web server.
It also provides a typesafe method of linking to paths, so you don't link to invalid pages.
Zero dependencies and works for both `javascript` and `erlang` target!
## Usage
```bash
$ gleam add wayfinder # install package
```
```gleam
import lustre/attribute
import lustre/element/html
import wayfinder
import wisp
// --- --- --- DEFINE ROUTES --- --- ---
pub fn home_route() {
  wayfinder.make_route0("/", fn() { html.div([], [html.text("home")]) })
}
pub fn post_all_route() {
  wayfinder.make_route0("/post/all", post_all_handler())
}
pub fn post_route() {
  wayfinder.make_route1("/post/$id", fn(id: String) {
    html.div([], [html.text("post: " <> id)])
  })
}
pub fn routes() {
  [Wrapper0(home_route()), Wrapper0(post_all_route()), Wrapper1(post_route())]
}
// --- --- --- HANDLE WISP REQUESTS --- --- ---
fn handle_request(req: wisp.Request) {
  use req <- middleware(req)
  let segs = wisp.path_segments(req)
  let response = wayfinder.segs_to_handler(segs, routes())
  case response {
    Error(_) -> wisp.not_found()
    Ok(response) -> serve_html(response)
  }
}
// --- --- --- LINK PAGE IN HTML --- --- ---
pub fn post_all_handler() {
  html.div([], [
    html.a([attribute.href(wayfinder.route_to_path1(post_route(), "two"))], [
      html.text("post 1"),
    ]),
  ])
}
```
Checkout the [example](./example) for a minimal wisp web server setup.
## FAQ
### Is this production ready?
Yes! Feel free to use it in a serious project. I myself use it in side projects and at the company I work at in a production SaaS.
## License
[Apache License, Version 2.0](./LICENSE)