@@ -13,6 +13,7 @@ use indexmap::IndexMap;
1313use twox_hash:: xxhash64;
1414
1515use super :: property:: DeviceTreeProperty ;
16+ use crate :: error:: ModelError ;
1617use crate :: { Node , Property } ;
1718
1819/// A mutable, in-memory representation of a device tree node.
@@ -85,9 +86,9 @@ impl Node for DeviceTreeNode {
8586 /// use dtoolkit::Node;
8687 /// use dtoolkit::model::{DeviceTreeNode, DeviceTreeProperty};
8788 ///
88- /// let mut node = DeviceTreeNode::new("my-node");
89- /// node.add_child(DeviceTreeNode::new("child"));
90- /// let child = (& node) .child("child");
89+ /// let mut node = DeviceTreeNode::new("my-node").unwrap() ;
90+ /// node.add_child(DeviceTreeNode::new("child").unwrap() );
91+ /// let child = node.child("child");
9192 /// assert!(child.is_some());
9293 /// ```
9394 fn child ( & self , name : & str ) -> Option < & Self > {
@@ -148,8 +149,8 @@ impl<'a> Node for &'a DeviceTreeNode {
148149 /// use dtoolkit::model::{DeviceTreeNode, DeviceTreeProperty};
149150 /// use dtoolkit::{Node, Property};
150151 ///
151- /// let mut node = DeviceTreeNode::new("my-node");
152- /// node.add_property(DeviceTreeProperty::new("my-prop", vec![1, 2, 3, 4]));
152+ /// let mut node = DeviceTreeNode::new("my-node").unwrap() ;
153+ /// node.add_property(DeviceTreeProperty::new("my-prop", vec![1, 2, 3, 4]).unwrap() );
153154 /// let prop = (&node).property("my-prop").unwrap();
154155 /// assert_eq!(prop.value(), &[1, 2, 3, 4]);
155156 /// ```
@@ -176,8 +177,8 @@ impl<'a> Node for &'a DeviceTreeNode {
176177 /// use dtoolkit::Node;
177178 /// use dtoolkit::model::{DeviceTreeNode, DeviceTreeProperty};
178179 ///
179- /// let mut node = DeviceTreeNode::new("my-node");
180- /// node.add_child(DeviceTreeNode::new("child"));
180+ /// let mut node = DeviceTreeNode::new("my-node").unwrap() ;
181+ /// node.add_child(DeviceTreeNode::new("child").unwrap() );
181182 /// let child = (&node).child("child");
182183 /// assert!(child.is_some());
183184 /// ```
@@ -229,26 +230,42 @@ mod private {
229230impl DeviceTreeNode {
230231 /// Creates a new [`DeviceTreeNode`] with the given name.
231232 ///
233+ /// # Errors
234+ ///
235+ /// Returns a [`ModelError::InvalidNodeName`] if the node name is invalid.
236+ ///
232237 /// # Examples
233238 ///
234239 /// ```
235240 /// use dtoolkit::Node;
236241 /// use dtoolkit::model::DeviceTreeNode;
237242 ///
238- /// let node = DeviceTreeNode::new("my-node");
243+ /// let node = DeviceTreeNode::new("my-node").unwrap() ;
239244 /// assert_eq!(node.name(), "my-node");
240245 /// ```
246+ pub fn new ( name : impl Into < String > ) -> Result < Self , ModelError > {
247+ let name = name. into ( ) ;
248+ if !crate :: validate:: is_valid_node_name ( & name) {
249+ return Err ( ModelError :: InvalidNodeName ( name) ) ;
250+ }
251+ Ok ( Self :: new_unchecked ( name) )
252+ }
253+
254+ /// Creates a new [`DeviceTreeNode`] with the given name without validation.
241255 #[ must_use]
242- pub fn new ( name : impl Into < String > ) -> Self {
256+ pub fn new_unchecked ( name : impl Into < String > ) -> Self {
243257 Self {
244258 name : name. into ( ) ,
245259 ..Default :: default ( )
246260 }
247261 }
248262
249263 /// Creates a new [`DeviceTreeNodeBuilder`] with the given name.
250- #[ must_use]
251- pub fn builder ( name : impl Into < String > ) -> DeviceTreeNodeBuilder {
264+ ///
265+ /// # Errors
266+ ///
267+ /// Returns a [`ModelError::InvalidNodeName`] if the node name is invalid.
268+ pub fn builder ( name : impl Into < String > ) -> Result < DeviceTreeNodeBuilder , ModelError > {
252269 DeviceTreeNodeBuilder :: new ( name)
253270 }
254271
@@ -269,8 +286,8 @@ impl DeviceTreeNode {
269286 /// use dtoolkit::Property;
270287 /// use dtoolkit::model::{DeviceTreeNode, DeviceTreeProperty};
271288 ///
272- /// let mut node = DeviceTreeNode::new("my-node");
273- /// node.add_property(DeviceTreeProperty::new("my-prop", vec![1, 2, 3, 4]));
289+ /// let mut node = DeviceTreeNode::new("my-node").unwrap() ;
290+ /// node.add_property(DeviceTreeProperty::new("my-prop", vec![1, 2, 3, 4]).unwrap() );
274291 /// let prop = node.property_mut("my-prop").unwrap();
275292 /// prop.set_value(vec![5, 6, 7, 8]);
276293 /// assert_eq!((&*prop).value(), &[5, 6, 7, 8]);
@@ -292,9 +309,9 @@ impl DeviceTreeNode {
292309 /// use dtoolkit::model::{DeviceTreeNode, DeviceTreeProperty};
293310 /// use dtoolkit::{Node, Property};
294311 ///
295- /// let mut node = DeviceTreeNode::new("my-node");
296- /// node.add_property(DeviceTreeProperty::new("my-prop", vec![1, 2, 3, 4]));
297- /// assert_eq!(node.property("my-prop").unwrap().value(), &[1, 2, 3, 4]);
312+ /// let mut node = DeviceTreeNode::new("my-node").unwrap() ;
313+ /// node.add_property(DeviceTreeProperty::new("my-prop", vec![1, 2, 3, 4]).unwrap() );
314+ /// assert_eq!((& node) .property("my-prop").unwrap().value(), &[1, 2, 3, 4]);
298315 /// ```
299316 pub fn add_property ( & mut self , property : DeviceTreeProperty ) {
300317 self . properties
@@ -314,8 +331,8 @@ impl DeviceTreeNode {
314331 /// use dtoolkit::model::{DeviceTreeNode, DeviceTreeProperty};
315332 /// use dtoolkit::{Node, Property};
316333 ///
317- /// let mut node = DeviceTreeNode::new("my-node");
318- /// node.add_property(DeviceTreeProperty::new("my-prop", vec![1, 2, 3, 4]));
334+ /// let mut node = DeviceTreeNode::new("my-node").unwrap() ;
335+ /// node.add_property(DeviceTreeProperty::new("my-prop", vec![1, 2, 3, 4]).unwrap() );
319336 /// let prop = node.remove_property("my-prop").unwrap();
320337 /// assert_eq!((&prop).value(), &[1, 2, 3, 4]);
321338 /// assert!(node.property("my-prop").is_none());
@@ -341,11 +358,14 @@ impl DeviceTreeNode {
341358 /// use dtoolkit::model::{DeviceTreeNode, DeviceTreeProperty};
342359 /// use dtoolkit::{Node, Property};
343360 ///
344- /// let mut node = DeviceTreeNode::new("my-node");
345- /// node.add_child(DeviceTreeNode::new("child"));
361+ /// let mut node = DeviceTreeNode::new("my-node").unwrap() ;
362+ /// node.add_child(DeviceTreeNode::new("child").unwrap() );
346363 /// let child = node.child_mut("child").unwrap();
347- /// child.add_property(DeviceTreeProperty::new("my-prop", vec![1, 2, 3, 4]));
348- /// assert_eq!(child.property("my-prop").unwrap().value(), &[1, 2, 3, 4]);
364+ /// child.add_property(DeviceTreeProperty::new("my-prop", vec![1, 2, 3, 4]).unwrap());
365+ /// assert_eq!(
366+ /// (&*child).property("my-prop").unwrap().value(),
367+ /// &[1, 2, 3, 4]
368+ /// );
349369 /// ```
350370 #[ must_use]
351371 pub fn child_mut ( & mut self , name : & str ) -> Option < & mut DeviceTreeNode > {
@@ -364,9 +384,9 @@ impl DeviceTreeNode {
364384 /// use dtoolkit::Node;
365385 /// use dtoolkit::model::DeviceTreeNode;
366386 ///
367- /// let mut node = DeviceTreeNode::new("my-node");
368- /// node.add_child(DeviceTreeNode::new("child"));
369- /// assert_eq!(node.child("child").unwrap().name(), "child");
387+ /// let mut node = DeviceTreeNode::new("my-node").unwrap() ;
388+ /// node.add_child(DeviceTreeNode::new("child").unwrap() );
389+ /// assert_eq!((& node) .child("child").unwrap().name(), "child");
370390 /// ```
371391 pub fn add_child ( & mut self , child : DeviceTreeNode ) {
372392 self . children . insert ( child. name . clone ( ) , child) ;
@@ -385,8 +405,8 @@ impl DeviceTreeNode {
385405 /// use dtoolkit::Node;
386406 /// use dtoolkit::model::DeviceTreeNode;
387407 ///
388- /// let mut node = DeviceTreeNode::new("my-node");
389- /// node.add_child(DeviceTreeNode::new("child"));
408+ /// let mut node = DeviceTreeNode::new("my-node").unwrap() ;
409+ /// node.add_child(DeviceTreeNode::new("child").unwrap() );
390410 /// let child = node.remove_child("child").unwrap();
391411 /// assert_eq!(child.name(), "child");
392412 /// assert!(node.child("child").is_none());
@@ -427,10 +447,10 @@ pub struct DeviceTreeNodeBuilder {
427447}
428448
429449impl DeviceTreeNodeBuilder {
430- fn new ( name : impl Into < String > ) -> Self {
431- Self {
432- node : DeviceTreeNode :: new ( name) ,
433- }
450+ fn new ( name : impl Into < String > ) -> Result < Self , ModelError > {
451+ Ok ( Self {
452+ node : DeviceTreeNode :: new ( name) ? ,
453+ } )
434454 }
435455
436456 /// Adds a property to the node.
0 commit comments