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