update quick_xml and migrate from error-chain to failure

This commit is contained in:
Emmanuel Gil Peyrot 2018-02-18 19:54:09 +01:00
parent 055caa8e24
commit 236582b24e
5 changed files with 62 additions and 43 deletions

View file

@ -20,5 +20,6 @@ license = "MIT"
gitlab = { repository = "lumi/minidom-rs" } gitlab = { repository = "lumi/minidom-rs" }
[dependencies] [dependencies]
quick-xml = "0.10.0" quick-xml = "0.11.0"
error-chain = "0.11.0" failure = "0.1.1"
failure_derive = "0.1.1"

View file

@ -7,7 +7,7 @@ use std::str;
use std::rc::Rc; use std::rc::Rc;
use std::borrow::Cow; use std::borrow::Cow;
use error::{Error, ErrorKind, Result}; use error::{Error, Result};
use quick_xml::reader::Reader as EventReader; use quick_xml::reader::Reader as EventReader;
use quick_xml::events::{Event, BytesStart}; use quick_xml::events::{Event, BytesStart};
@ -309,7 +309,7 @@ impl Element {
break build_element(reader, e)?; break build_element(reader, e)?;
}, },
Event::Eof => { Event::Eof => {
bail!(ErrorKind::EndOfDocument); return Err(Error::EndOfDocument);
}, },
Event::Text { .. } | Event::Text { .. } |
Event::End { .. } | Event::End { .. } |
@ -349,23 +349,23 @@ impl Element {
match elem.prefix() { match elem.prefix() {
Some(prefix) => { Some(prefix) => {
if possible_prefix != prefix.as_bytes() { if possible_prefix != prefix.as_bytes() {
bail!(ErrorKind::InvalidElementClosed); return Err(Error::InvalidElementClosed);
} }
}, },
None => { None => {
bail!(ErrorKind::InvalidElementClosed); return Err(Error::InvalidElementClosed);
}, },
} }
if name != elem.name().as_bytes() { if name != elem.name().as_bytes() {
bail!(ErrorKind::InvalidElementClosed); return Err(Error::InvalidElementClosed);
} }
}, },
None => { None => {
if elem.prefix().is_some() { if elem.prefix().is_some() {
bail!(ErrorKind::InvalidElementClosed); return Err(Error::InvalidElementClosed);
} }
if possible_prefix != elem.name().as_bytes() { if possible_prefix != elem.name().as_bytes() {
bail!(ErrorKind::InvalidElementClosed); return Err(Error::InvalidElementClosed);
} }
}, },
} }
@ -676,7 +676,7 @@ fn split_element_name<S: AsRef<str>>(s: S) -> Result<(Option<String>, String)> {
match name_parts.len() { match name_parts.len() {
2 => Ok((Some(name_parts[0].to_owned()), name_parts[1].to_owned())), 2 => Ok((Some(name_parts[0].to_owned()), name_parts[1].to_owned())),
1 => Ok((None, name_parts[0].to_owned())), 1 => Ok((None, name_parts[0].to_owned())),
_ => bail!(ErrorKind::InvalidElement), _ => Err(Error::InvalidElement),
} }
} }

View file

@ -2,34 +2,51 @@
use std::convert::From; use std::convert::From;
error_chain! { /// Our main error type.
foreign_links { #[derive(Debug, Fail)]
XmlError(::quick_xml::errors::Error) pub enum Error {
/// An error from quick_xml. /// An error from quick_xml.
; #[fail(display = "XML error: {}", _0)]
Utf8Error(::std::str::Utf8Error) XmlError(#[cause] ::quick_xml::errors::Error),
/// An UTF-8 conversion error.
;
IoError(::std::io::Error)
/// An I/O error, from std::io.
;
}
errors { /// An UTF-8 conversion error.
/// An error which is returned when the end of the document was reached prematurely. #[fail(display = "UTF-8 error: {}", _0)]
EndOfDocument { Utf8Error(#[cause] ::std::str::Utf8Error),
description("the end of the document has been reached prematurely")
display("the end of the document has been reached prematurely") /// An I/O error, from std::io.
} #[fail(display = "IO error: {}", _0)]
/// An error which is returned when an element is closed when it shouldn't be IoError(#[cause] ::std::io::Error),
InvalidElementClosed {
description("The XML is invalid, an element was wrongly closed") /// An error which is returned when the end of the document was reached prematurely.
display("the XML is invalid, an element was wrongly closed") #[fail(display = "the end of the document has been reached prematurely")]
} EndOfDocument,
/// An error which is returned when an elemet's name contains more than one colon
InvalidElement { /// An error which is returned when an element is closed when it shouldn't be
description("The XML element is invalid") #[fail(display = "the XML is invalid, an element was wrongly closed")]
display("the XML element is invalid") InvalidElementClosed,
}
/// An error which is returned when an elemet's name contains more than one colon
#[fail(display = "the XML element is invalid")]
InvalidElement,
}
impl From<::quick_xml::errors::Error> for Error {
fn from(err: ::quick_xml::errors::Error) -> Error {
Error::XmlError(err)
} }
} }
impl From<::std::str::Utf8Error> for Error {
fn from(err: ::std::str::Utf8Error) -> Error {
Error::Utf8Error(err)
}
}
impl From<::std::io::Error> for Error {
fn from(err: ::std::io::Error) -> Error {
Error::IoError(err)
}
}
/// Our simplified Result type.
pub type Result<T> = ::std::result::Result<T, Error>;

View file

@ -65,7 +65,8 @@
//! ``` //! ```
extern crate quick_xml; extern crate quick_xml;
#[macro_use] extern crate error_chain; extern crate failure;
#[macro_use] extern crate failure_derive;
pub mod error; pub mod error;
pub mod element; pub mod element;
@ -74,6 +75,6 @@ mod namespace_set;
#[cfg(test)] mod tests; #[cfg(test)] mod tests;
pub use error::{Error, ErrorKind, Result, ResultExt}; pub use error::{Error, Result};
pub use element::{Element, Node, Children, ChildrenMut, ElementBuilder}; pub use element::{Element, Node, Children, ChildrenMut, ElementBuilder};
pub use convert::{IntoElements, IntoAttributeValue, ElementEmitter}; pub use convert::{IntoElements, IntoAttributeValue, ElementEmitter};

View file

@ -201,12 +201,12 @@ fn namespace_inherited_prefixed2() {
#[test] #[test]
fn xml_error() { fn xml_error() {
match "<a></b>".parse::<Element>() { match "<a></b>".parse::<Element>() {
Err(::error::Error(::error::ErrorKind::XmlError(_), _)) => (), Err(::error::Error::XmlError(_)) => (),
err => panic!("No or wrong error: {:?}", err) err => panic!("No or wrong error: {:?}", err)
} }
match "<a></".parse::<Element>() { match "<a></".parse::<Element>() {
Err(::error::Error(::error::ErrorKind::XmlError(_), _)) => (), Err(::error::Error::XmlError(_)) => (),
err => panic!("No or wrong error: {:?}", err) err => panic!("No or wrong error: {:?}", err)
} }
} }
@ -214,7 +214,7 @@ fn xml_error() {
#[test] #[test]
fn invalid_element_error() { fn invalid_element_error() {
match "<a:b:c>".parse::<Element>() { match "<a:b:c>".parse::<Element>() {
Err(::error::Error(::error::ErrorKind::InvalidElement, _)) => (), Err(::error::Error::InvalidElement) => (),
err => panic!("No or wrong error: {:?}", err) err => panic!("No or wrong error: {:?}", err)
} }
} }