use super::error::MyError; use super::player::player_uri; use crate::{ library::{Directory, Item, Node}, routes::ui::HtmlTemplate, AppState, }; use anyhow::Context; use rocket::{get, uri, State}; use std::{ops::Deref, path::PathBuf, sync::Arc}; #[get("/library/")] pub async fn r_library_node( path: PathBuf, state: &State, ) -> Result, MyError> { let node = state .library .nested_path(&path) .context("retrieving library node")? .clone(); Ok(HtmlTemplate( format!("{}", node.title()), markup::new! { @NodePage { node: node.clone() } }, )) } markup::define! { NodePage(node: Arc) { @match node.deref() { Node::Directory(dir) => { @DirectoryPage { dir: dir.clone() } } Node::Item(item) => { @ItemPage { item: item.clone() } } } } DirectoryCard(dir: Arc) { span { a[href=&uri!(r_library_node(&dir.lib_path)).to_string()] { @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=&uri!(r_library_node(&item.lib_path)).to_string()] { @item.info.title } } } ItemPage(item: Arc) { h1 { @item.info.title } a[href=&player_uri(&item.lib_path)] { "Watch now" } } }