reifydb_engine/transform/
registry.rs1use std::{collections::HashMap, ops::Deref, sync::Arc};
5
6use super::Transform;
7
8#[derive(Clone)]
9pub struct Transforms(Arc<TransformsInner>);
10
11impl Transforms {
12 pub fn empty() -> Transforms {
13 Transforms::builder().build()
14 }
15
16 pub fn builder() -> TransformsBuilder {
17 TransformsBuilder(TransformsInner {
18 transforms: HashMap::new(),
19 })
20 }
21}
22
23impl Deref for Transforms {
24 type Target = TransformsInner;
25
26 fn deref(&self) -> &Self::Target {
27 &self.0
28 }
29}
30
31#[derive(Clone)]
32pub struct TransformsInner {
33 transforms: HashMap<String, Arc<dyn Fn() -> Box<dyn Transform> + Send + Sync>>,
34}
35
36impl TransformsInner {
37 pub fn get_transform(&self, name: &str) -> Option<Box<dyn Transform>> {
38 self.transforms.get(name).map(|func| func())
39 }
40
41 pub fn has_transform(&self, name: &str) -> bool {
42 self.transforms.contains_key(name)
43 }
44}
45
46pub struct TransformsBuilder(TransformsInner);
47
48impl TransformsBuilder {
49 pub fn register<F, T>(mut self, name: &str, init: F) -> Self
50 where
51 F: Fn() -> T + Send + Sync + 'static,
52 T: Transform + 'static,
53 {
54 self.0.transforms.insert(name.to_string(), Arc::new(move || Box::new(init()) as Box<dyn Transform>));
55
56 self
57 }
58
59 pub fn build(self) -> Transforms {
60 Transforms(Arc::new(self.0))
61 }
62}