Architecture d'un projet Runique

Macros Rust

Runique fournit un ensemble de macros pour simplifier le développement.

Macros de contexte

MacroDescriptionExemple
context!Créer un contexte Teracontext!("title" => "Page", "count" => 3)
context_update!Ajouter au contexte d'une Requestcontext_update!(request => { "key" => value })

Macros flash messages

MacroDescriptionExemple
success!Message de succès (session)success!(request.notices => "OK !")
error!Message d'erreur (session)error!(request.notices => "Erreur")
info!Message info (session)info!(request.notices => "Info")
warning!Avertissement (session)warning!(request.notices => "Attention")
flash_now!Message(s) immédiat(s), sans sessionflash_now!(error => "Erreur"), ou plusieurs : flash_now!(warning => "Un", "Deux")

Macros de routage

MacroDescriptionExemple
urlpatterns!Définir des routes avec nomsurlpatterns!("/" => view!{...}, name = "index")
view!Handler pour toutes méthodes HTTP (GET, POST, PUT, DELETE, PATCH)view!{ handler }

Pour une route qui ne doit accepter qu'une méthode, passez le routeur d'Axum à la place de view! : "/logout" => post(views::logout), name = "logout".


Macros ORM

MacroDescriptionExemple
impl_objects!Manager Django-like (Entity::objects.filter(...))impl_objects!(Entity)

model!{} génère déjà ce manager : impl_objects! ne sert qu'à une entité SeaORM écrite à la main. Voir ORM.


Macros d'erreur

MacroDescription
impl_from_error!Génère From<Error> pour AppError

En situation

Les macros se combinent dans un handler typique :

use runique::prelude::*;

pub async fn contact(mut request: Request) -> AppResult<Response> {
    let form: ContactForm = request.form("my_form");

    let form = match ValidationForm::try_form(form, &request).await {
        Ok(_validated) => {
            // Flash en session + redirection (pattern Post/Redirect/Get)
            success!(request.notices => "Message envoyé !");
            return Ok(Redirect::to("/contact").into_response());
        }
        Err(form) => form,
    };

    // Ajoute des variables au contexte de la requête
    context_update!(request => {
        "title" => "Contact",
        "contact_form" => &form,
    });
    request.render("contact.html")
}

success! / error! / info! / warning! écrivent en session (visibles après redirection). flash_now! produit un message immédiat sans session — utile quand on réaffiche la même page sans rediriger.