1 //! Contains XML attributes manipulation types and functions. 2 //! 3 4 use std::fmt; 5 6 use name::{Name, OwnedName}; 7 use escape::escape_str_attribute; 8 9 /// A borrowed version of an XML attribute. 10 /// 11 /// Consists of a borrowed qualified name and a borrowed string value. 12 #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] 13 pub struct Attribute<'a> { 14 /// Attribute name. 15 pub name: Name<'a>, 16 17 /// Attribute value. 18 pub value: &'a str 19 } 20 21 impl<'a> fmt::Display for Attribute<'a> { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result22 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 23 write!(f, "{}=\"{}\"", self.name, escape_str_attribute(self.value)) 24 } 25 } 26 27 impl<'a> Attribute<'a> { 28 /// Creates an owned attribute out of this borrowed one. 29 #[inline] to_owned(&self) -> OwnedAttribute30 pub fn to_owned(&self) -> OwnedAttribute { 31 OwnedAttribute { 32 name: self.name.into(), 33 value: self.value.into(), 34 } 35 } 36 37 /// Creates a borrowed attribute using the provided borrowed name and a borrowed string value. 38 #[inline] new(name: Name<'a>, value: &'a str) -> Attribute<'a>39 pub fn new(name: Name<'a>, value: &'a str) -> Attribute<'a> { 40 Attribute { name, value, } 41 } 42 } 43 44 /// An owned version of an XML attribute. 45 /// 46 /// Consists of an owned qualified name and an owned string value. 47 #[derive(Clone, Eq, PartialEq, Hash, Debug)] 48 pub struct OwnedAttribute { 49 /// Attribute name. 50 pub name: OwnedName, 51 52 /// Attribute value. 53 pub value: String 54 } 55 56 impl OwnedAttribute { 57 /// Returns a borrowed `Attribute` out of this owned one. borrow(&self) -> Attribute58 pub fn borrow(&self) -> Attribute { 59 Attribute { 60 name: self.name.borrow(), 61 value: &*self.value, 62 } 63 } 64 65 /// Creates a new owned attribute using the provided owned name and an owned string value. 66 #[inline] new<S: Into<String>>(name: OwnedName, value: S) -> OwnedAttribute67 pub fn new<S: Into<String>>(name: OwnedName, value: S) -> OwnedAttribute { 68 OwnedAttribute { 69 name, 70 value: value.into(), 71 } 72 } 73 } 74 75 impl fmt::Display for OwnedAttribute { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result76 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 77 write!(f, "{}=\"{}\"", self.name, escape_str_attribute(&*self.value)) 78 } 79 } 80 81 #[cfg(test)] 82 mod tests { 83 use super::{Attribute}; 84 85 use name::Name; 86 87 #[test] attribute_display()88 fn attribute_display() { 89 let attr = Attribute::new( 90 Name::qualified("attribute", "urn:namespace", Some("n")), 91 "its value with > & \" ' < weird symbols" 92 ); 93 94 assert_eq!( 95 &*attr.to_string(), 96 "{urn:namespace}n:attribute=\"its value with > & " ' < weird symbols\"" 97 ) 98 } 99 } 100