Architecture of a Runique Project

Rust Macros

Runique provides a set of macros to simplify development.

Context Macros

MacroDescriptionExample
context!Create a Tera contextcontext!("title" => "Page", "count" => 3)
context_update!Add to a Request's contextcontext_update!(request => { "key" => value })

Flash Message Macros

MacroDescriptionExample
success!Success message (session)success!(request.notices => "OK!")
error!Error message (session)error!(request.notices => "Error")
info!Info message (session)info!(request.notices => "Info")
warning!Warning (session)warning!(request.notices => "Warning")
flash_now!Immediate message(s), no sessionflash_now!(error => "Error"), or several: flash_now!(warning => "One", "Two")

Routing Macros

MacroDescriptionExample
urlpatterns!Define named routesurlpatterns!("/" => view!{...}, name = "index")
view!Handler for every HTTP method (GET, POST, PUT, DELETE, PATCH)view!{ handler }

For a route that must accept one method only, pass Axum's router instead of view!: "/logout" => post(views::logout), name = "logout".


ORM macros

MacroDescriptionExample
impl_objects!Django-like manager (Entity::objects.filter(...))impl_objects!(Entity)

model!{} already generates that manager: impl_objects! is only for a SeaORM entity written by hand. See ORM.


Error Macros

MacroDescription
impl_from_error!Generates From<Error> for AppError

In context

The macros combine in a typical handler:

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) => {
            // Session flash + redirect (Post/Redirect/Get pattern)
            success!(request.notices => "Message sent!");
            return Ok(Redirect::to("/contact").into_response());
        }
        Err(form) => form,
    };

    // Add variables to the request context
    context_update!(request => {
        "title" => "Contact",
        "contact_form" => &form,
    });
    request.render("contact.html")
}

success! / error! / info! / warning! write to the session (visible after a redirect). flash_now! produces an immediate message without a session — useful when re-rendering the same page without redirecting.