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 } } }