1use alloc::collections::BTreeMap;
11use alloc::string::String;
12use core::fmt;
13
14pub type Prefix = Option<String>;
15pub type Namespace = String;
16
17#[derive(Clone, Default, PartialEq, Eq)]
18pub struct Prefixes {
19 prefixes: BTreeMap<Prefix, Namespace>,
20}
21
22impl fmt::Debug for Prefixes {
23 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25 write!(f, "Prefixes(")?;
26 for (prefix, namespace) in &self.prefixes {
27 if let Some(prefix) = prefix {
28 write!(f, "xmlns:{prefix}={namespace:?} ")?;
29 } else {
30 write!(f, "xmlns={namespace:?} ")?;
31 }
32 }
33 write!(f, ")")
34 }
35}
36
37impl Prefixes {
38 pub fn declared_prefixes(&self) -> &BTreeMap<Prefix, Namespace> {
39 &self.prefixes
40 }
41
42 pub fn get(&self, prefix: &Prefix) -> Option<&Namespace> {
43 self.prefixes.get(prefix)
44 }
45
46 pub(crate) fn insert<S: Into<Namespace>>(&mut self, prefix: Prefix, namespace: S) {
47 self.prefixes.insert(prefix, namespace.into());
48 }
49}
50
51impl From<BTreeMap<Prefix, Namespace>> for Prefixes {
52 fn from(prefixes: BTreeMap<Prefix, Namespace>) -> Self {
53 Prefixes { prefixes }
54 }
55}
56
57impl From<Option<String>> for Prefixes {
58 fn from(namespace: Option<String>) -> Self {
59 match namespace {
60 None => Self::default(),
61 Some(namespace) => Self::from(namespace),
62 }
63 }
64}
65
66impl From<Namespace> for Prefixes {
67 fn from(namespace: Namespace) -> Self {
68 let mut prefixes = BTreeMap::new();
69 prefixes.insert(None, namespace);
70
71 Prefixes { prefixes }
72 }
73}
74
75impl From<(Prefix, Namespace)> for Prefixes {
76 fn from(prefix_namespace: (Prefix, Namespace)) -> Self {
77 let (prefix, namespace) = prefix_namespace;
78 let mut prefixes = BTreeMap::new();
79 prefixes.insert(prefix, namespace);
80
81 Prefixes { prefixes }
82 }
83}
84
85impl From<(String, String)> for Prefixes {
86 fn from(prefix_namespace: (String, String)) -> Self {
87 let (prefix, namespace) = prefix_namespace;
88 Self::from((Some(prefix), namespace))
89 }
90}