From dff69fe00e9891d3a54ced6a4786fbf44cb673bc Mon Sep 17 00:00:00 2001 From: Matt Bilker Date: Sat, 15 Sep 2018 05:17:08 +0000 Subject: [PATCH] to_element: add trait to convert a Node to a Element --- src/lib.rs | 2 ++ src/to_element.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/to_element.rs diff --git a/src/lib.rs b/src/lib.rs index 9c3de11..023ae16 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,6 +28,7 @@ mod options; mod printer; mod reader; mod sixbit; +mod to_element; mod value; mod writer; @@ -47,6 +48,7 @@ pub use node::{ExtraNodes, Node, NodeCollection}; pub use options::Options; pub use de::from_bytes; pub use ser::to_bytes; +pub use to_element::ToElement; pub use value::Value; pub use writer::{Writer, Writeable}; diff --git a/src/to_element.rs b/src/to_element.rs new file mode 100644 index 0000000..504e779 --- /dev/null +++ b/src/to_element.rs @@ -0,0 +1,49 @@ +use minidom::Element; + +use node::Node; +use value::Value; + +pub trait ToElement { + fn to_element(&self) -> Element; +} + +impl ToElement for Node { + fn to_element(&self) -> Element { + let mut elem = Element::bare(self.key()); + + if let Some(value) = self.value() { + elem.set_attr("__type", value.standard_type().name); + + match value { + Value::String(value) => { + elem.append_text_node(value.as_str()); + }, + Value::Array(_, values) => { + elem.set_attr("__count", values.len()); + + let value = Value::array_as_string(values); + elem.append_text_node(value); + }, + value => { + let value = value.to_string(); + elem.append_text_node(value); + }, + } + } + + if let Some(attributes) = self.attributes() { + for (key, value) in attributes { + elem.set_attr(key.as_str(), value.as_str()); + } + } + + if let Some(children) = self.children() { + for child in children { + let child = child.to_element(); + elem.append_child(child); + } + } + + elem + } +}