s3sync/callback/
preprocess_manager.rs1use crate::types::preprocess_callback::{PreprocessCallback, UploadMetadata};
2use anyhow::Result;
3use aws_sdk_s3::operation::get_object::GetObjectOutput;
4use std::fmt;
5use std::sync::Arc;
6use tokio::sync::Mutex;
7
8#[derive(Clone)]
9pub struct PreprocessManager {
10 pub preprocess_callback: Option<Arc<Mutex<Box<dyn PreprocessCallback + Send + Sync>>>>,
11}
12
13impl Default for PreprocessManager {
15 fn default() -> Self {
17 Self::new()
19 }
20}
21impl PreprocessManager {
22 pub fn new() -> Self {
23 Self {
24 preprocess_callback: None,
25 }
26 }
27
28 pub fn register_callback<T: PreprocessCallback + Send + Sync + 'static>(
29 &mut self,
30 callback: T,
31 ) {
32 self.preprocess_callback = Some(Arc::new(Mutex::new(Box::new(callback))));
33 }
34
35 pub fn is_callback_registered(&self) -> bool {
36 self.preprocess_callback.is_some()
37 }
38
39 pub async fn execute_preprocessing(
40 &mut self,
41 key: &str,
42 source: &GetObjectOutput,
43 metadata: &mut UploadMetadata,
44 ) -> Result<()> {
45 if let Some(callback) = &self.preprocess_callback {
46 callback
47 .lock()
48 .await
49 .preprocess_before_upload(key, source, metadata)
50 .await?;
51 }
52 Ok(())
53 }
54}
55
56impl fmt::Debug for PreprocessManager {
57 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
58 f.debug_struct("PreprocessManager")
59 .field("preprocess_callback", &self.preprocess_callback.is_some())
60 .finish()
61 }
62}
63
64#[cfg(test)]
65mod tests {
66 use super::*;
67
68 #[tokio::test]
69 async fn create_preprocess_manager() {
70 let preprocess_manager = PreprocessManager::new();
72 assert!(!preprocess_manager.is_callback_registered());
73 println!("{:?}", preprocess_manager);
74
75 let preprocess_manager = PreprocessManager::default();
76 assert!(!preprocess_manager.is_callback_registered());
77 }
78}