src/main.rs (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
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<NavElement>, 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))
}
)
}
fn pawer() -> Markup {
html! {
pawer {
p { "paws...." }
}
}
}
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<Markup> {
Ok(html! {
(layout("breadsite", "/", breadsite()))
})
}
#[get("/test")]
async fn breadsite_test() -> AwResult<Markup> {
Ok(html! {
(layout("test", "/test", breadsite()))
})
}
#[get("/3")]
async fn breadsite_3() -> AwResult<Markup> {
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
}
|