minidom/
prefixes.rs

1// Copyright (c) 2020 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
2// Copyright (c) 2020 Astro <astro@spaceboyz.net>
3// Copyright (c) 2020 Maxime “pep” Buquet <pep@bouah.net>
4// Copyright (c) 2020 Xidorn Quan <me@upsuper.org>
5//
6// This Source Code Form is subject to the terms of the Mozilla Public
7// License, v. 2.0. If a copy of the MPL was not distributed with this
8// file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10use 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    // TODO: Fix end character
24    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}