use indexmap::IndexMap;
use crate::document::XmlDocument;
use crate::node::{NodeType, XmlNode};
pub struct EditableNodeRef<'a> {
pub(crate) node: XmlNode,
pub(crate) doc: &'a XmlDocument,
}
impl<'a> EditableNodeRef<'a> {
pub fn node_type(&self) -> NodeType {
self.node.get_type()
}
pub fn name(&self) -> String {
self.node.get_name()
}
pub fn qname(&self) -> String {
self.node.qname()
}
pub fn prefix(&self) -> Option<String> {
self.node.get_prefix()
}
pub fn namespace_uri(&self) -> Option<String> {
self.node.get_namespace_uri()
}
pub fn get_content(&self) -> Option<String> {
self.node.get_content()
}
pub fn get_attribute(&self, name: &str) -> Option<String> {
self.node.get_attribute(name)
}
pub fn get_attribute_ns(&self, namespace_uri: &str, local_name: &str) -> Option<String> {
if let Some((_prefix, uri)) = self.node.get_attribute_ns_info(local_name) {
if uri == namespace_uri {
return self.node.get_attribute(local_name);
}
}
None
}
pub fn get_attributes(&self) -> IndexMap<String, String> {
self.node.get_attributes()
}
pub fn children(&self) -> Vec<EditableNodeRef<'a>> {
self.node
.get_child_elements()
.into_iter()
.map(|node| EditableNodeRef {
node,
doc: self.doc,
})
.collect()
}
pub fn child_nodes(&self) -> Vec<EditableNodeRef<'a>> {
self.node
.get_child_nodes()
.into_iter()
.map(|node| EditableNodeRef {
node,
doc: self.doc,
})
.collect()
}
pub fn is_element(&self) -> bool {
self.node.is_element()
}
pub fn is_text(&self) -> bool {
self.node.is_text()
}
}