use crate::msg::{ParameterInfo, ParameterTreeMsg, ParameterType, StatusCode};
use std::collections::HashMap;
pub type ParameterMap = HashMap<String, ParameterInfo>;
#[derive(Debug, Default)]
pub struct ParameterTree {
parameter_map: ParameterMap, }
impl ParameterTree {
pub fn new() -> Self {
Self::default()
}
pub fn from_message(msg: ParameterTreeMsg) -> Option<Self> {
if msg.status != StatusCode::Ok as i32 {
return None;
}
let parameter_map: ParameterMap = msg
.params
.into_iter()
.map(|param_info| (param_info.path.clone(), param_info))
.collect();
Some(ParameterTree { parameter_map })
}
pub fn get_parameter_info(&self, parameter_path: &str) -> Option<&ParameterInfo> {
self.parameter_map.get(parameter_path)
}
pub fn get_parameter_data_type(&self, parameter_path: &str) -> Option<u32> {
self.parameter_map
.get(parameter_path)
.map(|param_info| param_info.data_type)
}
pub fn has_parameter(&self, parameter_path: &str) -> bool {
self.parameter_map.contains_key(parameter_path)
}
pub fn parameters(&self) -> impl Iterator<Item = (&str, &ParameterInfo)> {
self.parameter_map
.iter()
.filter(|(_, info)| info.param_type == ParameterType::Parameter as i32)
.map(|(path, info)| (path.as_str(), info))
}
}