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}