dbc_rs/extended_multiplexing/builder/
build.rs

1use super::ExtendedMultiplexingBuilder;
2use crate::{
3    Error, ExtendedMultiplexing, Result,
4    compat::{Vec as CompatVec, validate_name},
5};
6
7impl ExtendedMultiplexingBuilder {
8    /// Builds the `ExtendedMultiplexing` from the builder configuration.
9    ///
10    /// This validates that all required fields have been set and constructs an
11    /// `ExtendedMultiplexing` instance.
12    ///
13    /// # Returns
14    ///
15    /// Returns `Ok(ExtendedMultiplexing)` if successful, or `Err(Error)` if:
16    /// - message_id is not set
17    /// - signal_name is not set or invalid
18    /// - multiplexer_switch is not set or invalid
19    /// - No value ranges have been added
20    /// - Any name exceeds MAX_NAME_SIZE
21    ///
22    /// # Examples
23    ///
24    /// ```rust,no_run
25    /// use dbc_rs::ExtendedMultiplexingBuilder;
26    ///
27    /// let ext_mux = ExtendedMultiplexingBuilder::new()
28    ///     .message_id(500)
29    ///     .signal_name("Signal_A")
30    ///     .multiplexer_switch("Mux1")
31    ///     .add_value_range(0, 5)
32    ///     .build()?;
33    /// # Ok::<(), dbc_rs::Error>(())
34    /// ```
35    ///
36    /// # Errors
37    ///
38    /// ```rust,no_run
39    /// use dbc_rs::ExtendedMultiplexingBuilder;
40    ///
41    /// // Missing message_id
42    /// let result = ExtendedMultiplexingBuilder::new()
43    ///     .signal_name("Signal_A")
44    ///     .multiplexer_switch("Mux1")
45    ///     .add_value_range(0, 5)
46    ///     .build();
47    /// assert!(result.is_err());
48    ///
49    /// // Missing value ranges
50    /// let result = ExtendedMultiplexingBuilder::new()
51    ///     .message_id(500)
52    ///     .signal_name("Signal_A")
53    ///     .multiplexer_switch("Mux1")
54    ///     .build();
55    /// assert!(result.is_err());
56    /// # Ok::<(), dbc_rs::Error>(())
57    /// ```
58    pub fn build(self) -> Result<ExtendedMultiplexing> {
59        let message_id =
60            self.message_id.ok_or_else(|| Error::expected("message_id is required"))?;
61
62        let signal_name_str =
63            self.signal_name.ok_or_else(|| Error::expected("signal_name is required"))?;
64        let signal_name = validate_name(&signal_name_str)
65            .map_err(|_| Error::expected(Error::MAX_NAME_SIZE_EXCEEDED))?;
66
67        let multiplexer_switch_str = self
68            .multiplexer_switch
69            .ok_or_else(|| Error::expected("multiplexer_switch is required"))?;
70        let multiplexer_switch = validate_name(&multiplexer_switch_str)
71            .map_err(|_| Error::expected(Error::MAX_NAME_SIZE_EXCEEDED))?;
72
73        if self.value_ranges.is_empty() {
74            return Err(Error::expected("at least one value range is required"));
75        }
76
77        // Convert std::vec::Vec to compat::Vec
78        let mut value_ranges: CompatVec<(u64, u64), 64> = CompatVec::new();
79        for (min, max) in self.value_ranges {
80            value_ranges
81                .push((min, max))
82                .map_err(|_| Error::expected("too many value ranges (maximum 64)"))?;
83        }
84
85        Ok(ExtendedMultiplexing::new(
86            message_id,
87            signal_name,
88            multiplexer_switch,
89            value_ranges,
90        ))
91    }
92}
93
94#[cfg(test)]
95mod tests {
96    use super::ExtendedMultiplexingBuilder;
97
98    #[test]
99    fn test_extended_multiplexing_builder_basic() {
100        let ext_mux = ExtendedMultiplexingBuilder::new()
101            .message_id(500)
102            .signal_name("Signal_A")
103            .multiplexer_switch("Mux1")
104            .add_value_range(0, 5)
105            .build()
106            .unwrap();
107
108        assert_eq!(ext_mux.message_id(), 500);
109        assert_eq!(ext_mux.signal_name(), "Signal_A");
110        assert_eq!(ext_mux.multiplexer_switch(), "Mux1");
111        assert_eq!(ext_mux.value_ranges(), &[(0, 5)]);
112    }
113
114    #[test]
115    fn test_extended_multiplexing_builder_missing_message_id() {
116        let result = ExtendedMultiplexingBuilder::new()
117            .signal_name("Signal_A")
118            .multiplexer_switch("Mux1")
119            .add_value_range(0, 5)
120            .build();
121        assert!(result.is_err());
122    }
123
124    #[test]
125    fn test_extended_multiplexing_builder_missing_signal_name() {
126        let result = ExtendedMultiplexingBuilder::new()
127            .message_id(500)
128            .multiplexer_switch("Mux1")
129            .add_value_range(0, 5)
130            .build();
131        assert!(result.is_err());
132    }
133
134    #[test]
135    fn test_extended_multiplexing_builder_missing_multiplexer_switch() {
136        let result = ExtendedMultiplexingBuilder::new()
137            .message_id(500)
138            .signal_name("Signal_A")
139            .add_value_range(0, 5)
140            .build();
141        assert!(result.is_err());
142    }
143
144    #[test]
145    fn test_extended_multiplexing_builder_no_value_ranges() {
146        let result = ExtendedMultiplexingBuilder::new()
147            .message_id(500)
148            .signal_name("Signal_A")
149            .multiplexer_switch("Mux1")
150            .build();
151        assert!(result.is_err());
152    }
153}