Add futures depth matching and mod loader

This commit is contained in:
boris
2026-04-23 21:51:45 -07:00
parent ed8ac385e4
commit 895aee1388
7 changed files with 537 additions and 20 deletions

View File

@@ -9,6 +9,65 @@ pub trait BacktestProcessMod {
fn install(&mut self, bus: &mut ProcessEventBus);
}
#[derive(Default)]
pub struct BacktestProcessModLoader {
modules: Vec<Box<dyn BacktestProcessMod>>,
}
impl BacktestProcessModLoader {
pub fn new() -> Self {
Self::default()
}
pub fn register<M>(&mut self, module: M)
where
M: BacktestProcessMod + 'static,
{
self.modules.push(Box::new(module));
}
pub fn module_names(&self) -> Vec<String> {
self.modules
.iter()
.map(|module| module.name().to_string())
.collect()
}
pub fn install_all(&mut self, bus: &mut ProcessEventBus) -> Vec<String> {
self.modules
.iter_mut()
.map(|module| {
let name = module.name().to_string();
module.install(bus);
name
})
.collect()
}
pub fn install_enabled(
&mut self,
bus: &mut ProcessEventBus,
enabled_names: &[String],
) -> Vec<String> {
if enabled_names.is_empty() {
return self.install_all(bus);
}
self.modules
.iter_mut()
.filter(|module| {
enabled_names
.iter()
.any(|name| name.eq_ignore_ascii_case(module.name()))
})
.map(|module| {
let name = module.name().to_string();
module.install(bus);
name
})
.collect()
}
}
#[derive(Default)]
pub struct ProcessEventBus {
listeners: BTreeMap<ProcessEventKind, Vec<ProcessEventListener>>,
@@ -54,6 +113,18 @@ impl ProcessEventBus {
module.install(self);
}
pub fn install_mod_loader(&mut self, loader: &mut BacktestProcessModLoader) -> Vec<String> {
loader.install_all(self)
}
pub fn install_enabled_mods(
&mut self,
loader: &mut BacktestProcessModLoader,
enabled_names: &[String],
) -> Vec<String> {
loader.install_enabled(self, enabled_names)
}
pub fn publish(&mut self, event: &ProcessEvent) {
if let Some(listeners) = self.listeners.get_mut(&event.kind) {
for listener in listeners {