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) -> impl IntoResponse { println!("{}", body.name); println!("{}", body.email); println!("{}", body.message); (StatusCode::CREATED, "Thanks for contacting!") } async fn serve_assets(Path(asset_name): Path) -> 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())), } }