//! # Rust Letter Backend //! //! `rust_letter_be` handles the backend execution using Rocket. #[macro_use] extern crate rocket; /// A module that handles the backend for the site. pub mod web_app_backend { use std::path::{PathBuf, Path}; use rocket::fs::FileServer; use rocket::http::{Cookie, CookieJar}; use rocket::response::Redirect; use rocket::{Build, Rocket}; use rocket_dyn_templates::{context, Template}; use void_fe::void_app::{self, PoemRequest, VirtualDom, HomeProps}; #[get("/")] async fn index(cookies: &CookieJar<'_>) -> Template { let dark_mode = match cookies.get("dark-mode") { Some(_) => true, None => false, }; let mut vdom = VirtualDom::new_with_props(void_app::HomePage, HomeProps { dark_mode: dark_mode, }); let _ = vdom.rebuild(); let output = dioxus_ssr::render(&vdom); Template::render( "index", context! { app_title: "A Letter to the Void", style_include: "", test: &output, dark_mode: match dark_mode { true => "dark", false => "" }, }, ) } #[get("/?set-dark-mode")] async fn dark_mode_root(cookies: &CookieJar<'_>) -> Redirect { match cookies.get("dark-mode") { Some(_) => cookies.remove(Cookie::named("dark-mode")), None => cookies.add(Cookie::new("dark-mode", "true")), }; // let path_str = String::from(Path::new("/").join(path).to_str().expect("valid path")); // let angy = path_str.as_str().to_owned(); Redirect::to("/") } #[get("/poem/?set-dark-mode")] async fn dark_mode(cookies: &CookieJar<'_>, entry: PathBuf) -> Redirect { match cookies.get("dark-mode") { Some(_) => cookies.remove(Cookie::named("dark-mode")), None => cookies.add(Cookie::new("dark-mode", "true")), }; let path_str = String::from(Path::new("/poem/").join(entry).to_str().expect("valid path")); let _angy = path_str.as_str().to_owned(); Redirect::to(path_str.as_str().to_owned().clone()) } #[get("/poem/")] async fn poem(cookies: &CookieJar<'_>, entry: &str) -> Template { let dark_mode = match cookies.get("dark-mode") { Some(_) => true, None => false, }; let mut vdom = VirtualDom::new_with_props( void_app::PoemPage, PoemRequest { slug: entry.to_string(), dark_mode: Some(dark_mode), }, ); let _ = vdom.rebuild(); let output = dioxus_ssr::render(&vdom); Template::render( "index", context! { app_title: "A Letter to the Void", style_include: "", test: &output, dark_mode: match dark_mode { true => "dark", false => "" }, }, ) } /// This runs `rocket::build()` with the needed mounts and routes. pub async fn build_rocket() -> Rocket { rocket::build() .mount("/images", FileServer::from("public/images")) .mount("/styles", FileServer::from("public/styles")) .mount("/fonts", FileServer::from("public/fonts")) .mount("/", routes![dark_mode_root, index, dark_mode, poem]) .attach(Template::fairing()) } }