use actix_web::{get, App, HttpServer, Result as AwResult}; use actix_files::Files; use maud::{DOCTYPE, html, Markup}; use std::io; #[derive(Clone)] struct NavElement { name: String, href: String, class: String } fn head(page_title: &str) -> Markup { html! { (DOCTYPE) head { meta charset="utf-8"; title { (page_title) } link rel="stylesheet" href="static/style.css"; } } } fn nav_bar(mut elements: Vec, current: &str) -> Markup { elements.first_mut().map(|e| e.class.push_str(" first")); elements.last_mut().map(|e| e.class.push_str(" last")); elements.iter_mut().filter(|e| e.href == current).for_each(|e| e.class.push_str(" current")); html!( nav.navBar { @for (i, element) in elements.iter().enumerate() { ( nav_element(i, element) ) } } ) } fn nav_element(id: usize, element: &NavElement) -> Markup { html!( a class={( element.class.to_string() )} id={(format!("navElement-{}", id))} href={( element.href )} {( element.name )} ) } fn header(current: &str) -> Markup{ html!( header { (nav_bar(vec![ NavElement{ name: "breadsite".to_string(), href: "/".to_string(), class: String::from("navElement")}, NavElement{ name: "test".to_string(), href: "/test".to_string(), class: String::from("navElement")}, NavElement{ name: ":333".to_string(), href: "/3".to_string(), class: String::from("navElement")}, ], current)) } ) } // TODOOO: pawer styling // TODOO: pawer 81x31 // TODOO: pawer links fn pawer() -> Markup { html! { pawer { p { "paws...." } } } } // TODOOOO: about me // TODO: idea: heart rate monitor // TODO: idea: view counter // TODO: idea: currently listening to // TODO: idea: svg -> neocat generator fn breadsite() -> Markup { html! { h1 { "Hiiii" } } } fn htmx_test() -> Markup { html! { script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.6/dist/htmx.min.js" {} button hx-get="/click" hx-swap="outerHTML" { "Click Me" } } } fn layout(page_title: &str, current: &str,site: Markup) -> Markup { html! { (head(page_title)) body { (header(current)) (site) (pawer()) } } } #[get("/")] async fn breadsite_index() -> AwResult { Ok(html! { (layout("breadsite", "/", breadsite())) }) } #[get("/test")] async fn breadsite_test() -> AwResult { Ok(html! { (layout("test", "/test", breadsite())) }) } #[get("/3")] async fn breadsite_3() -> AwResult { Ok(html! { (layout(":333", "/3", htmx_test())) }) } #[actix_web::main] async fn main() -> io::Result<()> { HttpServer::new(|| App::new() .service(breadsite_index) .service(breadsite_test) .service(breadsite_3) .service(Files::new("/static", "./static")) ) .bind(("localhost", 8080))? .run() .await }