use crate::pipes::PipeRouter;
use crate::scheduler::Scheduler;
use crate::sources::SourceManager;
use std::sync::Arc;
#[cfg(not(feature = "tokio"))]
use std::sync::RwLock;
#[cfg(feature = "tokio")]
use tokio::sync::RwLock;
#[derive(Clone, Debug, Default)]
#[repr(C)]
pub struct Engine {
pub(crate) controller: SourceManager,
pub(crate) scheduler: Scheduler,
pub(crate) pipe_router: Arc<RwLock<PipeRouter>>,
}
impl Engine {
pub fn new() -> crate::Result<Self> {
let pipe_router = PipeRouter::new();
let controller = SourceManager::from_router(pipe_router.clone());
let scheduler = Scheduler::new();
let pipe_router = Arc::new(RwLock::new(pipe_router));
Ok(Self {
controller,
scheduler,
pipe_router,
})
}
pub const fn controller(&self) -> &SourceManager {
&self.controller
}
pub const fn controller_mut(&mut self) -> &mut SourceManager {
&mut self.controller
}
pub const fn pipe_router(&self) -> &Arc<RwLock<PipeRouter>> {
&self.pipe_router
}
pub fn pipe_router_mut(&mut self) -> Arc<RwLock<PipeRouter>> {
Arc::clone(&self.pipe_router)
}
pub const fn scheduler(&self) -> &Scheduler {
&self.scheduler
}
pub const fn scheduler_mut(&mut self) -> &mut Scheduler {
&mut self.scheduler
}
#[cfg_attr(feature = "tracing", tracing::instrument(skip_all, level = "trace"))]
pub async fn run(&self) -> crate::Result<()> {
self.scheduler().start(self.controller().clone()).await;
Ok(())
}
}