use std::collections::HashMap;
#[derive(Debug, Default)]
pub struct NsPrefixes {
prefix_to_uri: HashMap<String, String>,
uri_to_prefix: HashMap<String, String>,
default_ns: Option<String>,
}
impl NsPrefixes {
pub fn new(map: HashMap<String, String>) -> Self {
let mut p = NsPrefixes {
prefix_to_uri: HashMap::new(),
uri_to_prefix: HashMap::new(),
default_ns: None,
};
for (prefix, uri) in map {
if prefix == "N" {
continue;
}
if prefix == "D" {
p.default_ns = Some(uri);
} else {
p.uri_to_prefix.insert(uri.clone(), prefix.clone());
p.prefix_to_uri.insert(prefix, uri);
}
}
p
}
pub fn get_default_ns(&self) -> Option<&str> {
self.default_ns.as_deref()
}
pub fn get_namespace_for_prefix(&self, prefix: &str) -> Option<&str> {
if prefix.is_empty() {
return Some(self.default_ns.as_deref().unwrap_or(""));
}
self.prefix_to_uri.get(prefix).map(|s| s.as_str())
}
pub fn get_prefix_for_namespace(&self, ns_uri: &str) -> Option<&str> {
if ns_uri.is_empty() {
return Some(if self.default_ns.is_none() { "" } else { "N" });
}
if self.default_ns.as_deref() == Some(ns_uri) {
return Some("");
}
self.uri_to_prefix.get(ns_uri).map(|s| s.as_str())
}
}