puffin/puffin_manager/
fs_puffin_manager.rs1mod dir_meta;
16mod reader;
17mod writer;
18
19use async_trait::async_trait;
20pub use reader::FsPuffinReader;
21pub use writer::FsPuffinWriter;
22
23use crate::error::Result;
24use crate::puffin_manager::PuffinManager;
25use crate::puffin_manager::cache::PuffinMetadataCacheRef;
26use crate::puffin_manager::file_accessor::PuffinFileAccessor;
27use crate::puffin_manager::stager::Stager;
28
29#[derive(Clone)]
31pub struct FsPuffinManager<S, F> {
32    stager: S,
34    puffin_file_accessor: F,
36    puffin_metadata_cache: Option<PuffinMetadataCacheRef>,
38}
39
40impl<S, F> FsPuffinManager<S, F> {
41    pub fn new(stager: S, puffin_file_accessor: F) -> Self {
44        Self {
45            stager,
46            puffin_file_accessor,
47            puffin_metadata_cache: None,
48        }
49    }
50
51    pub fn with_puffin_metadata_cache(
53        mut self,
54        puffin_metadata_cache: Option<PuffinMetadataCacheRef>,
55    ) -> Self {
56        self.puffin_metadata_cache = puffin_metadata_cache;
57        self
58    }
59}
60
61#[async_trait]
62impl<S, F> PuffinManager for FsPuffinManager<S, F>
63where
64    F: PuffinFileAccessor + Clone,
65    S: Stager<FileHandle = F::FileHandle> + Clone + 'static,
66{
67    type Reader = FsPuffinReader<S, F>;
68    type Writer = FsPuffinWriter<S, F::Writer>;
69    type FileHandle = F::FileHandle;
70
71    async fn reader(&self, handle: &Self::FileHandle) -> Result<Self::Reader> {
72        Ok(FsPuffinReader::new(
73            handle.clone(),
74            self.stager.clone(),
75            self.puffin_file_accessor.clone(),
76            self.puffin_metadata_cache.clone(),
77        ))
78    }
79
80    async fn writer(&self, handle: &Self::FileHandle) -> Result<Self::Writer> {
81        let writer = self.puffin_file_accessor.writer(handle).await?;
82        Ok(FsPuffinWriter::new(
83            handle.clone(),
84            self.stager.clone(),
85            writer,
86        ))
87    }
88}