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}