aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/node.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/ui/node.rs')
-rw-r--r--server/src/routes/ui/node.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/server/src/routes/ui/node.rs b/server/src/routes/ui/node.rs
new file mode 100644
index 0000000..b6d0d30
--- /dev/null
+++ b/server/src/routes/ui/node.rs
@@ -0,0 +1,61 @@
+use super::super::stream::rocket_uri_macro_r_stream;
+use super::error::MyError;
+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/<path..>")]
+pub async fn r_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!(r_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!(r_library_node(&item.lib_path)).to_string()] { @item.data.title } }
+ }
+ ItemPage(item: Arc<Item>) {
+ h1 { @item.data.title }
+ video[src=&uri!(r_stream(&item.lib_path, "1,2")).to_string(), controls] {}
+ }
+}