From 948700d35f0eddbc2e0fd29548991e687362983d Mon Sep 17 00:00:00 2001 From: metamuffin Date: Wed, 11 Jan 2023 16:27:16 +0100 Subject: move files --- src/library.rs | 141 --------------------------------------------------------- 1 file changed, 141 deletions(-) delete mode 100644 src/library.rs (limited to 'src/library.rs') diff --git a/src/library.rs b/src/library.rs deleted file mode 100644 index 0c42a73..0000000 --- a/src/library.rs +++ /dev/null @@ -1,141 +0,0 @@ -use crate::metadata::{DirectoryInfo, ItemInfo}; -use anyhow::{anyhow, bail, Context, Ok}; -use std::{ffi::OsStr, fs::File, path::PathBuf, sync::Arc}; - -pub struct Library { - pub root: Arc, -} - -#[derive(Debug, Clone)] -pub enum Node { - Directory(Arc), - Item(Arc), -} - -#[derive(Debug, Clone)] -pub struct Directory { - pub lib_path: PathBuf, - pub identifier: String, - pub data: DirectoryInfo, - pub children: Vec>, -} - -#[derive(Debug, Clone)] -pub struct Item { - pub lib_path: PathBuf, - pub identifier: String, - pub data: ItemInfo, -} - -impl Library { - pub fn open(path: &str) -> anyhow::Result { - Ok(Self { - root: Node::from_path(path.into(), PathBuf::new(), true).context("indexing root")?, - }) - } - pub fn nested(&self, path: &str) -> anyhow::Result> { - let mut n = self.root.clone(); - if path == "" { - return Ok(n); - } - for seg in path.split("/") { - n = n - .get_directory()? - .child_by_ident(seg) - .ok_or(anyhow!("does not exist"))?; - } - Ok(n) - } -} - -impl Node { - pub fn get_directory(&self) -> anyhow::Result<&Directory> { - match self { - Node::Directory(d) => Ok(d), - Node::Item(_) => bail!("not a directory"), - } - } - pub fn title(&self) -> &str { - match self { - Node::Directory(d) => &d.data.name, - Node::Item(i) => &i.data.title, - } - } - pub fn identifier(&self) -> &str { - match self { - Node::Directory(d) => &d.identifier, - Node::Item(i) => &i.identifier, - } - } - pub fn from_path( - path: PathBuf, - mut lib_path: PathBuf, - root: bool, - ) -> anyhow::Result> { - if path.is_dir() { - let mpath = path.join("directory.json"); - let data: DirectoryInfo = - serde_json::from_reader(File::open(mpath).context("metadata missing")?)?; - - let identifier = path.file_name().unwrap().to_str().unwrap().to_string(); - if !root { - lib_path = lib_path.join(identifier.clone()); - } - - let children = path - .read_dir()? - .map(|e| e.unwrap().path()) - .filter(|e| e.extension() != Some(OsStr::new("json"))) - .map(|e| { - Node::from_path(e.clone(), lib_path.clone(), false) - .context(format!("loading {e:?}")) - }) - .into_iter() - .collect::>>()?; - - Ok(Node::Directory(Arc::new(Directory { - lib_path, - children, - data, - identifier, - })) - .into()) - } else if path.is_file() { - let mpath = path.clone().with_extension("metadata.json"); - let datafile = File::open(mpath.clone()) - .context(format!("metadata missing, tried path {mpath:?}"))?; - let data: ItemInfo = serde_json::from_reader(datafile).context("invalid metadata")?; - let identifier = path - .with_extension("") - .file_name() - .unwrap() - .to_str() - .unwrap() - .to_string(); - Ok(Node::Item(Arc::new(Item { - lib_path: lib_path.join(identifier.clone()), - data, - identifier, - })) - .into()) - } else { - bail!("did somebody really put a fifo or socket in the library?!") - } - } -} -impl Item { - pub fn path(&self) -> String { - self.lib_path.to_str().unwrap().to_string() - } -} -impl Directory { - pub fn path(&self) -> String { - self.lib_path.to_str().unwrap().to_string() - } - pub fn child_by_ident(&self, i: &str) -> Option> { - self.children - .iter() - .find(|e| e.identifier() == i) - .map(|e| e.to_owned()) - } -} -- cgit v1.2.3-70-g09d2