use crate::error::{Error, Result};
use crate::namespaced::{MutNamespaced, Namespaced};
use crate::node_impl::*;
use crate::traits::*;
pub type RefAttribute<'a> = &'a dyn Attribute<NodeRef = RefNode>;
pub type MutRefAttribute<'a> = &'a mut dyn Attribute<NodeRef = RefNode>;
pub type RefElement<'a> = &'a dyn Element<NodeRef = RefNode>;
pub type MutRefElement<'a> = &'a mut dyn Element<NodeRef = RefNode>;
pub type RefNamespaced<'a> = &'a dyn Namespaced<NodeRef = RefNode>;
pub(crate) type MutRefNamespaced<'a> = &'a mut dyn MutNamespaced<NodeRef = RefNode>;
pub type RefText<'a> = &'a dyn Text<NodeRef = RefNode>;
pub type MutRefText<'a> = &'a mut dyn Text<NodeRef = RefNode>;
pub type RefCDataSection<'a> = &'a dyn CDataSection<NodeRef = RefNode>;
pub type MutRefCDataSection<'a> = &'a mut dyn CDataSection<NodeRef = RefNode>;
pub type RefEntityReference<'a> = &'a dyn EntityReference<NodeRef = RefNode>;
pub type MutRefEntityReference<'a> = &'a mut dyn EntityReference<NodeRef = RefNode>;
pub type RefEntity<'a> = &'a dyn Entity<NodeRef = RefNode>;
pub type MutRefEntity<'a> = &'a mut dyn Entity<NodeRef = RefNode>;
pub type RefProcessingInstruction<'a> = &'a dyn ProcessingInstruction<NodeRef = RefNode>;
pub type MutRefProcessingInstruction<'a> = &'a mut dyn ProcessingInstruction<NodeRef = RefNode>;
pub type RefComment<'a> = &'a dyn Comment<NodeRef = RefNode>;
pub type MutRefComment<'a> = &'a mut dyn Comment<NodeRef = RefNode>;
pub type RefDocument<'a> = &'a dyn Document<NodeRef = RefNode>;
pub type MutRefDocument<'a> = &'a mut dyn Document<NodeRef = RefNode>;
pub type RefDocumentType<'a> = &'a dyn DocumentType<NodeRef = RefNode>;
pub type MutRefDocumentType<'a> = &'a mut dyn DocumentType<NodeRef = RefNode>;
pub type RefDocumentFragment<'a> = &'a dyn DocumentFragment<NodeRef = RefNode>;
pub type MutRefDocumentFragment<'a> = &'a mut dyn DocumentFragment<NodeRef = RefNode>;
pub type RefNotation<'a> = &'a dyn Notation<NodeRef = RefNode>;
pub type MutRefNotation<'a> = &'a mut dyn Notation<NodeRef = RefNode>;
#[inline]
pub fn is_attribute(ref_node: &RefNode) -> bool {
ref_node.borrow().i_node_type == NodeType::Attribute
}
#[inline]
pub fn as_attribute(ref_node: &RefNode) -> Result<RefAttribute<'_>> {
if ref_node.borrow().i_node_type == NodeType::Attribute {
Ok(ref_node as RefAttribute<'_>)
} else {
warn!("ref_node.node_type != Attribute");
Err(Error::InvalidState)
}
}
#[inline]
pub fn as_attribute_mut(ref_node: &mut RefNode) -> Result<MutRefAttribute<'_>> {
if ref_node.borrow().i_node_type == NodeType::Attribute {
Ok(ref_node as MutRefAttribute<'_>)
} else {
warn!("ref_node.node_type != Attribute");
Err(Error::InvalidState)
}
}
#[inline]
pub fn is_element(ref_node: &RefNode) -> bool {
ref_node.borrow().i_node_type == NodeType::Element
}
#[inline]
pub fn as_element(ref_node: &RefNode) -> Result<RefElement<'_>> {
if ref_node.borrow().i_node_type == NodeType::Element {
Ok(ref_node as RefElement<'_>)
} else {
warn!("ref_node.node_type != Element");
Err(Error::InvalidState)
}
}
#[inline]
pub fn as_element_mut(ref_node: &mut RefNode) -> Result<MutRefElement<'_>> {
if ref_node.borrow().i_node_type == NodeType::Element {
Ok(ref_node as MutRefElement<'_>)
} else {
warn!("ref_node.node_type != Element");
Err(Error::InvalidState)
}
}
#[inline]
pub fn is_element_namespaced(ref_node: &RefNode) -> bool {
ref_node.borrow().i_node_type == NodeType::Element
}
#[inline]
pub fn as_element_namespaced(ref_node: &RefNode) -> Result<RefNamespaced<'_>> {
if ref_node.borrow().i_node_type == NodeType::Element {
Ok(ref_node as RefNamespaced<'_>)
} else {
warn!("ref_node.node_type != Element");
Err(Error::InvalidState)
}
}
#[inline]
pub(crate) fn as_element_namespaced_mut(ref_node: &mut RefNode) -> Result<MutRefNamespaced<'_>> {
if ref_node.borrow().i_node_type == NodeType::Element {
Ok(ref_node as MutRefNamespaced<'_>)
} else {
warn!("ref_node.node_type != Element");
Err(Error::InvalidState)
}
}
#[inline]
pub fn is_character_data(ref_node: &RefNode) -> bool {
match ref_node.borrow().i_node_type {
NodeType::CData | NodeType::Comment | NodeType::Text => true,
_ => false,
}
}
#[inline]
pub fn is_text(ref_node: &RefNode) -> bool {
ref_node.borrow().i_node_type == NodeType::Text
}
#[inline]
pub fn as_text(ref_node: &RefNode) -> Result<RefText<'_>> {
if ref_node.borrow().i_node_type == NodeType::Text {
Ok(ref_node as RefText<'_>)
} else {
warn!("ref_node.node_type != Text");
Err(Error::InvalidState)
}
}
#[inline]
pub fn as_text_mut(ref_node: &mut RefNode) -> Result<MutRefText<'_>> {
if ref_node.borrow().i_node_type == NodeType::Text {
Ok(ref_node as MutRefText<'_>)
} else {
warn!("ref_node.node_type != Text");
Err(Error::InvalidState)
}
}
#[inline]
pub fn is_cdata_section(ref_node: &RefNode) -> bool {
ref_node.borrow().i_node_type == NodeType::CData
}
#[inline]
pub fn as_cdata_section(ref_node: &RefNode) -> Result<RefCDataSection<'_>> {
if ref_node.borrow().i_node_type == NodeType::CData {
Ok(ref_node as RefCDataSection<'_>)
} else {
warn!("ref_node.node_type != CData");
Err(Error::InvalidState)
}
}
#[inline]
pub fn as_cdata_section_mut(ref_node: &mut RefNode) -> Result<MutRefCDataSection<'_>> {
if ref_node.borrow().i_node_type == NodeType::CData {
Ok(ref_node as MutRefCDataSection<'_>)
} else {
warn!("ref_node.node_type != CData");
Err(Error::InvalidState)
}
}
#[inline]
pub fn is_entity_reference(_ref_node: &RefNode) -> bool {
panic!("node type EntityReference unsupported");
}
#[inline]
pub fn as_entity_reference(_ref_node: &RefNode) -> Result<RefEntityReference<'_>> {
warn!("node type EntityReference unsupported");
Err(Error::NotSupported)
}
#[inline]
pub fn as_entity_reference_mut(_ref_node: &mut RefNode) -> Result<MutRefEntityReference<'_>> {
warn!("node type EntityReference unsupported");
Err(Error::NotSupported)
}
#[inline]
pub fn is_entity(_ref_node: &RefNode) -> bool {
panic!("node type Entity unsupported");
}
#[inline]
pub fn as_entity(_ref_node: &RefNode) -> Result<RefEntity<'_>> {
warn!("node type Entity unsupported");
Err(Error::NotSupported)
}
#[inline]
pub fn as_entity_mut(_ref_node: &mut RefNode) -> Result<MutRefEntity<'_>> {
warn!("node type Entity unsupported");
Err(Error::NotSupported)
}
#[inline]
pub fn is_processing_instruction(ref_node: &RefNode) -> bool {
ref_node.borrow().i_node_type == NodeType::ProcessingInstruction
}
#[inline]
pub fn as_processing_instruction(ref_node: &RefNode) -> Result<RefProcessingInstruction<'_>> {
if ref_node.borrow().i_node_type == NodeType::ProcessingInstruction {
Ok(ref_node as RefProcessingInstruction<'_>)
} else {
warn!("ref_node.node_type != ProcessingInstruction");
Err(Error::InvalidState)
}
}
#[inline]
pub fn as_processing_instruction_mut(
ref_node: &mut RefNode,
) -> Result<MutRefProcessingInstruction<'_>> {
if ref_node.borrow().i_node_type == NodeType::ProcessingInstruction {
Ok(ref_node as MutRefProcessingInstruction<'_>)
} else {
warn!("ref_node.node_type != ProcessingInstruction");
Err(Error::InvalidState)
}
}
#[inline]
pub fn is_comment(ref_node: &RefNode) -> bool {
ref_node.borrow().i_node_type == NodeType::Comment
}
#[inline]
pub fn as_comment(ref_node: &RefNode) -> Result<RefComment<'_>> {
if ref_node.borrow().i_node_type == NodeType::Comment {
Ok(ref_node as RefComment<'_>)
} else {
warn!("ref_node.node_type != Comment");
Err(Error::InvalidState)
}
}
#[inline]
pub fn as_comment_mut(ref_node: &mut RefNode) -> Result<MutRefComment<'_>> {
if ref_node.borrow().i_node_type == NodeType::Comment {
Ok(ref_node as MutRefComment<'_>)
} else {
warn!("ref_node.node_type != Comment");
Err(Error::InvalidState)
}
}
#[inline]
pub fn is_document(ref_node: &RefNode) -> bool {
ref_node.borrow().i_node_type == NodeType::Document
}
#[inline]
pub fn as_document(ref_node: &RefNode) -> Result<RefDocument<'_>> {
if ref_node.borrow().i_node_type == NodeType::Document {
Ok(ref_node as RefDocument<'_>)
} else {
warn!("ref_node.node_type != Attribute");
Err(Error::InvalidState)
}
}
#[inline]
pub fn as_document_mut(ref_node: &mut RefNode) -> Result<MutRefDocument<'_>> {
if ref_node.borrow().i_node_type == NodeType::Document {
Ok(ref_node as MutRefDocument<'_>)
} else {
warn!("ref_node.node_type != Attribute");
Err(Error::InvalidState)
}
}
#[inline]
pub fn is_document_type(ref_node: &RefNode) -> bool {
ref_node.borrow().i_node_type == NodeType::DocumentType
}
#[inline]
pub fn as_document_type(ref_node: &RefNode) -> Result<RefDocumentType<'_>> {
if ref_node.borrow().i_node_type == NodeType::DocumentType {
Ok(ref_node as RefDocumentType<'_>)
} else {
warn!("ref_node.node_type != DocumentType");
Err(Error::InvalidState)
}
}
#[inline]
pub fn as_document_type_mut(ref_node: &mut RefNode) -> Result<RefDocumentType<'_>> {
if ref_node.borrow().i_node_type == NodeType::DocumentType {
Ok(ref_node as RefDocumentType<'_>)
} else {
warn!("ref_node.node_type != DocumentType");
Err(Error::InvalidState)
}
}
#[inline]
pub fn is_document_fragment(_ref_node: &RefNode) -> bool {
panic!("node type DocumentFragment unsupported");
}
#[inline]
pub fn as_document_fragment(_ref_node: &RefNode) -> Result<RefDocumentFragment<'_>> {
warn!("node type DocumentFragment unsupported");
Err(Error::NotSupported)
}
#[inline]
pub fn as_document_fragment_mut(_ref_node: &mut RefNode) -> Result<MutRefDocumentFragment<'_>> {
warn!("node type DocumentFragment unsupported");
Err(Error::NotSupported)
}
#[inline]
pub fn is_notation(_ref_node: &RefNode) -> bool {
panic!("node type Notation unsupported");
}
#[inline]
pub fn as_notation(_ref_node: &RefNode) -> Result<RefNotation<'_>> {
warn!("node type Notation unsupported");
Err(Error::NotSupported)
}
#[inline]
pub fn as_notation_mut(_ref_node: &mut RefNode) -> Result<MutRefNotation<'_>> {
warn!("node type Notation unsupported");
Err(Error::NotSupported)
}