reifydb_sub_server_admin/
factory.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later
3
4//! Factory for creating admin subsystem instances.
5
6use reifydb_core::ioc::IocContainer;
7use reifydb_engine::{StandardCommandTransaction, StandardEngine};
8use reifydb_sub_api::{Subsystem, SubsystemFactory};
9use reifydb_sub_server::SharedRuntime;
10
11use crate::{config::AdminConfig, state::AdminState, subsystem::AdminSubsystem};
12
13/// Factory for creating admin subsystem instances.
14pub struct AdminSubsystemFactory {
15	config: AdminConfig,
16}
17
18impl AdminSubsystemFactory {
19	/// Create a new admin subsystem factory with the given configuration.
20	pub fn new(config: AdminConfig) -> Self {
21		Self {
22			config,
23		}
24	}
25}
26
27impl SubsystemFactory<StandardCommandTransaction> for AdminSubsystemFactory {
28	fn create(self: Box<Self>, ioc: &IocContainer) -> reifydb_type::Result<Box<dyn Subsystem>> {
29		let engine = ioc.resolve::<StandardEngine>()?;
30
31		// Use provided runtime or create a default one
32		let runtime = self.config.runtime.unwrap_or_else(SharedRuntime::default);
33
34		// Create admin state from config
35		let state = AdminState::new(
36			engine,
37			self.config.max_connections,
38			self.config.request_timeout,
39			self.config.auth_required,
40			self.config.auth_token.clone(),
41		);
42
43		// Create subsystem with runtime ownership
44		let subsystem = AdminSubsystem::new(self.config.bind_addr.clone(), state, runtime);
45
46		Ok(Box::new(subsystem))
47	}
48}