use std::{num::ParseIntError, str::Utf8Error};

use crate::element::{Name, Namespace};

pub enum Error {
    ReadError(std::io::Error),
    Utf8Error(Utf8Error),
    ParseError(String),
    EntityProcessError(String),
    // TODO: better choice for failures than string
    InvalidCharRef(String),
    DuplicateNameSpace(Namespace),
    DuplicateAttribute(String),
    UnqualifiedNamespace(String),
    MismatchedEndTag(String, String),
}

impl From<std::io::Error> for Error {
    fn from(e: std::io::Error) -> Self {
        Self::ReadError(e)
    }
}

impl From<Utf8Error> for Error {
    fn from(e: Utf8Error) -> Self {
        Self::Utf8Error(e)
    }
}

impl From<ParseIntError> for Error {
    fn from(e: ParseIntError) -> Self {
        Self::InvalidCharRef(e.to_string())
    }
}