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