dbc_rs/extended_multiplexing/builder/
build.rs1use super::ExtendedMultiplexingBuilder;
2use crate::{
3 Error, ExtendedMultiplexing, Result,
4 compat::{Vec as CompatVec, validate_name},
5};
6
7impl ExtendedMultiplexingBuilder {
8 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 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}