From a14aacbcf98ca0544789e273bf1e9b70c9dc9a6e Mon Sep 17 00:00:00 2001 From: Lucien Greathouse Date: Wed, 9 Oct 2019 12:39:36 -0700 Subject: [PATCH] Improve SnapshotError in preparation for moving middleware to it --- src/imfs/error.rs | 4 ++++ src/snapshot_middleware/error.rs | 19 +++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/imfs/error.rs b/src/imfs/error.rs index 0369132e..989c64e2 100644 --- a/src/imfs/error.rs +++ b/src/imfs/error.rs @@ -39,6 +39,10 @@ impl FsError { pub fn kind(&self) -> FsErrorKind { self.inner.kind() } + + pub fn into_raw(self) -> (io::Error, PathBuf) { + (self.inner, self.path) + } } impl fmt::Display for FsError { diff --git a/src/snapshot_middleware/error.rs b/src/snapshot_middleware/error.rs index 7eb43e55..2ee268fb 100644 --- a/src/snapshot_middleware/error.rs +++ b/src/snapshot_middleware/error.rs @@ -1,8 +1,6 @@ -use std::{error::Error, fmt, path::PathBuf}; +use std::{error::Error, fmt, io, path::PathBuf}; -use crate::snapshot::InstanceSnapshot; - -pub type SnapshotResult<'a> = Result>, SnapshotError>; +use crate::{imfs::FsError, snapshot::InstanceSnapshot}; #[derive(Debug)] pub struct SnapshotError { @@ -58,8 +56,19 @@ impl fmt::Display for SnapshotError { } } +impl From for SnapshotError { + fn from(error: FsError) -> Self { + let (inner, path) = error.into_raw(); + + let detail = SnapshotErrorDetail::IoError { inner }; + + Self::new(detail, Some(path)) + } +} + #[derive(Debug)] pub enum SnapshotErrorDetail { + IoError { inner: io::Error }, FileDidNotExist, FileNameBadUnicode, FileContentsBadUnicode { inner: std::str::Utf8Error }, @@ -70,6 +79,7 @@ impl SnapshotErrorDetail { use self::SnapshotErrorDetail::*; match self { + IoError { inner } => Some(inner), FileContentsBadUnicode { inner } => Some(inner), _ => None, } @@ -81,6 +91,7 @@ impl fmt::Display for SnapshotErrorDetail { use self::SnapshotErrorDetail::*; match self { + IoError { inner } => write!(formatter, "I/O error: {}", inner), FileDidNotExist => write!(formatter, "file did not exist"), FileNameBadUnicode => write!(formatter, "file name had malformed Unicode"), FileContentsBadUnicode { inner } => {