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 pub fn file_accessor(&self) -> &F {
61 &self.puffin_file_accessor
62 }
63}
64
65#[async_trait]
66impl<S, F> PuffinManager for FsPuffinManager<S, F>
67where
68 F: PuffinFileAccessor + Clone,
69 S: Stager<FileHandle = F::FileHandle> + Clone + 'static,
70{
71 type Reader = FsPuffinReader<S, F>;
72 type Writer = FsPuffinWriter<S, F::Writer>;
73 type FileHandle = F::FileHandle;
74
75 async fn reader(&self, handle: &Self::FileHandle) -> Result<Self::Reader> {
76 Ok(FsPuffinReader::new(
77 handle.clone(),
78 self.stager.clone(),
79 self.puffin_file_accessor.clone(),
80 self.puffin_metadata_cache.clone(),
81 ))
82 }
83
84 async fn writer(&self, handle: &Self::FileHandle) -> Result<Self::Writer> {
85 let writer = self.puffin_file_accessor.writer(handle).await?;
86 Ok(FsPuffinWriter::new(
87 handle.clone(),
88 self.stager.clone(),
89 writer,
90 ))
91 }
92}