dbc_rs/value_descriptions/builder/
impls.rs1use super::ValueDescriptionsBuilder;
2use crate::MAX_VALUE_DESCRIPTIONS;
3use std::vec::Vec;
4
5impl ValueDescriptionsBuilder {
6 pub fn new() -> Self {
16 Self {
17 entries: Vec::new(),
18 }
19 }
20
21 #[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}