Macros de routage
Macro urlpatterns!
Définir les routes de l'application avec des noms pour la résolution d'URL :
use crate::views;
use runique::prelude::*;
use runique::{urlpatterns, view};
pub fn routes() -> Router {
urlpatterns! {
"/" => view!{ views::index }, name = "index",
"/users" => view! { views::user_list }, name = "users",
"/users/{id}" => view!{ views::user_detail }, name = "user_detail",
"/users/{id}/delete" => view!{ views::delete_user }, name = "user_delete",
}
}
Les segments de chemin dynamiques utilisent la syntaxe
{param}(Axum 0.8). L'ancienne syntaxe:paramn'est plus supportée.
Avec noms (recommandé)
Les noms permettent la résolution d'URL dans les templates via {% link "nom" %} :
urlpatterns! {
"/" => view!{ views::index }, name = "index",
"/users/{id}" => view!{ views::user_detail }, name = "user_detail",
}
<a href='{% link "index" %}'>Accueil</a>
<a href='{% link "user_detail" id="42" %}'>Profil</a>
Toutes les routes dans un même
urlpatterns!doivent être soit toutes nommées, soit toutes sans nom — le mélange n'est pas supporté.
Sans noms
urlpatterns! {
"/" => view!{ views::index },
"/about" => view!{ views::about },
}
Macro view!
Un même handler gère GET et POST ainsi que PUT et DELETE (pattern recommandé avec request.is_get() / request.is_post()) :
// Dans les routes
"/inscription" => view!{ views::inscription }, name = "inscription",
// Dans le handler
pub async fn inscription(mut request: Request) -> AppResult<Response> {
let mut form: RegisterForm = request.form();
if request.is_get() {
context_update!(request => { "form" => &form });
return request.render("form.html");
}
if request.is_post() {
if form.is_valid().await {
// ...
}
}
request.render("form.html")
}
Macro impl_objects! (bonus)
impl_objects! est générée automatiquement par le daemon dans chaque fichier d'entité. Elle ajoute un manager Django-like utilisable directement dans les handlers :
use crate::entities::users;
let user = users::Entity::objects
.filter(users::Column::Username.eq("john"))
.first(&db)
.await?;
Voir le guide ORM pour plus de détails.