| //! Contains XML attributes manipulation types and functions. |
| //! |
| |
| use std::fmt; |
| |
| use name::{Name, OwnedName}; |
| use escape::escape_str_attribute; |
| |
| /// A borrowed version of an XML attribute. |
| /// |
| /// Consists of a borrowed qualified name and a borrowed string value. |
| #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] |
| pub struct Attribute<'a> { |
| /// Attribute name. |
| pub name: Name<'a>, |
| |
| /// Attribute value. |
| pub value: &'a str |
| } |
| |
| impl<'a> fmt::Display for Attribute<'a> { |
| fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| write!(f, "{}=\"{}\"", self.name, escape_str_attribute(self.value)) |
| } |
| } |
| |
| impl<'a> Attribute<'a> { |
| /// Creates an owned attribute out of this borrowed one. |
| #[inline] |
| pub fn to_owned(&self) -> OwnedAttribute { |
| OwnedAttribute { |
| name: self.name.into(), |
| value: self.value.into(), |
| } |
| } |
| |
| /// Creates a borrowed attribute using the provided borrowed name and a borrowed string value. |
| #[inline] |
| pub fn new(name: Name<'a>, value: &'a str) -> Attribute<'a> { |
| Attribute { name, value, } |
| } |
| } |
| |
| /// An owned version of an XML attribute. |
| /// |
| /// Consists of an owned qualified name and an owned string value. |
| #[derive(Clone, Eq, PartialEq, Hash, Debug)] |
| pub struct OwnedAttribute { |
| /// Attribute name. |
| pub name: OwnedName, |
| |
| /// Attribute value. |
| pub value: String |
| } |
| |
| impl OwnedAttribute { |
| /// Returns a borrowed `Attribute` out of this owned one. |
| pub fn borrow(&self) -> Attribute { |
| Attribute { |
| name: self.name.borrow(), |
| value: &*self.value, |
| } |
| } |
| |
| /// Creates a new owned attribute using the provided owned name and an owned string value. |
| #[inline] |
| pub fn new<S: Into<String>>(name: OwnedName, value: S) -> OwnedAttribute { |
| OwnedAttribute { |
| name, |
| value: value.into(), |
| } |
| } |
| } |
| |
| impl fmt::Display for OwnedAttribute { |
| fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| write!(f, "{}=\"{}\"", self.name, escape_str_attribute(&*self.value)) |
| } |
| } |
| |
| #[cfg(test)] |
| mod tests { |
| use super::{Attribute}; |
| |
| use name::Name; |
| |
| #[test] |
| fn attribute_display() { |
| let attr = Attribute::new( |
| Name::qualified("attribute", "urn:namespace", Some("n")), |
| "its value with > & \" ' < weird symbols" |
| ); |
| |
| assert_eq!( |
| &*attr.to_string(), |
| "{urn:namespace}n:attribute=\"its value with > & " ' < weird symbols\"" |
| ) |
| } |
| } |