use alloc::{
boxed::Box,
string::{String, ToString},
};
use core::fmt;
use rxml::Error as XmlError;
#[derive(Debug)]
struct OpaqueError(String);
impl fmt::Display for OpaqueError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(&self.0)
}
}
impl core::error::Error for OpaqueError {}
#[derive(Debug)]
pub enum Error {
XmlError(XmlError),
TextParseError(Box<dyn core::error::Error + Send + Sync + 'static>),
Other(&'static str),
TypeMismatch,
}
impl Error {
pub fn text_parse_error<T: core::error::Error + Send + Sync + 'static>(e: T) -> Self {
Self::TextParseError(Box::new(e))
}
}
impl From<&Error> for Error {
fn from(other: &Error) -> Self {
match other {
Self::XmlError(e) => Self::XmlError(*e),
Self::TextParseError(e) => Self::TextParseError(Box::new(OpaqueError(e.to_string()))),
Self::Other(e) => Self::Other(e),
Self::TypeMismatch => Self::TypeMismatch,
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::XmlError(ref e) => write!(f, "xml parse error: {}", e),
Self::TextParseError(ref e) => write!(f, "text parse error: {}", e),
Self::TypeMismatch => f.write_str("mismatch between expected and actual XML data"),
Self::Other(msg) => f.write_str(msg),
}
}
}
impl core::error::Error for Error {
fn source(&self) -> Option<&(dyn core::error::Error + 'static)> {
match self {
Self::XmlError(ref e) => Some(e),
Self::TextParseError(ref e) => Some(&**e),
_ => None,
}
}
}
impl From<rxml::Error> for Error {
fn from(other: rxml::Error) -> Error {
Error::XmlError(other)
}
}
impl From<rxml::strings::Error> for Error {
fn from(other: rxml::strings::Error) -> Error {
Error::XmlError(other.into())
}
}
impl From<core::convert::Infallible> for Error {
fn from(other: core::convert::Infallible) -> Self {
match other {}
}
}
#[derive(Debug)]
pub enum FromEventsError {
Mismatch {
name: rxml::QName,
attrs: rxml::AttrMap,
},
Invalid(Error),
}
impl From<Error> for FromEventsError {
fn from(other: Error) -> Self {
Self::Invalid(other)
}
}
impl From<core::convert::Infallible> for FromEventsError {
fn from(other: core::convert::Infallible) -> Self {
match other {}
}
}
impl fmt::Display for FromEventsError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::Mismatch { .. } => f.write_str("element header did not match"),
Self::Invalid(ref e) => fmt::Display::fmt(e, f),
}
}
}
impl core::error::Error for FromEventsError {
fn source(&self) -> Option<&(dyn core::error::Error + 'static)> {
match self {
Self::Mismatch { .. } => None,
Self::Invalid(ref e) => Some(e),
}
}
}
impl From<Error> for Result<minidom::Element, Error> {
fn from(other: Error) -> Self {
Self::Err(other)
}
}
#[derive(Debug)]
pub enum FromElementError {
Mismatch(minidom::Element),
Invalid(Error),
}
impl fmt::Display for FromElementError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::Mismatch(ref el) => write!(
f,
"expected different XML element (got {} in namespace {})",
el.name(),
el.ns()
),
Self::Invalid(ref e) => fmt::Display::fmt(e, f),
}
}
}
impl core::error::Error for FromElementError {
fn source(&self) -> Option<&(dyn core::error::Error + 'static)> {
match self {
Self::Mismatch(_) => None,
Self::Invalid(ref e) => Some(e),
}
}
}
impl From<Result<minidom::Element, Error>> for FromElementError {
fn from(other: Result<minidom::Element, Error>) -> Self {
match other {
Ok(v) => Self::Mismatch(v),
Err(e) => Self::Invalid(e),
}
}
}
impl From<Error> for FromElementError {
fn from(other: Error) -> Self {
Self::Invalid(other)
}
}
impl From<FromElementError> for Error {
fn from(other: FromElementError) -> Self {
match other {
FromElementError::Invalid(e) => e,
FromElementError::Mismatch(..) => Self::TypeMismatch,
}
}
}
impl From<core::convert::Infallible> for FromElementError {
fn from(other: core::convert::Infallible) -> Self {
match other {}
}
}