hml_rs/names/
attribute.rs1use super::{Name, NamespaceStack};
3use crate::MarkupResult;
4
5#[derive(Clone, Eq, PartialEq, Hash, Debug)]
11pub struct Attribute {
12 pub name: Name,
14
15 pub value: String,
17}
18
19impl Attribute {
20 pub fn new(
23 ns_stack: &mut NamespaceStack,
24 prefix: &str,
25 name: &str,
26 value: String,
27 ) -> MarkupResult<Self> {
28 if ns_stack.uses_xmlns() {
29 if prefix.is_empty() && name == "xmlns" {
30 println!("Add ns '' to be {}", value);
31 ns_stack.add_ns("", &value);
32 let name = Name::new(ns_stack, name, name)?;
33 return Ok(Self { name, value });
34 } else if prefix == "xmlns" {
35 println!("Add ns {} to be value {}", name, value);
36 ns_stack.add_ns(name, &value);
37 }
38 }
39 let name = Name::new(ns_stack, prefix, name)?;
40 Ok(Self { name, value })
41 }
42
43 }
45
46#[derive(Debug, Default)]
51pub struct Attributes {
52 attributes: Vec<Attribute>,
54}
55
56impl Attributes {
58 pub fn is_empty(&self) -> bool {
61 self.attributes.is_empty()
62 }
63
64 pub fn add(
68 &mut self,
69 ns_stack: &mut NamespaceStack,
70 prefix: &str,
71 name: &str,
72 value: String,
73 ) -> MarkupResult<()> {
74 self.attributes
75 .push(Attribute::new(ns_stack, prefix, name, value)?);
76 Ok(())
77 }
78
79 pub fn steal(&mut self, v: &mut Self) {
82 self.attributes.append(&mut v.attributes);
83 }
84
85 pub fn take(self) -> Vec<Attribute> {
88 self.attributes
89 }
90
91 pub fn attributes(&self) -> &[Attribute] {
94 &self.attributes
95 }
96
97 }