Concepts clés
1. RuniqueEngine
État principal partagé de l'application :
pub struct RuniqueEngine {
pub db: Arc<DatabaseConnection>,
pub tera: Arc<Tera>,
pub config: RuniqueConfig,
}
Injecté comme Extension Axum, accessible dans chaque handler via request.engine.
2. Request — L'extracteur principal
Request est l'extracteur central de Runique. Il remplace l'ancien TemplateContext et contient tout le nécessaire :
pub struct Request {
pub engine: AEngine, // Arc<RuniqueEngine>
pub session: Session, // Session tower-sessions
pub notices: Message, // Flash messages
pub csrf_token: CsrfToken, // Token CSRF
pub context: Context, // Contexte Tera
pub method: Method, // Méthode HTTP
}
Usage dans un handler :
pub async fn index(mut request: Request) -> AppResult<Response> {
context_update!(request => {
"title" => "Accueil",
});
request.render("index.html")
}
Méthodes :
request.render("template.html")— Rendu avec le contexte courantrequest.method.is_safe()— Vérification de la méthode HTTP (GET/HEAD)
3. `request.form()` — Extraction intégrée de formulaire
pub async fn handler(mut request: Request) -> AppResult<Response> {
let form: RegisterForm = request.form();
let form = match ValidationForm::try_new(form, &request).await {
Ok(validated) => {
let user = validated.save(&request.engine.db).await?;
success!(request.notices => "Utilisateur créé !");
return Ok(Redirect::to("/").into_response());
}
Err(form) => form,
};
context_update!(request => {
"form" => &form,
});
request.render("form.html")
}
request.form() orchestre automatiquement :
- Parse le body de la requête
- Crée une instance du formulaire
- Vérifie le token CSRF
- Remplit les données soumises