10 releases

0.3.6 Jan 2, 2024
0.3.5 Mar 20, 2023
0.3.3 Apr 1, 2022
0.3.2 Jan 7, 2022
0.1.1 Jun 12, 2021

#1043 in HTTP server

Download history 301/week @ 2023-11-03 716/week @ 2023-11-10 669/week @ 2023-11-17 359/week @ 2023-11-24 489/week @ 2023-12-01 753/week @ 2023-12-08 776/week @ 2023-12-15 418/week @ 2023-12-22 1310/week @ 2023-12-29 1006/week @ 2024-01-05 1019/week @ 2024-01-12 1105/week @ 2024-01-19 1335/week @ 2024-01-26 1300/week @ 2024-02-02 1045/week @ 2024-02-09 1169/week @ 2024-02-16

4,903 downloads per month
Used in 7 crates


1.5K SLoC

Welcome to Trillium!

📖 Guide 📖

The guide provides an architectural overview and lay of the land connecting the trillium crates.

📑 Rustdocs 📑

The rustdocs represent the best way to learn about any of trillium's individual crates and the specific interfaces.


Licensed under either of

at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.


Welcome to the trillium router crate!

This router is built on top of routefinder, and the details of route resolution and definition are documented on that repository.

use trillium::{conn_unwrap, Conn};
use trillium_router::{Router, RouterConnExt};

let router = Router::new()
.get("/", |conn: Conn| async move { conn.ok("you have reached the index") })
.get("/pages/:page_name", |conn: Conn| async move {
let page_name = conn_unwrap!(conn.param("page_name"), conn);
let content = format!("you have reached the page named {}", page_name);

use trillium_testing::prelude::*;
assert_ok!(get("/").on(&router), "you have reached the index");
assert_ok!(get("/pages/trillium").on(&router), "you have reached the page named trillium");

Although this is currently the only trillium router, it is an important aspect of trillium's architecture that the router uses only public apis and is interoperable with other router implementations. If you have different ideas of how a router might work, please publish a crate! It should be possible to nest different types of routers (and different versions of router crates) within each other as long as they all depend on the same version of the trillium crate.

Options handling

By default, the trillium router will reply to an OPTIONS request with the list of supported http methods at the given route. If the OPTIONS request is sent for *, it responds with the full set of http methods supported by this router.

Note: This behavior is superceded by an explicit OPTIONS handler or an any handler.

To disable the default OPTIONS behavior, use Router::without_options_handling or RouterRef::set_options_handling


~186K SLoC