Skip to main content

motorcortex_rust/client/
parameter_tree.rs

1use crate::msg::{ParameterInfo, ParameterTreeMsg, ParameterType, StatusCode};
2use std::collections::HashMap;
3
4pub type ParameterMap = HashMap<String, ParameterInfo>;
5#[derive(Debug)]
6pub struct ParameterTree {
7    parameter_map: ParameterMap, // Key-value pairs for
8}
9
10impl Default for ParameterTree {
11    fn default() -> Self {
12        Self {
13            parameter_map: HashMap::new(),
14        }
15    }
16}
17
18impl ParameterTree {
19    pub fn new() -> Self {
20        Self::default()
21    }
22
23    pub fn from_message(msg: ParameterTreeMsg) -> Option<Self> {
24        if msg.status != StatusCode::Ok as i32 {
25            return None;
26        }
27
28        let parameter_map: ParameterMap = msg
29            .params
30            .into_iter()
31            .map(|param_info| (param_info.path.clone(), param_info))
32            .collect();
33
34        Some(ParameterTree { parameter_map })
35    }
36
37    pub fn get_parameter_info(&self, parameter_path: &str) -> Option<&ParameterInfo> {
38        self.parameter_map.get(parameter_path)
39    }
40
41    pub fn get_parameter_data_type(&self, parameter_path: &str) -> Option<u32> {
42        self.parameter_map
43            .get(parameter_path)
44            .map(|param_info| param_info.data_type)
45    }
46
47    pub fn has_parameter(&self, parameter_path: &str) -> bool {
48        self.parameter_map.contains_key(parameter_path)
49    }
50
51    /// Returns an iterator over all parameter leaves (param_type == Parameter).
52    pub fn parameters(&self) -> impl Iterator<Item = (&str, &ParameterInfo)> {
53        self.parameter_map
54            .iter()
55            .filter(|(_, info)| info.param_type == ParameterType::Parameter as i32)
56            .map(|(path, info)| (path.as_str(), info))
57    }
58}