Router

urlpatterns!, path parameters, named links.

● ● ●
use runique::prelude::*;
use crate::views::*;

pub fn routes() -> Router {
    urlpatterns! {
        "/"                 => view! { index },          name = "index",
        "/articles"         => view! { article_list },   name = "article_list",
        "/articles/{id}"    => view! { article_detail }, name = "article_detail",
        "/articles/{id}/edit" => view! { article_edit }, name = "article_edit",
        "/registration"     => view! { registration },   name = "registration",
    }
}
// Route: "/articles/{id}"
pub async fn article_detail(mut request: Request) -> AppResult<Response> {
    let id = request.path_param("id")
        .and_then(|s| s.parse::<i32>().ok())
        .unwrap_or(0);

    let db = request.engine.db.clone();
    let article = article::Entity::find_by_id(id)
        .one(&*db).await.unwrap_or(None);

    context_update!(request => { "article" => &article });
    request.render("article/detail.html")
}
{# Simple route — pre-processed as {{ link(link=''index'') }} #}
<a href=''{% link "index" %}''>Home</a>

{# Route parameter — pre-processed as {{ link(link=''article_detail'', id=article.id) }} #}
<a href=''{% link "article_detail" id=article.id %}''>{{ article.title }}</a>

{# No query — clean URL #}
<a href=''{% link "article_list" %}''>All articles</a>

{# With query — pre-processed as {{ link(link=''article_list'', query={page: 2}) }} #}
<a href=''{% link "article_list" query={page: 2} %}''>Next page</a>