From e81509fab170bfdefcdd8dea4ef21c69a99159ae Mon Sep 17 00:00:00 2001 From: Thayne McCombs Date: Mon, 1 Jul 2019 11:31:11 -0600 Subject: [PATCH 1/2] Add conversion to/from io::Error for kv::Error And keep the original error, so that an io error inside the visitor is returned accessible by the call to `visit`. --- src/kv/error.rs | 46 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/src/kv/error.rs b/src/kv/error.rs index 8e91f04..a84dfd8 100644 --- a/src/kv/error.rs +++ b/src/kv/error.rs @@ -1,29 +1,45 @@ use std::fmt; /// An error encountered while working with structured data. -#[derive(Clone, Debug)] +#[derive(Debug)] pub struct Error { - msg: &'static str, + inner: Inner +} + +#[derive(Debug)] +enum Inner { + #[cfg(feature = "std")] + Io(std::io::Error), + Msg(&'static str), + Fmt, } impl Error { /// Create an error from the given message. pub fn msg(msg: &'static str) -> Self { Error { - msg: msg, + inner: Inner::Msg(msg), } } } impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.msg.fmt(f) + use self::Inner::*; + match &self.inner { + #[cfg(feature = "std")] + Io(err) => err.fmt(f), + Msg(msg) => msg.fmt(f), + Fmt => fmt::Error.fmt(f), + } } } impl From for Error { fn from(_: fmt::Error) -> Self { - Error::msg("formatting failed") + Error { + inner: Inner::Fmt, + } } } @@ -36,11 +52,29 @@ impl From for fmt::Error { #[cfg(feature = "std")] mod std_support { use super::*; - use std::error; + use std::{error, io}; impl error::Error for Error { fn description(&self) -> &str { "key values error" } } + + impl From for Error { + fn from(err: io::Error) -> Self { + Error { + inner: Inner::Io(err) + } + } + } + + impl From for io::Error { + fn from(err: Error) -> Self { + if let Inner::Io(err) = err.inner { + err + } else { + io::Error::new(io::ErrorKind::Other, err) + } + } + } } From 86748c8f19ecb6805e79fd458a5fe6531769d958 Mon Sep 17 00:00:00 2001 From: Thayne McCombs Date: Mon, 1 Jul 2019 12:29:32 -0600 Subject: [PATCH 2/2] Fix error with rustc 1.21 --- src/kv/error.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/kv/error.rs b/src/kv/error.rs index a84dfd8..b6ecb47 100644 --- a/src/kv/error.rs +++ b/src/kv/error.rs @@ -1,4 +1,6 @@ use std::fmt; +#[cfg(feature = "std")] +use std::io; /// An error encountered while working with structured data. #[derive(Debug)] @@ -9,7 +11,7 @@ pub struct Error { #[derive(Debug)] enum Inner { #[cfg(feature = "std")] - Io(std::io::Error), + Io(io::Error), Msg(&'static str), Fmt, } @@ -28,9 +30,9 @@ impl fmt::Display for Error { use self::Inner::*; match &self.inner { #[cfg(feature = "std")] - Io(err) => err.fmt(f), - Msg(msg) => msg.fmt(f), - Fmt => fmt::Error.fmt(f), + &Io(ref err) => err.fmt(f), + &Msg(ref msg) => msg.fmt(f), + &Fmt => fmt::Error.fmt(f), } } }