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::FlowBuilder;
12
13/// Configuration function for the flow subsystem
14pub type FlowConfigurator = Box<dyn FnOnce(FlowBuilder) -> FlowBuilder + Send>;
15
16/// Factory for creating FlowSubsystem with proper interceptor registration
17pub 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		// Independent flow consumer doesn't need interceptors
47		builder
48	}
49
50	fn create(self: Box<Self>, ioc: &IocContainer) -> Result<Box<dyn Subsystem>> {
51		let engine = ioc.resolve::<StandardEngine>()?;
52
53		// Extract full config from builder
54		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}