dbc_rs/extended_multiplexing/builder/impls.rs
1use super::ExtendedMultiplexingBuilder;
2use std::vec::Vec;
3
4impl ExtendedMultiplexingBuilder {
5 /// Creates a new `ExtendedMultiplexingBuilder` with no fields set.
6 ///
7 /// # Examples
8 ///
9 /// ```rust,no_run
10 /// use dbc_rs::ExtendedMultiplexingBuilder;
11 ///
12 /// let builder = ExtendedMultiplexingBuilder::new();
13 /// // Must set message_id, signal_name, multiplexer_switch, and at least one value range before building
14 /// # Ok::<(), dbc_rs::Error>(())
15 /// ```
16 pub fn new() -> Self {
17 Self {
18 message_id: None,
19 signal_name: None,
20 multiplexer_switch: None,
21 value_ranges: Vec::new(),
22 }
23 }
24
25 /// Sets the message ID.
26 ///
27 /// # Arguments
28 ///
29 /// * `message_id` - The CAN message ID this extended multiplexing entry applies to
30 ///
31 /// # Examples
32 ///
33 /// ```rust,no_run
34 /// use dbc_rs::ExtendedMultiplexingBuilder;
35 ///
36 /// let builder = ExtendedMultiplexingBuilder::new()
37 /// .message_id(500);
38 /// # Ok::<(), dbc_rs::Error>(())
39 /// ```
40 #[must_use = "builder method returns modified builder"]
41 pub fn message_id(mut self, message_id: u32) -> Self {
42 self.message_id = Some(message_id);
43 self
44 }
45
46 /// Sets the signal name.
47 ///
48 /// # Arguments
49 ///
50 /// * `signal_name` - The name of the multiplexed signal
51 ///
52 /// # Examples
53 ///
54 /// ```rust,no_run
55 /// use dbc_rs::ExtendedMultiplexingBuilder;
56 ///
57 /// let builder = ExtendedMultiplexingBuilder::new()
58 /// .signal_name("Signal_A");
59 /// # Ok::<(), dbc_rs::Error>(())
60 /// ```
61 #[must_use = "builder method returns modified builder"]
62 pub fn signal_name(mut self, signal_name: impl AsRef<str>) -> Self {
63 self.signal_name = Some(signal_name.as_ref().to_string());
64 self
65 }
66
67 /// Sets the multiplexer switch name.
68 ///
69 /// # Arguments
70 ///
71 /// * `multiplexer_switch` - The name of the multiplexer switch signal
72 ///
73 /// # Examples
74 ///
75 /// ```rust,no_run
76 /// use dbc_rs::ExtendedMultiplexingBuilder;
77 ///
78 /// let builder = ExtendedMultiplexingBuilder::new()
79 /// .multiplexer_switch("Mux1");
80 /// # Ok::<(), dbc_rs::Error>(())
81 /// ```
82 #[must_use = "builder method returns modified builder"]
83 pub fn multiplexer_switch(mut self, multiplexer_switch: impl AsRef<str>) -> Self {
84 self.multiplexer_switch = Some(multiplexer_switch.as_ref().to_string());
85 self
86 }
87
88 /// Adds a value range to the extended multiplexing entry.
89 ///
90 /// # Arguments
91 ///
92 /// * `min` - The minimum switch value (inclusive)
93 /// * `max` - The maximum switch value (inclusive)
94 ///
95 /// # Examples
96 ///
97 /// ```rust,no_run
98 /// use dbc_rs::ExtendedMultiplexingBuilder;
99 ///
100 /// let builder = ExtendedMultiplexingBuilder::new()
101 /// .add_value_range(0, 5)
102 /// .add_value_range(10, 15);
103 /// # Ok::<(), dbc_rs::Error>(())
104 /// ```
105 #[must_use = "builder method returns modified builder"]
106 pub fn add_value_range(mut self, min: u64, max: u64) -> Self {
107 self.value_ranges.push((min, max));
108 self
109 }
110}
111
112impl Default for ExtendedMultiplexingBuilder {
113 fn default() -> Self {
114 Self::new()
115 }
116}
117
118#[cfg(test)]
119mod tests {
120 use super::ExtendedMultiplexingBuilder;
121
122 #[test]
123 fn test_extended_multiplexing_builder_multiple_ranges() {
124 let ext_mux = ExtendedMultiplexingBuilder::new()
125 .message_id(500)
126 .signal_name("Signal_A")
127 .multiplexer_switch("Mux1")
128 .add_value_range(0, 5)
129 .add_value_range(10, 15)
130 .add_value_range(20, 25)
131 .build()
132 .unwrap();
133
134 assert_eq!(ext_mux.value_ranges().len(), 3);
135 assert_eq!(ext_mux.value_ranges()[0], (0, 5));
136 assert_eq!(ext_mux.value_ranges()[1], (10, 15));
137 assert_eq!(ext_mux.value_ranges()[2], (20, 25));
138 }
139}