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