use actix_web::{get, App, HttpServer, Result as AwResult}; use actix_files::Files; use maud::{DOCTYPE, html, Markup}; use std::io; use chrono::Local; struct NavElement { name: String, href: 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(elements: Vec) -> Markup { html!( nav.navBar { @for (i, element) in elements.iter().enumerate() { @if i == 0 { ( nav_element("navElement first", i, element) ) } @else if i == elements.len()-1 { ( nav_element("navElement last", i, element) ) } @else if i == 1 { ( nav_element("navElement current", i, element) ) } @else { ( nav_element("navElement", i, element) ) } } } ) } fn nav_element(element_class: &str, id: usize, element: &NavElement) -> Markup { html!( a class={( element_class.to_string() )} id={(format!("navElement-{}", id))} href={( element.href )} {( element.name )} ) } fn header() -> Markup{ let time = Local::now(); html!( header { (nav_bar(vec![ NavElement{ name: "breadsite".to_string(), href: "/".to_string()}, NavElement{ name: "test1".to_string(), href: "test1".to_string()}, NavElement{ name: "test2".to_string(), href: "test2".to_string()}, NavElement{ name: ":333".to_string(), href: ":3".to_string()}, NavElement{ name: time.to_string(), href: time.to_string()}, ])) } ) } fn pawer() -> Markup { html! { pawer { p { "paws...." } } } } fn layout() -> Markup { html! { (header()) h1 { "Hiiii" } (pawer()) } } fn page() -> Markup { html! { (head("breadsite")) body { (layout()) } } } #[get("/")] async fn index() -> AwResult { Ok(html! { (page()) }) } #[actix_web::main] async fn main() -> io::Result<()> { HttpServer::new(|| App::new() .service(index) .service(Files::new("/static", "./static")) ) .bind(("localhost", 8080))? .run() .await }