dbc_rs/receivers/builder/impls.rs
1use super::ReceiversBuilder;
2use std::vec::Vec;
3
4impl ReceiversBuilder {
5 /// Creates a new `ReceiversBuilder` with default settings (no receivers).
6 ///
7 /// # Examples
8 ///
9 /// ```rust,no_run
10 /// use dbc_rs::ReceiversBuilder;
11 ///
12 /// let builder = ReceiversBuilder::new();
13 /// let receivers = builder.build()?;
14 /// assert_eq!(receivers.len(), 0);
15 /// # Ok::<(), dbc_rs::Error>(())
16 /// ```
17 pub fn new() -> Self {
18 Self { nodes: Vec::new() }
19 }
20
21 /// Sets the receiver to none (no explicit receivers).
22 ///
23 /// This clears any previously set nodes. Per DBC spec, this will
24 /// serialize as `Vector__XXX` (no specific receiver).
25 ///
26 /// # Examples
27 ///
28 /// ```rust,no_run
29 /// use dbc_rs::ReceiversBuilder;
30 ///
31 /// let receivers = ReceiversBuilder::new()
32 /// .add_node("TCM") // This will be cleared
33 /// .none()
34 /// .build()?;
35 /// assert_eq!(receivers, dbc_rs::Receivers::None);
36 /// # Ok::<(), dbc_rs::Error>(())
37 /// ```
38 #[must_use = "builder method returns modified builder"]
39 pub fn none(mut self) -> Self {
40 self.nodes.clear();
41 self
42 }
43
44 /// Adds a single receiver node.
45 ///
46 /// # Arguments
47 ///
48 /// * `node` - The node name (anything that implements `AsRef<str>`)
49 ///
50 /// # Examples
51 ///
52 /// ```rust,no_run
53 /// use dbc_rs::ReceiversBuilder;
54 ///
55 /// let receivers = ReceiversBuilder::new()
56 /// .add_node("TCM")
57 /// .add_node("BCM")
58 /// .build()?;
59 /// assert_eq!(receivers.len(), 2);
60 /// assert!(receivers.contains("TCM"));
61 /// # Ok::<(), dbc_rs::Error>(())
62 /// ```
63 #[must_use = "builder method returns modified builder"]
64 pub fn add_node(mut self, node: impl AsRef<str>) -> Self {
65 let node = node.as_ref().to_string();
66 self.nodes.push(node);
67 self
68 }
69
70 /// Adds multiple receiver nodes from an iterator.
71 ///
72 /// # Arguments
73 ///
74 /// * `nodes` - An iterator of node names (each item must implement `AsRef<str>`)
75 ///
76 /// # Examples
77 ///
78 /// ```rust,no_run
79 /// use dbc_rs::ReceiversBuilder;
80 ///
81 /// // From a slice
82 /// let receivers = ReceiversBuilder::new()
83 /// .add_nodes(&["TCM", "BCM", "ECM"])
84 /// .build()?;
85 /// assert_eq!(receivers.len(), 3);
86 ///
87 /// // From a vector
88 /// let node_vec = vec!["Node1", "Node2"];
89 /// let receivers2 = ReceiversBuilder::new()
90 /// .add_nodes(node_vec.iter())
91 /// .build()?;
92 /// assert_eq!(receivers2.len(), 2);
93 /// # Ok::<(), dbc_rs::Error>(())
94 /// ```
95 #[must_use = "builder method returns modified builder"]
96 pub fn add_nodes<I, S>(mut self, nodes: I) -> Self
97 where
98 I: IntoIterator<Item = S>,
99 S: AsRef<str>,
100 {
101 for node in nodes {
102 self = self.add_node(node);
103 }
104
105 self
106 }
107
108 /// Clears all receiver nodes and resets to default state (none).
109 ///
110 /// # Examples
111 ///
112 /// ```rust,no_run
113 /// use dbc_rs::ReceiversBuilder;
114 ///
115 /// let receivers = ReceiversBuilder::new()
116 /// .add_node("TCM")
117 /// .add_node("BCM")
118 /// .clear()
119 /// .add_node("ECM")
120 /// .build()?;
121 /// assert_eq!(receivers.len(), 1);
122 /// assert!(receivers.contains("ECM"));
123 /// assert!(!receivers.contains("TCM"));
124 /// # Ok::<(), dbc_rs::Error>(())
125 /// ```
126 #[must_use = "builder method returns modified builder"]
127 pub fn clear(mut self) -> Self {
128 self.nodes.clear();
129 self
130 }
131}
132
133impl Default for ReceiversBuilder {
134 fn default() -> Self {
135 Self::new()
136 }
137}
138
139#[cfg(test)]
140mod tests {
141 use super::*;
142 use crate::Receivers;
143
144 #[test]
145 fn test_receivers_builder_none_clears_nodes() {
146 let receivers =
147 ReceiversBuilder::new().add_node("ECM").add_node("TCM").none().build().unwrap();
148 assert_eq!(receivers, Receivers::None);
149 assert_eq!(receivers.len(), 0);
150 }
151
152 #[test]
153 fn test_receivers_builder_add_node_after_none() {
154 let receivers = ReceiversBuilder::new().none().add_node("ECM").build().unwrap();
155 match &receivers {
156 Receivers::Nodes(nodes) => assert_eq!(nodes.len(), 1),
157 _ => panic!("Expected Nodes variant"),
158 }
159 }
160
161 #[test]
162 fn test_receivers_builder_add_nodes() {
163 let receivers = ReceiversBuilder::new().add_nodes(["ECM", "TCM", "BCM"]).build().unwrap();
164 match &receivers {
165 Receivers::Nodes(nodes) => assert_eq!(nodes.len(), 3),
166 _ => panic!("Expected Nodes variant"),
167 }
168 assert!(receivers.contains("ECM"));
169 assert!(receivers.contains("TCM"));
170 assert!(receivers.contains("BCM"));
171 }
172
173 #[test]
174 fn test_receivers_builder_add_nodes_iterator() {
175 let node_vec = ["Node1", "Node2", "Node3"];
176 let receivers = ReceiversBuilder::new().add_nodes(node_vec.iter()).build().unwrap();
177 match &receivers {
178 Receivers::Nodes(nodes) => assert_eq!(nodes.len(), 3),
179 _ => panic!("Expected Nodes variant"),
180 }
181 }
182
183 #[test]
184 fn test_receivers_builder_clear() {
185 let receivers = ReceiversBuilder::new()
186 .add_node("ECM")
187 .add_node("TCM")
188 .clear()
189 .add_node("BCM")
190 .build()
191 .unwrap();
192 match &receivers {
193 Receivers::Nodes(nodes) => {
194 assert_eq!(nodes.len(), 1);
195 assert!(receivers.contains("BCM"));
196 assert!(!receivers.contains("ECM"));
197 }
198 _ => panic!("Expected Nodes variant"),
199 }
200 }
201}