use crate::bus::MessageBus;
use crate::error::Result;
use crate::module::ModuleManager;
use crate::registry::StateRegistry;
#[derive(Clone, Debug)]
pub struct Kernel {
bus: MessageBus,
modules: ModuleManager,
registry: StateRegistry,
}
impl Kernel {
pub async fn in_memory() -> Result<Self> {
let bus = MessageBus::new();
let registry = StateRegistry::in_memory().await?;
let modules = ModuleManager::new(bus.clone());
Ok(Self {
bus,
modules,
registry,
})
}
pub async fn with_registry(path: &str) -> Result<Self> {
let bus = MessageBus::new();
let registry = StateRegistry::connect(path).await?;
let modules = ModuleManager::new(bus.clone());
Ok(Self {
bus,
modules,
registry,
})
}
pub fn bus(&self) -> &MessageBus {
&self.bus
}
pub fn modules(&self) -> &ModuleManager {
&self.modules
}
pub fn registry(&self) -> &StateRegistry {
&self.registry
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn kernel_wires_subsystems() {
let kernel = Kernel::in_memory().await.unwrap();
assert_eq!(kernel.bus().subscriber_count().await, 0);
assert!(kernel.registry().list_modules().await.unwrap().is_empty());
assert!(kernel.modules().list().await.is_empty());
}
}