Architecture of a Runique Project

Request Lifecycle

Lifecycle

1. HTTP request arrives
2. Middlewares traversed (slot order)
3. Extensions injected (Engine, Tera, Config)
4. Session loaded, CSRF verified
5. Handler called with extractors (Request, Prisme<T>)
6. Handler returns AppResult<Response>
7. Middlewares traversed in reverse order
8. HTTP response sent

Best Practices

1. Clone Arcs

let db = request.engine.db.clone();

2. Forms = per-request copies

Prisme(mut form): Prisme<MyForm>
// Each request = isolated form, zero concurrency

3. context_update! for context

context_update!(request => {
    "title" => "My page",
    "data" => &my_data,
});

4. Flash messages for redirects

success!(request.notices => "Action successful!");
return Ok(Redirect::to("/").into_response());

5. flash_now! for direct rendering

context_update!(request => {
    "messages" => flash_now!(error => "Validation error"),
});