aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/pages/node.rs
blob: 7ac4332e5d193df805b83d6bb1fdfd721f0f747e (plain)
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
use crate::{
    frontend::pages::HtmlTemplate,
    library::{Directory, Item, Node},
    AppState,
};
use anyhow::Context;
use rocket::{get, uri, State};
use std::{ops::Deref, path::PathBuf, sync::Arc};

use super::MyError;

#[get("/library/<path..>")]
pub async fn page_library_node(
    path: PathBuf,
    state: &State<AppState>,
) -> Result<HtmlTemplate<markup::DynRender>, MyError> {
    let path = path.to_str().unwrap().to_string();
    let node = state
        .library
        .nested(&path)
        .context("retrieving library node")?
        .clone();
    Ok(HtmlTemplate(
        format!("{}", node.title()),
        markup::new! {
            @NodePage { node: node.clone() }
        },
    ))
}

markup::define! {
    NodePage(node: Arc<Node>) {
        @match node.deref() {
            Node::Directory(dir) => { @DirectoryPage { dir: dir.clone() } }
            Node::Item(item) => { @ItemPage { item: item.clone() } }
        }
    }
    DirectoryCard(dir: Arc<Directory>) {
        span { a[href=&uri!(page_library_node(&dir.lib_path)).to_string()] { @dir.data.name } }
    }
    DirectoryPage(dir: Arc<Directory>) {
        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<Item>) {
        span { a[href=&uri!(page_library_node(&item.lib_path)).to_string()] { @item.data.title } }
    }
    ItemPage(item: Arc<Item>) {
        h1 { @item.data.title }
    }
}