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.
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());
42 self
43 }
44
45 /// Adds multiple nodes from an iterator.
46 ///
47 /// # Arguments
48 ///
49 /// * `nodes` - An iterator of node names (each item must implement `AsRef<str>`)
50 ///
51 /// # Examples
52 ///
53 /// ```rust,no_run
54 /// use dbc_rs::NodesBuilder;
55 ///
56 /// // From a slice
57 /// let nodes = NodesBuilder::new()
58 /// .add_nodes(&["ECM", "TCM", "BCM"])
59 /// .build()?;
60 /// assert_eq!(nodes.len(), 3);
61 ///
62 /// // From a vector
63 /// let node_vec = vec!["Node1", "Node2"];
64 /// let nodes2 = NodesBuilder::new()
65 /// .add_nodes(node_vec.iter())
66 /// .build()?;
67 /// assert_eq!(nodes2.len(), 2);
68 /// # Ok::<(), dbc_rs::Error>(())
69 /// ```
70 #[must_use = "builder method returns modified builder"]
71 pub fn add_nodes<I, S>(mut self, nodes: I) -> Self
72 where
73 I: IntoIterator<Item = S>,
74 S: AsRef<str>,
75 {
76 for node in nodes {
77 self = self.add_node(node.as_ref());
78 }
79
80 self
81 }
82
83 /// Clears all nodes from the builder.
84 ///
85 /// # Examples
86 ///
87 /// ```rust,no_run
88 /// use dbc_rs::NodesBuilder;
89 ///
90 /// let nodes = NodesBuilder::new()
91 /// .add_node("ECM")
92 /// .add_node("TCM")
93 /// .clear()
94 /// .add_node("BCM")
95 /// .build()?;
96 /// assert_eq!(nodes.len(), 1);
97 /// assert!(nodes.contains("BCM"));
98 /// assert!(!nodes.contains("ECM"));
99 /// # Ok::<(), dbc_rs::Error>(())
100 /// ```
101 #[must_use = "builder method returns modified builder"]
102 pub fn clear(mut self) -> Self {
103 self.nodes.clear();
104 self
105 }
106}
107
108impl Default for NodesBuilder {
109 fn default() -> Self {
110 Self::new()
111 }
112}
113
114#[cfg(test)]
115mod tests {
116 #![allow(clippy::float_cmp)]
117 use super::*;
118
119 #[test]
120 fn test_nodes_builder_add_nodes() {
121 let nodes = NodesBuilder::new().add_nodes(["ECM", "TCM", "BCM"]).build().unwrap();
122 assert_eq!(nodes.len(), 3);
123 assert!(nodes.contains("ECM"));
124 assert!(nodes.contains("TCM"));
125 assert!(nodes.contains("BCM"));
126 }
127
128 #[test]
129 fn test_nodes_builder_add_nodes_iterator() {
130 let node_vec = ["Node1", "Node2", "Node3"];
131 let nodes = NodesBuilder::new().add_nodes(node_vec.iter()).build().unwrap();
132 assert_eq!(nodes.len(), 3);
133 assert!(nodes.contains("Node1"));
134 }
135
136 #[test]
137 fn test_nodes_builder_clear() {
138 let nodes = NodesBuilder::new()
139 .add_node("ECM")
140 .add_node("TCM")
141 .clear()
142 .add_node("BCM")
143 .build()
144 .unwrap();
145 assert_eq!(nodes.len(), 1);
146 assert!(nodes.contains("BCM"));
147 assert!(!nodes.contains("ECM"));
148 assert!(!nodes.contains("TCM"));
149 }
150}