64 lines
1.7 KiB
Rust
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())),
|
|
}
|
|
}
|