dbc_rs/nodes/builder/
impls.rs

1use super::NodesBuilder;
2use std::vec::Vec;
3
4impl NodesBuilder {
5    /// Creates a new `NodesBuilder` with an empty node list.
6    ///
7    /// # Examples
8    ///
9    /// ```rust,no_run
10    /// use dbc_rs::NodesBuilder;
11    ///
12    /// let builder = NodesBuilder::new();
13    /// let nodes = builder.build()?;
14    /// assert!(nodes.is_empty());
15    /// # Ok::<(), dbc_rs::Error>(())
16    /// ```
17    pub fn new() -> Self {
18        Self { nodes: Vec::new() }
19    }
20
21    /// Adds a single node to the list without a comment.
22    ///
23    /// # Arguments
24    ///
25    /// * `node` - The node name (anything that implements `AsRef<str>`)
26    ///
27    /// # Examples
28    ///
29    /// ```rust,no_run
30    /// use dbc_rs::NodesBuilder;
31    ///
32    /// let nodes = NodesBuilder::new()
33    ///     .add_node("ECM")
34    ///     .add_node("TCM")
35    ///     .build()?;
36    /// assert_eq!(nodes.len(), 2);
37    /// # Ok::<(), dbc_rs::Error>(())
38    /// ```
39    #[must_use = "builder method returns modified builder"]
40    pub fn add_node(mut self, node: impl AsRef<str>) -> Self {
41        self.nodes.push((node.as_ref().to_string(), None));
42        self
43    }
44
45    /// Adds a single node to the list with an optional comment.
46    ///
47    /// # Arguments
48    ///
49    /// * `node` - The node name (anything that implements `AsRef<str>`)
50    /// * `comment` - The comment for this node
51    ///
52    /// # Examples
53    ///
54    /// ```rust,no_run
55    /// use dbc_rs::NodesBuilder;
56    ///
57    /// let nodes = NodesBuilder::new()
58    ///     .add_node_with_comment("ECM", "Engine Control Module")
59    ///     .add_node("TCM")
60    ///     .build()?;
61    /// assert_eq!(nodes.len(), 2);
62    /// assert_eq!(nodes.node_comment("ECM"), Some("Engine Control Module"));
63    /// assert_eq!(nodes.node_comment("TCM"), None);
64    /// # Ok::<(), dbc_rs::Error>(())
65    /// ```
66    #[must_use = "builder method returns modified builder"]
67    pub fn add_node_with_comment(
68        mut self,
69        node: impl AsRef<str>,
70        comment: impl AsRef<str>,
71    ) -> Self {
72        self.nodes.push((
73            node.as_ref().to_string(),
74            Some(comment.as_ref().to_string()),
75        ));
76        self
77    }
78
79    /// Adds multiple nodes from an iterator.
80    ///
81    /// # Arguments
82    ///
83    /// * `nodes` - An iterator of node names (each item must implement `AsRef<str>`)
84    ///
85    /// # Examples
86    ///
87    /// ```rust,no_run
88    /// use dbc_rs::NodesBuilder;
89    ///
90    /// // From a slice
91    /// let nodes = NodesBuilder::new()
92    ///     .add_nodes(&["ECM", "TCM", "BCM"])
93    ///     .build()?;
94    /// assert_eq!(nodes.len(), 3);
95    ///
96    /// // From a vector
97    /// let node_vec = vec!["Node1", "Node2"];
98    /// let nodes2 = NodesBuilder::new()
99    ///     .add_nodes(node_vec.iter())
100    ///     .build()?;
101    /// assert_eq!(nodes2.len(), 2);
102    /// # Ok::<(), dbc_rs::Error>(())
103    /// ```
104    #[must_use = "builder method returns modified builder"]
105    pub fn add_nodes<I, S>(mut self, nodes: I) -> Self
106    where
107        I: IntoIterator<Item = S>,
108        S: AsRef<str>,
109    {
110        for node in nodes {
111            self = self.add_node(node.as_ref());
112        }
113
114        self
115    }
116
117    /// Clears all nodes from the builder.
118    ///
119    /// # Examples
120    ///
121    /// ```rust,no_run
122    /// use dbc_rs::NodesBuilder;
123    ///
124    /// let nodes = NodesBuilder::new()
125    ///     .add_node("ECM")
126    ///     .add_node("TCM")
127    ///     .clear()
128    ///     .add_node("BCM")
129    ///     .build()?;
130    /// assert_eq!(nodes.len(), 1);
131    /// assert!(nodes.contains("BCM"));
132    /// assert!(!nodes.contains("ECM"));
133    /// # Ok::<(), dbc_rs::Error>(())
134    /// ```
135    #[must_use = "builder method returns modified builder"]
136    pub fn clear(mut self) -> Self {
137        self.nodes.clear();
138        self
139    }
140}
141
142impl Default for NodesBuilder {
143    fn default() -> Self {
144        Self::new()
145    }
146}
147
148#[cfg(test)]
149mod tests {
150    #![allow(clippy::float_cmp)]
151    use super::*;
152
153    #[test]
154    fn test_nodes_builder_add_nodes() {
155        let nodes = NodesBuilder::new().add_nodes(["ECM", "TCM", "BCM"]).build().unwrap();
156        assert_eq!(nodes.len(), 3);
157        assert!(nodes.contains("ECM"));
158        assert!(nodes.contains("TCM"));
159        assert!(nodes.contains("BCM"));
160    }
161
162    #[test]
163    fn test_nodes_builder_add_nodes_iterator() {
164        let node_vec = ["Node1", "Node2", "Node3"];
165        let nodes = NodesBuilder::new().add_nodes(node_vec.iter()).build().unwrap();
166        assert_eq!(nodes.len(), 3);
167        assert!(nodes.contains("Node1"));
168    }
169
170    #[test]
171    fn test_nodes_builder_clear() {
172        let nodes = NodesBuilder::new()
173            .add_node("ECM")
174            .add_node("TCM")
175            .clear()
176            .add_node("BCM")
177            .build()
178            .unwrap();
179        assert_eq!(nodes.len(), 1);
180        assert!(nodes.contains("BCM"));
181        assert!(!nodes.contains("ECM"));
182        assert!(!nodes.contains("TCM"));
183    }
184}