reifydb_sub_flow/subsystem/
factory.rs1use reifydb_core::util::ioc::IocContainer;
5use reifydb_engine::engine::StandardEngine;
6use reifydb_sub_api::subsystem::{Subsystem, SubsystemFactory};
7use reifydb_transaction::interceptor::builder::InterceptorBuilder;
8use reifydb_type::Result;
9
10use super::FlowSubsystem;
11use crate::builder::FlowBuilder;
12
13pub type FlowConfigurator = Box<dyn FnOnce(FlowBuilder) -> FlowBuilder + Send>;
15
16pub struct FlowSubsystemFactory {
18 configurator: Option<FlowConfigurator>,
19}
20
21impl FlowSubsystemFactory {
22 pub fn new() -> Self {
23 Self {
24 configurator: None,
25 }
26 }
27
28 pub fn with_configurator<F>(configurator: F) -> Self
29 where
30 F: FnOnce(FlowBuilder) -> FlowBuilder + Send + 'static,
31 {
32 Self {
33 configurator: Some(Box::new(configurator)),
34 }
35 }
36}
37
38impl Default for FlowSubsystemFactory {
39 fn default() -> Self {
40 Self::new()
41 }
42}
43
44impl SubsystemFactory for FlowSubsystemFactory {
45 fn provide_interceptors(&self, builder: InterceptorBuilder, _ioc: &IocContainer) -> InterceptorBuilder {
46 builder
48 }
49
50 fn create(self: Box<Self>, ioc: &IocContainer) -> Result<Box<dyn Subsystem>> {
51 let engine = ioc.resolve::<StandardEngine>()?;
52
53 let config = if let Some(configurator) = self.configurator {
55 configurator(FlowBuilder::new()).build_config()
56 } else {
57 FlowBuilder::new().build_config()
58 };
59
60 Ok(Box::new(FlowSubsystem::new(config, engine, ioc)))
61 }
62}