snix_castore/fs/
root_nodes.rs1use std::collections::BTreeMap;
2
3use crate::nodes::Directory;
4use crate::{Node, path::PathComponent};
5use futures::StreamExt;
6use futures::stream::BoxStream;
7use tonic::async_trait;
8
9pub type Error = Box<dyn std::error::Error + Send + Sync + 'static>;
10
11#[async_trait]
14pub trait RootNodes {
15 async fn get_by_basename(&self, name: &PathComponent) -> Result<Option<Node>, Error>;
18
19 fn list(&self) -> BoxStream<'static, Result<(PathComponent, Node), Error>>;
23}
24
25#[async_trait]
26impl<T> RootNodes for T
29where
30 T: AsRef<BTreeMap<PathComponent, Node>> + Send + Sync,
31{
32 async fn get_by_basename(&self, name: &PathComponent) -> Result<Option<Node>, Error> {
33 Ok(self.as_ref().get(name).cloned())
34 }
35
36 fn list(&self) -> BoxStream<'static, Result<(PathComponent, Node), Error>> {
37 let data = self.as_ref().to_owned();
38 futures::stream::iter(data.into_iter().map(Ok)).boxed()
39 }
40}
41
42#[async_trait]
43impl RootNodes for Directory {
44 async fn get_by_basename(&self, name: &PathComponent) -> Result<Option<Node>, Error> {
45 Ok(self
46 .nodes()
47 .find(|(key, _)| *key == name)
48 .map(|(_, node)| node.clone()))
49 }
50
51 fn list(&self) -> BoxStream<'static, Result<(PathComponent, Node), Error>> {
52 let data = self.to_owned();
53 futures::stream::iter(data.into_nodes().map(Ok)).boxed()
54 }
55}