use reifydb_core::util::ioc::IocContainer;
use reifydb_engine::engine::StandardEngine;
use reifydb_sub_api::subsystem::{Subsystem, SubsystemFactory};
use reifydb_transaction::interceptor::builder::InterceptorBuilder;
use reifydb_type::Result;
use super::FlowSubsystem;
use crate::builder::FlowBuilder;
pub type FlowConfigurator = Box<dyn FnOnce(FlowBuilder) -> FlowBuilder + Send>;
pub struct FlowSubsystemFactory {
configurator: Option<FlowConfigurator>,
}
impl FlowSubsystemFactory {
pub fn new() -> Self {
Self {
configurator: None,
}
}
pub fn with_configurator<F>(configurator: F) -> Self
where
F: FnOnce(FlowBuilder) -> FlowBuilder + Send + 'static,
{
Self {
configurator: Some(Box::new(configurator)),
}
}
}
impl Default for FlowSubsystemFactory {
fn default() -> Self {
Self::new()
}
}
impl SubsystemFactory for FlowSubsystemFactory {
fn provide_interceptors(&self, builder: InterceptorBuilder, _ioc: &IocContainer) -> InterceptorBuilder {
builder
}
fn create(self: Box<Self>, ioc: &IocContainer) -> Result<Box<dyn Subsystem>> {
let engine = ioc.resolve::<StandardEngine>()?;
let config = if let Some(configurator) = self.configurator {
configurator(FlowBuilder::new()).build_config()
} else {
FlowBuilder::new().build_config()
};
Ok(Box::new(FlowSubsystem::new(config, engine, ioc)))
}
}