From 1fe1dc7323818b1e9df14344c962d183086b43e2 Mon Sep 17 00:00:00 2001 From: Matt Bilker Date: Mon, 29 Oct 2018 15:14:46 +0000 Subject: [PATCH] error: add QuickXmlError conversion --- src/error.rs | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/error.rs b/src/error.rs index 492eb9c..5790a76 100644 --- a/src/error.rs +++ b/src/error.rs @@ -3,9 +3,10 @@ use std::result::Result as StdResult; use std::string::FromUtf8Error; use failure::{Backtrace, Context, Fail}; -use value::Value; +use quick_xml::Error as QuickXmlError; use node_types::{KbinType, StandardType}; +use value::Value; pub type Result = StdResult; @@ -14,7 +15,7 @@ pub struct KbinError { inner: Context, } -#[derive(Clone, Debug, Fail)] +#[derive(Debug, Fail)] pub enum KbinErrorKind { #[fail(display = "Unable to read {} byte from header", _0)] HeaderRead(&'static str), @@ -106,6 +107,9 @@ pub enum KbinErrorKind { #[fail(display = "Value mismatch, expected {}, but found {:?}", _0, _1)] ValueTypeMismatch(StandardType, Value), + #[fail(display = "Value mismatch, expected an array, but found {:?}", _0)] + ExpectedValueArray(Value), + #[fail(display = "Invalid input for boolean: {}", _0)] InvalidBooleanInput(u8), @@ -114,6 +118,15 @@ pub enum KbinErrorKind { #[fail(display = "Invalid state")] InvalidState, + + #[fail(display = "Error handling XML")] + XmlError(#[cause] QuickXmlError), +} + +impl KbinError { + pub fn get_context(&self) -> &KbinErrorKind { + self.inner.get_context() + } } impl fmt::Display for KbinError { @@ -122,14 +135,6 @@ impl fmt::Display for KbinError { } } -impl Clone for KbinError { - fn clone(&self) -> Self { - Self { - inner: Context::new(self.inner.get_context().clone()) - } - } -} - impl Fail for KbinError { fn cause(&self) -> Option<&Fail> { self.inner.cause() @@ -153,11 +158,19 @@ impl From> for KbinError { } impl From for KbinError { - fn from(inner: FromUtf8Error) -> KbinError { + fn from(inner: FromUtf8Error) -> Self { inner.context(KbinErrorKind::Utf8).into() } } +impl From for KbinError { + fn from(inner: QuickXmlError) -> Self { + Self { + inner: Context::new(KbinErrorKind::XmlError(inner)), + } + } +} + cfg_if! { if #[cfg(feature = "serde")] { use std::error::Error as StdError;