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::file_key::PuffinFileKey;
28use crate::puffin_manager::stager::Stager;
29
30#[derive(Clone)]
32pub struct FsPuffinManager<S, F> {
33 stager: S,
35 puffin_file_accessor: F,
37 puffin_metadata_cache: Option<PuffinMetadataCacheRef>,
39}
40
41impl<S, F> FsPuffinManager<S, F> {
42 pub fn new(stager: S, puffin_file_accessor: F) -> Self {
45 Self {
46 stager,
47 puffin_file_accessor,
48 puffin_metadata_cache: None,
49 }
50 }
51
52 pub fn with_puffin_metadata_cache(
54 mut self,
55 puffin_metadata_cache: Option<PuffinMetadataCacheRef>,
56 ) -> Self {
57 self.puffin_metadata_cache = puffin_metadata_cache;
58 self
59 }
60
61 pub fn file_accessor(&self) -> &F {
62 &self.puffin_file_accessor
63 }
64}
65
66#[async_trait]
67impl<S, F> PuffinManager for FsPuffinManager<S, F>
68where
69 F: PuffinFileAccessor + Clone,
70 S: Stager<FileHandle = F::FileHandle> + Clone + 'static,
71{
72 type Reader = FsPuffinReader<S, F>;
73 type Writer = FsPuffinWriter<S, F::Writer>;
74 type FileHandle = F::FileHandle;
75
76 fn file_key(&self, handle: &Self::FileHandle) -> PuffinFileKey<Self::FileHandle> {
77 self.puffin_file_accessor.file_key(handle)
78 }
79
80 async fn reader(&self, handle: &Self::FileHandle) -> Result<Self::Reader> {
81 Ok(FsPuffinReader::new(
82 handle.clone(),
83 self.stager.clone(),
84 self.puffin_file_accessor.clone(),
85 self.puffin_metadata_cache.clone(),
86 ))
87 }
88
89 async fn writer(&self, handle: &Self::FileHandle) -> Result<Self::Writer> {
90 let writer = self.puffin_file_accessor.writer(handle).await?;
91 Ok(FsPuffinWriter::new(
92 handle.clone(),
93 self.stager.clone(),
94 writer,
95 ))
96 }
97}