use std::sync::{Arc, Mutex, OnceLock};
use apcore::{Config, Executor, Registry};
use crate::config::get_apcore_settings;
static REGISTRY: OnceLock<Arc<Mutex<Registry>>> = OnceLock::new();
static EXECUTOR: OnceLock<Arc<tokio::sync::Mutex<Executor>>> = OnceLock::new();
pub fn get_registry() -> Arc<Mutex<Registry>> {
REGISTRY
.get_or_init(|| {
tracing::debug!("Initializing apcore Registry");
Arc::new(Mutex::new(Registry::new()))
})
.clone()
}
pub fn get_executor() -> Arc<tokio::sync::Mutex<Executor>> {
EXECUTOR
.get_or_init(|| {
tracing::debug!("Initializing apcore Executor");
let registry = Registry::new();
let config = build_config();
Arc::new(tokio::sync::Mutex::new(Executor::new(registry, config)))
})
.clone()
}
fn build_config() -> Config {
let settings = get_apcore_settings();
Config {
enable_tracing: settings.tracing,
enable_metrics: settings.metrics,
modules_path: Some(settings.module_dir.clone()),
..Config::default()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_registry_returns_same_instance() {
let r1 = get_registry();
let r2 = get_registry();
assert!(Arc::ptr_eq(&r1, &r2));
}
}