Skip to main content

reifydb_engine/transform/
registry.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright (c) 2025 ReifyDB
3
4use 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}