use crate::{
frontend::pages::{HtmlTemplate, MyResult, layout::Layout},
library::{Directory, Item, Node},
AppState,
};
use actix_web::{get, web, Responder};
use log::debug;
use std::{ops::Deref, sync::Arc};
#[get("/library/{path:.*}")]
pub async fn page_library_node(
state: web::Data,
params: web::Path<(String,)>,
) -> MyResult {
debug!("request: {:?}", params.0);
let node = state.library.nested(¶ms.0)?;
Ok(HtmlTemplate(markup::new! {
@match node.deref() {
Node::Directory(dir) => {
@Layout {
title: format!("{} - Library", node.title()),
main: DirectoryPage { dir: dir.clone() },
}
}
Node::Item(item) => {
@Layout {
title: "".to_string(),
main: ItemPage { item: item.clone() },
}
}
}
}))
}
markup::define! {
DirectoryCard(dir: Arc) {
span { a[href=&dir.identifier] { @dir.data.name } }
}
DirectoryPage(dir: Arc) {
h1 { @dir.data.name }
ul.directorylisting {
@for el in &dir.children {
li {
span.title { @match el.deref().to_owned() {
Node::Directory(dir) => { @DirectoryCard { dir } }
Node::Item(item) => { @ItemCard { item } }
}}
}
}
}
}
ItemCard(item: Arc- ) {
span { a[href=&item.identifier] { @item.data.title } }
}
ItemPage(item: Arc
- ) {
h1 { @item.data.title }
}
}