parent
375fef1e22
commit
ec5c7c86be
@ -0,0 +1,140 @@ |
|||||||
|
use oxiri::IriParseError; |
||||||
|
use rio_turtle::TurtleError; |
||||||
|
use rio_xml::RdfXmlError; |
||||||
|
use std::error::Error; |
||||||
|
use std::{fmt, io}; |
||||||
|
|
||||||
|
/// Error returned during RDF format parsing.
|
||||||
|
#[derive(Debug)] |
||||||
|
pub enum ParseError { |
||||||
|
/// I/O error during parsing (file not found...).
|
||||||
|
Io(io::Error), |
||||||
|
/// An error in the file syntax.
|
||||||
|
Syntax(SyntaxError), |
||||||
|
} |
||||||
|
|
||||||
|
impl ParseError { |
||||||
|
pub(crate) fn invalid_base_iri(iri: &str, error: IriParseError) -> Self { |
||||||
|
Self::Syntax(SyntaxError { |
||||||
|
inner: SyntaxErrorKind::InvalidBaseIri { |
||||||
|
iri: iri.to_owned(), |
||||||
|
error, |
||||||
|
}, |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl fmt::Display for ParseError { |
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
||||||
|
match self { |
||||||
|
Self::Io(e) => e.fmt(f), |
||||||
|
Self::Syntax(e) => e.fmt(f), |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl Error for ParseError { |
||||||
|
fn source(&self) -> Option<&(dyn Error + 'static)> { |
||||||
|
match self { |
||||||
|
Self::Io(e) => Some(e), |
||||||
|
Self::Syntax(e) => Some(e), |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[allow(clippy::fallible_impl_from)] |
||||||
|
impl From<TurtleError> for ParseError { |
||||||
|
fn from(error: TurtleError) -> Self { |
||||||
|
let error = io::Error::from(error); |
||||||
|
if error.get_ref().map_or(false, |e| e.is::<TurtleError>()) { |
||||||
|
Self::Syntax(SyntaxError { |
||||||
|
inner: SyntaxErrorKind::Turtle(*error.into_inner().unwrap().downcast().unwrap()), |
||||||
|
}) |
||||||
|
} else { |
||||||
|
Self::Io(error) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[allow(clippy::fallible_impl_from)] |
||||||
|
impl From<RdfXmlError> for ParseError { |
||||||
|
fn from(error: RdfXmlError) -> Self { |
||||||
|
let error = io::Error::from(error); |
||||||
|
if error.get_ref().map_or(false, |e| e.is::<RdfXmlError>()) { |
||||||
|
Self::Syntax(SyntaxError { |
||||||
|
inner: SyntaxErrorKind::RdfXml(*error.into_inner().unwrap().downcast().unwrap()), |
||||||
|
}) |
||||||
|
} else { |
||||||
|
Self::Io(error) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<io::Error> for ParseError { |
||||||
|
fn from(error: io::Error) -> Self { |
||||||
|
Self::Io(error) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<SyntaxError> for ParseError { |
||||||
|
fn from(error: SyntaxError) -> Self { |
||||||
|
Self::Syntax(error) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<ParseError> for io::Error { |
||||||
|
fn from(error: ParseError) -> Self { |
||||||
|
match error { |
||||||
|
ParseError::Io(error) => error, |
||||||
|
ParseError::Syntax(error) => error.into(), |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// An error in the syntax of the parsed file.
|
||||||
|
#[derive(Debug)] |
||||||
|
pub struct SyntaxError { |
||||||
|
inner: SyntaxErrorKind, |
||||||
|
} |
||||||
|
|
||||||
|
#[derive(Debug)] |
||||||
|
enum SyntaxErrorKind { |
||||||
|
Turtle(TurtleError), |
||||||
|
RdfXml(RdfXmlError), |
||||||
|
InvalidBaseIri { iri: String, error: IriParseError }, |
||||||
|
} |
||||||
|
|
||||||
|
impl fmt::Display for SyntaxError { |
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
||||||
|
match &self.inner { |
||||||
|
SyntaxErrorKind::Turtle(e) => e.fmt(f), |
||||||
|
SyntaxErrorKind::RdfXml(e) => e.fmt(f), |
||||||
|
SyntaxErrorKind::InvalidBaseIri { iri, error } => { |
||||||
|
write!(f, "Invalid base IRI '{}': {}", iri, error) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl Error for SyntaxError { |
||||||
|
fn source(&self) -> Option<&(dyn Error + 'static)> { |
||||||
|
match &self.inner { |
||||||
|
SyntaxErrorKind::Turtle(e) => Some(e), |
||||||
|
SyntaxErrorKind::RdfXml(e) => Some(e), |
||||||
|
SyntaxErrorKind::InvalidBaseIri { .. } => None, |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<SyntaxError> for io::Error { |
||||||
|
fn from(error: SyntaxError) -> Self { |
||||||
|
match error.inner { |
||||||
|
SyntaxErrorKind::Turtle(error) => error.into(), |
||||||
|
SyntaxErrorKind::RdfXml(error) => error.into(), |
||||||
|
SyntaxErrorKind::InvalidBaseIri { iri, error } => Self::new( |
||||||
|
io::ErrorKind::InvalidInput, |
||||||
|
format!("Invalid IRI '{}': {}", iri, error), |
||||||
|
), |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue