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}