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}