use std::sync::Arc;
use crate::{
encoding::{DecodeError, EncodeError},
parse::ParseError,
relaxng::{RncParseError, RngParseError, RngValidError},
tree::XMLTreeError,
uri::ParseRIError,
xinclude::XIncludeError,
xpath::{XPathCompileError, XPathError},
xpointer::XPointerParseError,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum XMLErrorLevel {
FatalError,
Error,
Warning,
}
impl std::fmt::Display for XMLErrorLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match *self {
Self::FatalError => write!(f, "fatal error"),
Self::Error => write!(f, "error"),
Self::Warning => write!(f, "warning"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum XMLErrorDomain {
Parser,
Namespace,
DTDValid,
RngParser,
RncParser,
RngValid,
C14N,
XInclude,
}
impl std::fmt::Display for XMLErrorDomain {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match *self {
Self::Parser => write!(f, "parser"),
Self::Namespace => write!(f, "namespace"),
Self::DTDValid => write!(f, "dtd-valid"),
Self::RngParser => write!(f, "relaxng-parser"),
Self::RncParser => write!(f, "relaxng-compact-syntax-parser"),
Self::RngValid => write!(f, "relaxng-valid"),
Self::C14N => write!(f, "c14n"),
Self::XInclude => write!(f, "xinclude"),
}
}
}
#[derive(Debug, Clone)]
pub enum XMLError {
InternalError,
UnsupportedError,
XMLParseError(ParseError),
IOError(Arc<std::io::Error>),
EncodeError(EncodeError),
EncoderUnknownError,
DecodeError(DecodeError),
DecoderUnknownError,
URIParseError(ParseRIError),
URIBaseURINotAbsolute,
URIBaseURINotFound,
TreeError(XMLTreeError),
XPathError(XPathError),
CatalogInvalidPublicID,
CatalogResourceFailure,
RngParseError(RngParseError),
RngValidError(RngValidError),
RncParseError(RncParseError),
XPointerParseError(XPointerParseError),
XIncludeError(XIncludeError),
C14NUnresolvableEntityReference,
}
impl std::fmt::Display for XMLError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{self:?}")
}
}
impl std::error::Error for XMLError {}
impl From<ParseError> for XMLError {
fn from(value: ParseError) -> Self {
XMLError::XMLParseError(value)
}
}
impl From<std::io::Error> for XMLError {
fn from(value: std::io::Error) -> Self {
Self::IOError(Arc::new(value))
}
}
impl From<EncodeError> for XMLError {
fn from(value: EncodeError) -> Self {
Self::EncodeError(value)
}
}
impl From<DecodeError> for XMLError {
fn from(value: DecodeError) -> Self {
Self::DecodeError(value)
}
}
impl From<ParseRIError> for XMLError {
fn from(value: ParseRIError) -> Self {
Self::URIParseError(value)
}
}
impl From<XMLTreeError> for XMLError {
fn from(value: XMLTreeError) -> Self {
Self::TreeError(value)
}
}
impl From<XPathError> for XMLError {
fn from(value: XPathError) -> Self {
Self::XPathError(value)
}
}
impl From<XPathCompileError> for XMLError {
fn from(value: XPathCompileError) -> Self {
XPathError::from(value).into()
}
}
impl From<XPointerParseError> for XMLError {
fn from(value: XPointerParseError) -> Self {
XMLError::XPointerParseError(value)
}
}
impl From<XIncludeError> for XMLError {
fn from(value: XIncludeError) -> Self {
XMLError::XIncludeError(value)
}
}
impl From<RngParseError> for XMLError {
fn from(value: RngParseError) -> Self {
XMLError::RngParseError(value)
}
}
impl From<RngValidError> for XMLError {
fn from(value: RngValidError) -> Self {
XMLError::RngValidError(value)
}
}
impl From<RncParseError> for XMLError {
fn from(value: RncParseError) -> Self {
XMLError::RncParseError(value)
}
}