diff --git a/src/to_element/mod.rs b/src/to_element/mod.rs new file mode 100644 index 0000000..729e64c --- /dev/null +++ b/src/to_element/mod.rs @@ -0,0 +1,7 @@ +use minidom::Element; + +mod node; + +pub trait ToElement { + fn to_element(&self) -> Element; +} diff --git a/src/to_element.rs b/src/to_element/node.rs similarity index 71% rename from src/to_element.rs rename to src/to_element/node.rs index 504e779..790b9e7 100644 --- a/src/to_element.rs +++ b/src/to_element/node.rs @@ -1,12 +1,11 @@ +use std::fmt::Write; + use minidom::Element; use node::Node; +use to_element::ToElement; 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()); @@ -15,6 +14,16 @@ impl ToElement for Node { elem.set_attr("__type", value.standard_type().name); match value { + Value::Binary(data) => { + elem.set_attr("__size", data.len()); + + let len = data.len() * 2; + let value = data.into_iter().fold(String::with_capacity(len), |mut val, x| { + write!(val, "{:02x}", x).expect("Failed to append hex char"); + val + }); + elem.append_text_node(value); + }, Value::String(value) => { elem.append_text_node(value.as_str()); },