dbc_rs/value_descriptions/
core.rs

1use super::ValueDescriptions;
2use std::{string::String, vec::Vec};
3
4use crate::MAX_VALUE_DESCRIPTIONS;
5
6impl ValueDescriptions {
7    /// Create ValueDescriptions from a slice of (value, description) pairs
8    pub(crate) fn from_slice(entries: &[(u64, String)]) -> Self {
9        let count = entries.len().min(MAX_VALUE_DESCRIPTIONS);
10        let vec_entries: Vec<(u64, String)> =
11            entries.iter().take(count).map(|(value, desc)| (*value, desc.clone())).collect();
12        Self {
13            entries: vec_entries,
14        }
15    }
16
17    /// Get the description for a numeric value
18    ///
19    /// # Examples
20    ///
21    /// ```rust,no_run
22    /// # use dbc_rs::Dbc;
23    /// # let dbc = Dbc::parse(r#"VERSION "1.0"\n\nBU_: ECM\n\nBO_ 100 Engine : 8 ECM\n SG_ Gear : 0|8@1+ (1,0) [0|5] "" *\n\nVAL_ 100 Gear 0 "Park" 1 "Reverse" ;"#)?;
24    /// # let message = dbc.messages().iter().next().unwrap();
25    /// # let signal = message.signals().iter().next().unwrap();
26    /// if let Some(value_descriptions) = dbc.value_descriptions_for_signal(message.id(), signal.name()) {
27    ///     if let Some(desc) = value_descriptions.get(0) {
28    ///         println!("Value 0: {}", desc);
29    ///     }
30    /// }
31    /// # Ok::<(), dbc_rs::Error>(())
32    /// ```
33    #[must_use]
34    pub fn get(&self, value: u64) -> Option<&str> {
35        for (v, desc) in &self.entries {
36            if *v == value {
37                return Some(desc.as_ref());
38            }
39        }
40        None
41    }
42
43    /// Get the number of value descriptions
44    #[must_use]
45    pub fn len(&self) -> usize {
46        self.entries.len()
47    }
48
49    /// Check if there are any value descriptions
50    #[must_use]
51    pub fn is_empty(&self) -> bool {
52        self.entries.is_empty()
53    }
54
55    /// Iterate over all value descriptions
56    ///
57    /// # Examples
58    ///
59    /// ```rust,no_run
60    /// # use dbc_rs::Dbc;
61    /// # let dbc = Dbc::parse(r#"VERSION "1.0"\n\nBU_: ECM\n\nBO_ 100 Engine : 8 ECM\n SG_ Gear : 0|8@1+ (1,0) [0|5] "" *\n\nVAL_ 100 Gear 0 "Park" 1 "Reverse" ;"#)?;
62    /// # let message = dbc.messages().iter().next().unwrap();
63    /// # let signal = message.signals().iter().next().unwrap();
64    /// if let Some(value_descriptions) = dbc.value_descriptions_for_signal(message.id(), signal.name()) {
65    ///     for (value, description) in value_descriptions.iter() {
66    ///         println!("{} -> {}", value, description);
67    ///     }
68    /// }
69    /// # Ok::<(), dbc_rs::Error>(())
70    /// ```
71    pub fn iter(&self) -> ValueDescriptionsIter<'_> {
72        ValueDescriptionsIter {
73            entries: &self.entries,
74            pos: 0,
75        }
76    }
77}
78
79/// Iterator over value descriptions
80pub struct ValueDescriptionsIter<'a> {
81    entries: &'a [(u64, String)],
82    pos: usize,
83}
84
85impl<'a> Iterator for ValueDescriptionsIter<'a> {
86    type Item = (u64, String);
87
88    fn next(&mut self) -> Option<Self::Item> {
89        if self.pos < self.entries.len() {
90            let entry = &self.entries[self.pos];
91            let result = (entry.0, entry.1.clone());
92            self.pos += 1;
93            Some(result)
94        } else {
95            None
96        }
97    }
98}