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::FlowConfigurator;
12
13pub struct FlowSubsystemFactory {
15 configurator: Option<Box<dyn FnOnce(FlowConfigurator) -> FlowConfigurator + Send>>,
16}
17
18impl FlowSubsystemFactory {
19 pub fn new() -> Self {
20 Self {
21 configurator: None,
22 }
23 }
24
25 pub fn with_configurator<F>(configurator: F) -> Self
26 where
27 F: FnOnce(FlowConfigurator) -> FlowConfigurator + Send + 'static,
28 {
29 Self {
30 configurator: Some(Box::new(configurator)),
31 }
32 }
33}
34
35impl Default for FlowSubsystemFactory {
36 fn default() -> Self {
37 Self::new()
38 }
39}
40
41impl SubsystemFactory for FlowSubsystemFactory {
42 fn provide_interceptors(&self, builder: InterceptorBuilder, _ioc: &IocContainer) -> InterceptorBuilder {
43 builder
45 }
46
47 fn create(self: Box<Self>, ioc: &IocContainer) -> Result<Box<dyn Subsystem>> {
48 let engine = ioc.resolve::<StandardEngine>()?;
49
50 let config = if let Some(configure_fn) = self.configurator {
51 configure_fn(FlowConfigurator::new()).configure()
52 } else {
53 FlowConfigurator::new().configure()
54 };
55
56 Ok(Box::new(FlowSubsystem::new(config, engine, ioc)))
57 }
58}