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.rs54
1 files changed, 33 insertions, 21 deletions
diff --git a/server/src/routes/ui/node.rs b/server/src/routes/ui/node.rs
index e6f0809..d09c75c 100644
--- a/server/src/routes/ui/node.rs
+++ b/server/src/routes/ui/node.rs
@@ -17,7 +17,8 @@ use crate::{
use anyhow::Context;
use log::info;
use rocket::{get, http::ContentType, State};
-use std::{ops::Deref, path::PathBuf, sync::Arc};
+use rocket::{FromFormField, UriDisplayQuery};
+use std::{path::PathBuf, sync::Arc};
use tokio::fs::File;
#[get("/library/<path..>")]
@@ -32,24 +33,30 @@ pub async fn r_library_node(
Ok(LayoutPage {
title: node.title().to_string(),
content: markup::new! {
- @NodePage { node: node.clone() }
+ @NodePage { node: &node }
},
..Default::default()
})
}
markup::define! {
- NodePage(node: Arc<Node>) {
- @match node.deref() {
- Node::Directory(dir) => { @DirectoryPage { dir: dir.clone() } }
- Node::Item(item) => { @ItemPage { item: item.clone() } }
+ NodePage<'a>(node: &'a Arc<Node>) {
+ @match node.as_ref() {
+ Node::Directory(dir) => { @DirectoryPage { dir } }
+ Node::Item(item) => { @ItemPage { item } }
}
}
- DirectoryCard(dir: Arc<Directory>) {
+ NodeCard<'a>(node: &'a Arc<Node>) {
+ @match node.as_ref() {
+ Node::Directory(dir) => { @DirectoryCard { dir } }
+ Node::Item(item) => { @ItemCard { item } }
+ }
+ }
+ DirectoryCard<'a>(dir: &'a Arc<Directory>) {
div.card.dir {
div.banner {
a[href=uri!(r_library_node(&dir.lib_path))] {
- img[src=uri!(r_item_assets(&dir.lib_path))];
+ img[src=uri!(r_item_assets(&dir.lib_path, AssetRole::Banner))];
}
div.hover { a[href=uri!(r_library_node(&dir.lib_path))] { "Open" } }
}
@@ -59,29 +66,25 @@ markup::define! {
}
}
}
- // a[href=&uri!(r_library_node(&dir.lib_path))] { @dir.info.name } }
}
- DirectoryPage(dir: Arc<Directory>) {
+ DirectoryPage<'a>(dir: &'a Arc<Directory>) {
div.page.dir {
h1 { @dir.info.name }
@if let Some(parent) = dir.lib_path.parent() {
a.dirup[href=uri!(r_library_node(&parent))] { "Go up" }
}
ul.directorylisting {
- @for el in &dir.children {
- li { @match el.deref().to_owned() {
- Node::Directory(dir) => { @DirectoryCard { dir } }
- Node::Item(item) => { @ItemCard { item } }
- } }
+ @for node in &dir.children {
+ li { @NodeCard { node } }
}
}
}
}
- ItemCard(item: Arc<Item>) {
+ ItemCard<'a>(item: &'a Arc<Item>) {
div.card.item {
div.banner {
a[href=uri!(r_library_node(&item.lib_path))] {
- img[src=uri!(r_item_assets(&item.lib_path))];
+ img[src=uri!(r_item_assets(&item.lib_path, AssetRole::Banner))];
}
div.hover { a[href=&player_uri(&item.lib_path)] { "▶" } }
}
@@ -92,12 +95,12 @@ markup::define! {
}
}
}
- ItemPage(item: Arc<Item>) {
+ ItemPage<'a>(item: &'a Arc<Item>) {
// TODO different image here
- img.backdrop[src=uri!(r_item_assets(&item.lib_path))];
+ img.backdrop[src=uri!(r_item_assets(&item.lib_path, AssetRole::Backdrop))];
div.page.item {
div.banner {
- img[src=uri!(r_item_assets(&item.lib_path))];
+ img[src=uri!(r_item_assets(&item.lib_path, AssetRole::Banner))];
}
div.title {
h1 { @item.info.title }
@@ -112,12 +115,21 @@ markup::define! {
}
}
-#[get("/item_assets/<path..>")]
+#[derive(FromFormField, UriDisplayQuery)]
+pub enum AssetRole {
+ Banner,
+ Backdrop,
+}
+
+#[get("/item_assets/<path..>?<role>")]
pub async fn r_item_assets(
_sess: Session,
path: PathBuf,
+ role: AssetRole,
library: &State<Library>,
) -> Result<(ContentType, File), MyError> {
+ // TODO role
+ drop(role);
let node = library
.nested_path(&path)
.context("retrieving library node")?;