rust_htmx_message_box/src/routing.rs
2025-03-10 03:40:35 +03:00

64 lines
1.7 KiB
Rust

use askama::Template;
use axum::{
Form, Router,
extract::Path,
http::{HeaderMap, StatusCode, header},
response::{Html, IntoResponse},
routing::{get, post},
};
use serde::{Deserialize, Serialize};
use crate::{CSS, FAVICON};
#[derive(Debug, Serialize, Deserialize, Template)]
#[template(path = "main_page.html")]
struct MainPage {
name: String,
email: String,
message: String,
}
pub async fn route() -> Router {
Router::new()
.route("/alive", get(alive))
.route("/assets/{asset_name}", get(serve_assets))
.route("/{asset_name}", get(serve_assets))
.route("/", get(main_page))
.route("/send", post(send))
}
async fn alive() -> impl IntoResponse {
(StatusCode::OK, Html("I'm alive"))
}
async fn send(Form(body): Form<MainPage>) -> impl IntoResponse {
println!("{}", body.name);
println!("{}", body.email);
println!("{}", body.message);
(StatusCode::CREATED, "Thanks for contacting!")
}
async fn serve_assets(Path(asset_name): Path<String>) -> impl IntoResponse {
let mut headers = HeaderMap::new();
if asset_name == "main.css" {
headers.insert(header::CONTENT_TYPE, "text/css".parse().unwrap());
(StatusCode::OK, headers, CSS)
} else if asset_name == "favicon.ico" {
(StatusCode::OK, headers, FAVICON)
} else {
(StatusCode::NOT_FOUND, headers, "")
}
}
async fn main_page() -> impl IntoResponse {
let main_page = MainPage {
name: String::default(),
email: String::default(),
message: String::default(),
};
match main_page.render() {
Ok(rendered) => (StatusCode::OK, Html(rendered)),
Err(err_val) => (StatusCode::SERVICE_UNAVAILABLE, Html(err_val.to_string())),
}
}