use super::plugin::TraversalPlugin;
use super::traversal_output_format::TraversalOutputFormat;
use crate::app::search::SummaryOp;
use crate::{
app::compass::CompassComponentError,
plugin::{
output::{OutputPlugin, OutputPluginBuilder},
PluginError,
},
};
use routee_compass_core::config::ConfigJsonExtensions;
use std::collections::HashMap;
use std::sync::Arc;
pub struct TraversalPluginBuilder {}
impl OutputPluginBuilder for TraversalPluginBuilder {
fn build(
&self,
parameters: &serde_json::Value,
) -> Result<Arc<dyn OutputPlugin>, CompassComponentError> {
let parent_key = String::from("traversal");
let route: Option<TraversalOutputFormat> =
parameters.get_config_serde_optional(&"route", &parent_key)?;
let tree: Option<TraversalOutputFormat> =
parameters.get_config_serde_optional(&"tree", &parent_key)?;
let summary_ops: HashMap<String, SummaryOp> = parameters
.get_config_serde_optional(&"summary_ops", &parent_key)?
.unwrap_or_default();
let geom_plugin = TraversalPlugin::new(route, tree, summary_ops)
.map_err(|e| PluginError::OutputPluginFailed { source: e })?;
Ok(Arc::new(geom_plugin))
}
}