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