aboutsummaryrefslogtreecommitdiff
path: root/server/src/library.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/library.rs')
-rw-r--r--server/src/library.rs44
1 files changed, 27 insertions, 17 deletions
diff --git a/server/src/library.rs b/server/src/library.rs
index a48e746..ebafa9d 100644
--- a/server/src/library.rs
+++ b/server/src/library.rs
@@ -36,7 +36,9 @@ pub struct Item {
impl Library {
pub fn open(path: &PathBuf) -> anyhow::Result<Self> {
Ok(Self {
- root: Node::from_path(path.clone(), PathBuf::new(), true).context("indexing root")?,
+ root: Node::from_path(path.clone(), PathBuf::new(), true)
+ .context("indexing root")?
+ .ok_or(anyhow!("root need directory.json"))?,
})
}
pub fn nested_path(&self, path: &Path) -> anyhow::Result<Arc<Node>> {
@@ -86,9 +88,12 @@ impl Node {
path: PathBuf,
mut lib_path: PathBuf,
root: bool,
- ) -> anyhow::Result<Arc<Node>> {
+ ) -> anyhow::Result<Option<Arc<Node>>> {
if path.is_dir() {
let mpath = path.join("directory.json");
+ if !mpath.exists() {
+ return Ok(None);
+ }
let data: DirectoryInfo =
serde_json::from_reader(File::open(mpath).context("metadata missing")?)?;
@@ -109,20 +114,23 @@ impl Node {
None
}
})
- .map(|e| {
+ .filter_map(|e| {
Node::from_path(e.clone(), lib_path.clone(), false)
.context(format!("loading {e:?}"))
+ .transpose()
})
.into_iter()
.collect::<anyhow::Result<Vec<_>>>()?;
- Ok(Node::Directory(Arc::new(Directory {
- lib_path,
- children,
- data,
- identifier,
- }))
- .into())
+ Ok(Some(
+ Node::Directory(Arc::new(Directory {
+ lib_path,
+ children,
+ data,
+ identifier,
+ }))
+ .into(),
+ ))
} else if path.is_file() {
info!("loading {path:?}");
let datafile = File::open(path.clone()).context("cant load metadata")?;
@@ -134,13 +142,15 @@ impl Node {
.to_str()
.unwrap()
.to_string();
- Ok(Node::Item(Arc::new(Item {
- fs_path: path.clone(),
- lib_path: lib_path.join(identifier.clone()),
- info: data,
- identifier,
- }))
- .into())
+ Ok(Some(
+ Node::Item(Arc::new(Item {
+ fs_path: path.clone(),
+ lib_path: lib_path.join(identifier.clone()),
+ info: data,
+ identifier,
+ }))
+ .into(),
+ ))
} else {
bail!("did somebody really put a fifo or socket in the library?!")
}