dbc_rs/nodes/builder/
build.rs1use super::NodesBuilder;
2use crate::{Error, MAX_NAME_SIZE, MAX_NODES, Nodes, Result};
3
4impl NodesBuilder {
5 fn to_compat_nodes(
7 &self,
8 ) -> Result<crate::compat::Vec<crate::compat::String<{ MAX_NAME_SIZE }>, { MAX_NODES }>> {
9 use crate::compat::{String, Vec};
10 let mut result: Vec<String<{ MAX_NAME_SIZE }>, { MAX_NODES }> = Vec::new();
11 for node_str in &self.nodes {
12 let compat_str = String::try_from(node_str.as_str())
13 .map_err(|_| Error::Validation(Error::MAX_NAME_SIZE_EXCEEDED))?;
14 result.push(compat_str).map_err(|_| Error::Validation(Error::NODES_TOO_MANY))?;
15 }
16 Nodes::validate(&result)?;
17 Ok(result)
18 }
19
20 #[must_use = "validation result should be checked"]
51 pub fn validate(self) -> Result<Self> {
52 self.to_compat_nodes()?;
53 Ok(self)
54 }
55
56 pub fn build(self) -> Result<Nodes> {
99 let compat_nodes = self.to_compat_nodes()?;
100 Ok(Nodes::new(compat_nodes))
101 }
102}
103
104#[cfg(test)]
105mod tests {
106 #![allow(clippy::float_cmp)]
107 use super::*;
108 use crate::Error;
109
110 #[test]
111 fn test_nodes_builder_empty() {
112 let nodes = NodesBuilder::new().build().unwrap();
113 assert!(nodes.is_empty());
114 assert_eq!(nodes.len(), 0);
115 }
116
117 #[test]
118 fn test_nodes_builder_duplicate() {
119 let result = NodesBuilder::new().add_node("ECM").add_node("TCM").add_node("ECM").build();
120 assert!(result.is_err());
121 match result.unwrap_err() {
122 Error::Validation(msg) => assert!(msg.contains(Error::NODES_DUPLICATE_NAME)),
123 _ => panic!("Expected Validation error"),
124 }
125 }
126
127 #[test]
128 fn test_nodes_builder_too_many() {
129 let mut builder = NodesBuilder::new();
130 for i in 0..MAX_NODES {
131 let node_str = format!("Node{i}");
132 builder = builder.add_node(node_str);
133 }
134 let node = "NodeLast".to_string();
135 let result = builder.add_node(node).build();
136 assert!(result.is_err());
137 match result.unwrap_err() {
138 Error::Validation(msg) => {
139 assert!(msg.contains(Error::NODES_TOO_MANY));
140 }
141 _ => panic!("Expected Validation error"),
142 }
143 }
144
145 #[test]
146 fn test_nodes_builder_validate() {
147 let builder = NodesBuilder::new().add_node("TCM").add_node("BCM");
148 let validated = builder.validate().unwrap();
149 let nodes = validated.build().unwrap();
150 assert_eq!(nodes.len(), 2);
151 }
152
153 #[test]
154 fn test_nodes_builder_validate_duplicate() {
155 let result = NodesBuilder::new().add_node("ECM").add_node("TCM").add_node("ECM").build();
156 assert!(result.is_err());
157 match result.unwrap_err() {
158 Error::Validation(msg) => assert!(msg.contains(Error::NODES_DUPLICATE_NAME)),
159 _ => panic!("Expected Validation error"),
160 }
161 }
162
163 #[test]
164 fn test_nodes_builder_validate_too_many() {
165 let mut builder = NodesBuilder::new();
166 for i in 0..MAX_NODES {
167 let node_str = format!("Node{i}");
168 builder = builder.add_node(node_str);
169 }
170
171 let result = builder.validate();
172 assert!(result.is_ok());
173
174 builder = result.unwrap();
176 let result = builder.add_node("NodeLast").build();
177 assert!(result.is_err());
178 match result.unwrap_err() {
179 Error::Validation(msg) => assert!(msg.contains(Error::NODES_TOO_MANY)),
180 _ => panic!("Expected Validation error"),
181 }
182 }
183}