dbc_rs/nodes/builder/
build.rs1use super::NodesBuilder;
2use crate::nodes::{InnerNodes, Node};
3use crate::{Error, MAX_NODES, Nodes, Result};
4
5impl NodesBuilder {
6 fn to_compat_nodes(&self) -> Result<InnerNodes> {
8 use crate::compat::{Comment, Name, Vec};
9 let mut result: InnerNodes = InnerNodes::new();
10 let mut names: Vec<Name, { MAX_NODES }> = Vec::new();
11 for (node_name, node_comment) in &self.nodes {
12 let compat_name = Name::try_from(node_name.as_str())
13 .map_err(|_| Error::Validation(Error::MAX_NAME_SIZE_EXCEEDED))?;
14 let _ = names.push(compat_name.clone());
15
16 let compat_comment = if let Some(comment) = node_comment {
17 Some(
18 Comment::try_from(comment.as_str())
19 .map_err(|_| Error::Validation("Comment exceeds maximum length"))?,
20 )
21 } else {
22 None
23 };
24
25 result
26 .push(Node::with_comment(compat_name, compat_comment))
27 .map_err(|_| Error::Validation(Error::NODES_TOO_MANY))?;
28 }
29 Nodes::validate(&names)?;
30 Ok(result)
31 }
32
33 #[must_use = "validation result should be checked"]
64 pub fn validate(self) -> Result<Self> {
65 self.to_compat_nodes()?;
66 Ok(self)
67 }
68
69 pub fn build(self) -> Result<Nodes> {
112 let compat_nodes = self.to_compat_nodes()?;
113 Ok(Nodes::new(compat_nodes))
114 }
115}
116
117#[cfg(test)]
118mod tests {
119 #![allow(clippy::float_cmp)]
120 use super::*;
121 use crate::Error;
122
123 #[test]
124 fn test_nodes_builder_empty() {
125 let nodes = NodesBuilder::new().build().unwrap();
126 assert!(nodes.is_empty());
127 assert_eq!(nodes.len(), 0);
128 }
129
130 #[test]
131 fn test_nodes_builder_duplicate() {
132 let result = NodesBuilder::new().add_node("ECM").add_node("TCM").add_node("ECM").build();
133 assert!(result.is_err());
134 match result.unwrap_err() {
135 Error::Validation(msg) => assert!(msg.contains(Error::NODES_DUPLICATE_NAME)),
136 _ => panic!("Expected Validation error"),
137 }
138 }
139
140 #[test]
141 fn test_nodes_builder_too_many() {
142 let mut builder = NodesBuilder::new();
143 for i in 0..MAX_NODES {
144 let node_str = format!("Node{i}");
145 builder = builder.add_node(node_str);
146 }
147 let node = "NodeLast".to_string();
148 let result = builder.add_node(node).build();
149 assert!(result.is_err());
150 match result.unwrap_err() {
151 Error::Validation(msg) => {
152 assert!(msg.contains(Error::NODES_TOO_MANY));
153 }
154 _ => panic!("Expected Validation error"),
155 }
156 }
157
158 #[test]
159 fn test_nodes_builder_validate() {
160 let builder = NodesBuilder::new().add_node("TCM").add_node("BCM");
161 let validated = builder.validate().unwrap();
162 let nodes = validated.build().unwrap();
163 assert_eq!(nodes.len(), 2);
164 }
165
166 #[test]
167 fn test_nodes_builder_validate_duplicate() {
168 let result = NodesBuilder::new().add_node("ECM").add_node("TCM").add_node("ECM").build();
169 assert!(result.is_err());
170 match result.unwrap_err() {
171 Error::Validation(msg) => assert!(msg.contains(Error::NODES_DUPLICATE_NAME)),
172 _ => panic!("Expected Validation error"),
173 }
174 }
175
176 #[test]
177 fn test_nodes_builder_validate_too_many() {
178 let mut builder = NodesBuilder::new();
179 for i in 0..MAX_NODES {
180 let node_str = format!("Node{i}");
181 builder = builder.add_node(node_str);
182 }
183
184 let result = builder.validate();
185 assert!(result.is_ok());
186
187 builder = result.unwrap();
189 let result = builder.add_node("NodeLast").build();
190 assert!(result.is_err());
191 match result.unwrap_err() {
192 Error::Validation(msg) => assert!(msg.contains(Error::NODES_TOO_MANY)),
193 _ => panic!("Expected Validation error"),
194 }
195 }
196}