use std::collections::HashMap;
use crate::engines::graph::GraphEngine;
use crate::engines::graph::flux::FluxLayeredEngine;
use crate::engines::graph::mermaid::MermaidLayeredEngine;
use crate::engines::graph::selection::EngineAlgorithmId;
type BoxedGraphSolver = Box<dyn GraphEngine>;
pub struct GraphEngineRegistry {
solvers: HashMap<EngineAlgorithmId, BoxedGraphSolver>,
}
impl GraphEngineRegistry {
pub fn get_solver(&self, id: EngineAlgorithmId) -> Option<&dyn GraphEngine> {
self.solvers.get(&id).map(|e| e.as_ref())
}
pub fn register_solver(&mut self, id: EngineAlgorithmId, engine: BoxedGraphSolver) {
self.solvers.insert(id, engine);
}
}
impl Default for GraphEngineRegistry {
fn default() -> Self {
let mut registry = Self {
solvers: HashMap::new(),
};
registry.register_solver(
EngineAlgorithmId::FLUX_LAYERED,
Box::new(FluxLayeredEngine::text()),
);
registry.register_solver(
EngineAlgorithmId::MERMAID_LAYERED,
Box::new(MermaidLayeredEngine::new()),
);
registry
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_registry_has_flux_layered_solver() {
let registry = GraphEngineRegistry::default();
let id = EngineAlgorithmId::FLUX_LAYERED;
let solver = registry.get_solver(id);
assert!(solver.is_some());
assert_eq!(solver.unwrap().id().to_string(), "flux-layered");
}
#[test]
fn default_registry_has_mermaid_layered_solver() {
let registry = GraphEngineRegistry::default();
let id = EngineAlgorithmId::MERMAID_LAYERED;
let solver = registry.get_solver(id);
assert!(solver.is_some());
assert_eq!(solver.unwrap().id().to_string(), "mermaid-layered");
}
}