dbc_rs/value_descriptions/builder/
impls.rs

1use super::ValueDescriptionsBuilder;
2use crate::MAX_VALUE_DESCRIPTIONS;
3use std::vec::Vec;
4
5impl ValueDescriptionsBuilder {
6    /// Creates a new `ValueDescriptionsBuilder` with an empty entry list.
7    ///
8    /// # Examples
9    ///
10    /// ```rust,no_run
11    /// use dbc_rs::ValueDescriptionsBuilder;
12    ///
13    /// let builder = ValueDescriptionsBuilder::new();
14    /// ```
15    pub fn new() -> Self {
16        Self {
17            entries: Vec::new(),
18        }
19    }
20
21    /// Adds a value-description pair to the builder.
22    ///
23    /// # Arguments
24    ///
25    /// * `value` - The numeric value (u64)
26    /// * `description` - The human-readable description
27    ///
28    /// # Examples
29    ///
30    /// ```rust,no_run
31    /// use dbc_rs::ValueDescriptionsBuilder;
32    ///
33    /// let builder = ValueDescriptionsBuilder::new()
34    ///     .add_entry(0, "Off")
35    ///     .add_entry(1, "On");
36    /// # Ok::<(), dbc_rs::Error>(())
37    /// ```
38    #[must_use = "builder method returns modified builder"]
39    pub fn add_entry(mut self, value: u64, description: impl AsRef<str>) -> Self {
40        if self.entries.len() < MAX_VALUE_DESCRIPTIONS {
41            self.entries.push((value, description.as_ref().to_string()));
42        }
43        self
44    }
45}
46
47impl Default for ValueDescriptionsBuilder {
48    fn default() -> Self {
49        Self::new()
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn test_builder_add_entry() {
59        let vd = ValueDescriptionsBuilder::new()
60            .add_entry(0, "Off")
61            .add_entry(1, "On")
62            .build()
63            .unwrap();
64
65        assert_eq!(vd.len(), 2);
66        assert_eq!(vd.get(0), Some("Off"));
67        assert_eq!(vd.get(1), Some("On"));
68    }
69
70    #[test]
71    fn test_builder_multiple_entries() {
72        let vd = ValueDescriptionsBuilder::new()
73            .add_entry(0, "Park")
74            .add_entry(1, "Reverse")
75            .add_entry(2, "Neutral")
76            .add_entry(3, "Drive")
77            .add_entry(4, "Low")
78            .build()
79            .unwrap();
80
81        assert_eq!(vd.len(), 5);
82        assert_eq!(vd.get(0), Some("Park"));
83        assert_eq!(vd.get(4), Some("Low"));
84    }
85
86    #[test]
87    fn test_builder_non_sequential_values() {
88        let vd = ValueDescriptionsBuilder::new()
89            .add_entry(0, "Zero")
90            .add_entry(10, "Ten")
91            .add_entry(100, "Hundred")
92            .build()
93            .unwrap();
94
95        assert_eq!(vd.len(), 3);
96        assert_eq!(vd.get(0), Some("Zero"));
97        assert_eq!(vd.get(10), Some("Ten"));
98        assert_eq!(vd.get(100), Some("Hundred"));
99        assert_eq!(vd.get(5), None);
100    }
101
102    #[test]
103    fn test_builder_large_values() {
104        let vd = ValueDescriptionsBuilder::new()
105            .add_entry(u64::MAX, "Max")
106            .add_entry(0, "Min")
107            .build()
108            .unwrap();
109
110        assert_eq!(vd.len(), 2);
111        assert_eq!(vd.get(u64::MAX), Some("Max"));
112        assert_eq!(vd.get(0), Some("Min"));
113    }
114}