Skip to main content

reifydb_sub_flow/subsystem/
factory.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use 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
13/// Factory for creating FlowSubsystem with proper interceptor registration
14pub 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		// Independent flow consumer doesn't need interceptors
44		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}