Documentation / Routing / Returning Responses
Returning Responses
HTML Template (most common)
async fn index(mut request: Request) -> AppResult<Response> {
context_update!(request => {
"title" => "Home",
});
request.render("index.html")
}
Redirect
use axum::response::Redirect;
async fn after_submit(request: Request) -> AppResult<Response> {
success!(request.notices => "Saved!");
Ok(Redirect::to("/").into_response())
}
JSON
use axum::Json;
use runique::prelude::serde_json::json;
async fn api_list() -> Json<serde_json::Value> {
Json(json!({
"status": "success",
"data": [1, 2, 3]
}))
}
Status Code
use axum::http::StatusCode;
async fn not_found() -> StatusCode {
StatusCode::NOT_FOUND
}
Tuple Response
async fn created(Json(data): Json<Data>) -> (StatusCode, Json<Data>) {
(StatusCode::CREATED, Json(data))
}
Full app structure
// src/url.rs
use crate::views;
use runique::prelude::*;
use runique::{urlpatterns, view};
pub fn routes() -> Routes {
urlpatterns! {
"/" => view!{ views::index }, name = "index",
"/about" => view! { views::about }, name = "about",
"/signup" => view! { views::sign_up }, name = "signup",
}
}
// src/views.rs
use runique::prelude::*;
pub async fn index(mut request: Request) -> AppResult<Response> {
context_update!(request => { "title" => "Home" });
request.render("index.html")
}
pub async fn about(mut request: Request) -> AppResult<Response> {
// Direct render: flash_now! (success! would only show on the next request)
context_update!(request => {
"title" => "About",
"messages" => flash_now!(success => "Welcome!"),
});
request.render("about.html")
}
pub async fn sign_up(mut request: Request) -> AppResult<Response> {
let form: SignupForm = request.form("signup");
let validated = match ValidationForm::try_form(form, &request).await {
Ok(validated) => validated,
Err(form) => {
// Not sent (first display): blank form, no flash.
// Sent but invalid: re-render with the error flash.
if !form.is_submitted() {
context_update!(request => {
"title" => "Sign up",
"signup_form" => &form,
});
} else {
context_update!(request => {
"title" => "Error",
"signup_form" => &form,
"messages" => flash_now!(error => "Please fix the errors"),
});
}
return request.render("signup.html");
}
};
match validated.save(&request.engine.db).await {
Ok(_) => {
success!(request.notices => "Welcome!");
Ok(Redirect::to("/").into_response())
}
Err(form) => {
context_update!(request => {
"title" => "Error",
"signup_form" => &form,
"messages" => flash_now!(error => "Please fix the errors"),
});
request.render("signup.html")
}
}
}