Skip to main content

s3sync/callback/
preprocess_manager.rs

1use 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
13// RS-A1008 is not applicable here as this is an intentional implementation
14impl Default for PreprocessManager {
15    // skipcq: RS-A1008
16    fn default() -> Self {
17        // skipcq: RS-A1008
18        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        // skipcq: RS-W1079
71        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}