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}