use quick_xml::events::attributes::AttrError;
use quick_xml::Error as QuickXMLError;
use regex_intersect::IntersectError;
use regextranslator::RegexTranslationError;
use xml_builder::XMLError;
use xsdvalidator::XSDValidationError;
#[derive(Debug)]
pub enum XMLGeneratorError {
InvalidPathError(String),
XSDValidatorError(String),
DataTypeInformationError(String),
DataTypeNotFoundError(String),
XSDParserError(String),
DataTypesFormatError(String),
XMLBuilderError(String),
InvalidXSDVersionError(String),
InfiniteRecursionError,
NoElementsError,
InvalidXSDError(String),
InvalidXSDNameError(String),
NoIndependentElementsError,
MultipleRootsError,
TypeGenerationError(String),
RegexError(String),
RegexMismatchError(String, String),
LineEndingsError(String),
EncodingError,
UnimplementedFeature(String),
}
impl From<QuickXMLError> for XMLGeneratorError {
fn from(err: QuickXMLError) -> XMLGeneratorError {
match err {
QuickXMLError::Io(error) => XMLGeneratorError::InvalidPathError(error.to_string()),
QuickXMLError::Syntax(error) => XMLGeneratorError::InvalidXSDError(error.to_string()),
QuickXMLError::IllFormed(error) => {
XMLGeneratorError::InvalidXSDError(error.to_string())
}
QuickXMLError::InvalidAttr(error) => {
XMLGeneratorError::InvalidXSDError(error.to_string())
}
QuickXMLError::Encoding(error) => XMLGeneratorError::InvalidXSDError(error.to_string()),
QuickXMLError::Escape(error) => XMLGeneratorError::InvalidXSDError(error.to_string()),
QuickXMLError::Namespace(error) => {
XMLGeneratorError::InvalidXSDError(error.to_string())
}
}
}
}
impl From<AttrError> for XMLGeneratorError {
fn from(err: AttrError) -> XMLGeneratorError {
XMLGeneratorError::InvalidXSDError(err.to_string())
}
}
impl From<IntersectError> for XMLGeneratorError {
fn from(error: IntersectError) -> XMLGeneratorError {
match error {
IntersectError::Parse(error) => XMLGeneratorError::RegexError(error.to_string()),
IntersectError::Error(error) => XMLGeneratorError::RegexError(error.to_string()),
}
}
}
impl From<XSDValidationError> for XMLGeneratorError {
fn from(value: XSDValidationError) -> XMLGeneratorError {
match value {
XSDValidationError::PathError => XMLGeneratorError::InvalidPathError("".to_string()),
XSDValidationError::LibXML2InterfaceError(e) => {
XMLGeneratorError::XSDValidatorError(format!("LibXML2 interface error: {}", e))
}
XSDValidationError::OutputRedirectError(e) => {
XMLGeneratorError::XSDValidatorError(e.to_string())
}
XSDValidationError::ParseError(e) => {
XMLGeneratorError::XSDValidatorError(e.to_string())
}
XSDValidationError::ReadFileError => {
XMLGeneratorError::XSDValidatorError("File read error".to_string())
}
XSDValidationError::XSDRecursionError => {
XMLGeneratorError::InvalidXSDError("Recursive elements found".to_string())
}
}
}
}
impl From<RegexTranslationError> for XMLGeneratorError {
fn from(value: RegexTranslationError) -> XMLGeneratorError {
match value {
RegexTranslationError::InvalidInput(str) => XMLGeneratorError::InvalidXSDError(str),
RegexTranslationError::RegexError(str) => XMLGeneratorError::InvalidXSDError(str),
RegexTranslationError::DataError(str) => XMLGeneratorError::RegexError(str),
RegexTranslationError::UnicodeError(str) => XMLGeneratorError::RegexError(str),
RegexTranslationError::SurrogatesError => {
XMLGeneratorError::UnimplementedFeature("Regex Surrogates".to_string())
}
}
}
}
impl From<XMLError> for XMLGeneratorError {
fn from(value: XMLError) -> XMLGeneratorError {
match value {
XMLError::InsertError(str) => XMLGeneratorError::XMLBuilderError(str),
XMLError::IOError(str) => XMLGeneratorError::XMLBuilderError(str),
}
}
}
pub(crate) fn unimplemented<Type>(name: &str) -> Result<Type, XMLGeneratorError> {
Err(XMLGeneratorError::UnimplementedFeature(name.to_string()))
}