changeset 146:4a41aab21046

Separate out error types into new module
author Lewin Bormann <lbo@spheniscida.de>
date Sun, 29 Jan 2017 13:53:45 +0100
parents 27a0d7c61a78
children 3cc327257435
files src/error.rs src/lib.rs src/types.rs
diffstat 3 files changed, 88 insertions(+), 60 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/error.rs	Sun Jan 29 13:53:45 2017 +0100
@@ -0,0 +1,87 @@
+use std::convert::From;
+use std::error::Error;
+use std::fmt::{self, Display, Formatter};
+use std::io;
+use std::result;
+
+#[derive(Clone, Debug)]
+#[allow(dead_code)]
+pub enum StatusCode {
+    OK,
+
+    AlreadyExists,
+    Corruption,
+    IOError,
+    InvalidArgument,
+    InvalidData,
+    NotFound,
+    NotSupported,
+    PermissionDenied,
+    Unknown,
+}
+
+#[derive(Clone, Debug)]
+pub struct Status {
+    code: StatusCode,
+    err: String,
+}
+
+impl Default for Status {
+    fn default() -> Status {
+        Status {
+            code: StatusCode::OK,
+            err: String::new(),
+        }
+    }
+}
+
+impl Display for Status {
+    fn fmt(&self, fmt: &mut Formatter) -> result::Result<(), fmt::Error> {
+        fmt.write_str(self.description())
+    }
+}
+
+impl Error for Status {
+    fn description(&self) -> &str {
+        &self.err
+    }
+}
+
+impl Status {
+    pub fn new(code: StatusCode, msg: &str) -> Status {
+        let err;
+        if msg.is_empty() {
+            err = format!("{:?}", code)
+        } else {
+            err = format!("{:?}: {}", code, msg);
+        }
+        return Status {
+            code: code,
+            err: err,
+        };
+    }
+}
+
+impl From<io::Error> for Status {
+    fn from(e: io::Error) -> Status {
+        let c = match e.kind() {
+            io::ErrorKind::NotFound => StatusCode::NotFound,
+            io::ErrorKind::InvalidData => StatusCode::Corruption,
+            io::ErrorKind::InvalidInput => StatusCode::InvalidArgument,
+            io::ErrorKind::PermissionDenied => StatusCode::PermissionDenied,
+            _ => StatusCode::IOError,
+        };
+
+        Status::new(c, e.description())
+    }
+}
+
+/// LevelDB's result type
+pub type Result<T> = result::Result<T, Status>;
+
+pub fn from_io_result<T>(e: io::Result<T>) -> Result<T> {
+    match e {
+        Ok(r) => result::Result::Ok(r),
+        Err(e) => Err(Status::from(e)),
+    }
+}
--- a/src/lib.rs	Sun Jan 29 13:13:34 2017 +0100
+++ b/src/lib.rs	Sun Jan 29 13:53:45 2017 +0100
@@ -11,6 +11,7 @@
 mod cmp;
 mod disk_env;
 mod env;
+mod error;
 mod filter;
 mod filter_block;
 mod key_types;
--- a/src/types.rs	Sun Jan 29 13:13:34 2017 +0100
+++ b/src/types.rs	Sun Jan 29 13:53:45 2017 +0100
@@ -1,10 +1,5 @@
 //! A collection of fundamental and/or simple types used by other modules
 
-use std::error::Error;
-use std::fmt::{self, Display, Formatter};
-use std::io;
-use std::result;
-
 #[derive(Debug, PartialOrd, PartialEq)]
 pub enum ValueType {
     TypeDeletion = 0,
@@ -16,61 +11,6 @@
 
 pub const MAX_SEQUENCE_NUMBER: SequenceNumber = (1 << 56) - 1;
 
-#[derive(Clone, Debug)]
-#[allow(dead_code)]
-pub enum Status {
-    OK,
-    NotFound(String),
-    Corruption(String),
-    NotSupported(String),
-    InvalidArgument(String),
-    PermissionDenied(String),
-    IOError(String),
-    Unknown(String),
-}
-
-impl Display for Status {
-    fn fmt(&self, fmt: &mut Formatter) -> result::Result<(), fmt::Error> {
-        fmt.write_str(self.description())
-    }
-}
-
-impl Error for Status {
-    fn description(&self) -> &str {
-        match *self {
-            Status::OK => "ok",
-            Status::NotFound(ref s) => s,
-            Status::Corruption(ref s) => s,
-            Status::NotSupported(ref s) => s,
-            Status::InvalidArgument(ref s) => s,
-            Status::PermissionDenied(ref s) => s,
-            Status::IOError(ref s) => s,
-            Status::Unknown(ref s) => s,
-        }
-    }
-}
-
-/// LevelDB's result type
-pub type Result<T> = result::Result<T, Status>;
-
-pub fn from_io_result<T>(e: io::Result<T>) -> Result<T> {
-    match e {
-        Ok(r) => result::Result::Ok(r),
-        Err(e) => {
-            let err = e.description().to_string();
-
-            let r = match e.kind() {
-                io::ErrorKind::NotFound => Err(Status::NotFound(err)),
-                io::ErrorKind::InvalidData => Err(Status::Corruption(err)),
-                io::ErrorKind::InvalidInput => Err(Status::InvalidArgument(err)),
-                io::ErrorKind::PermissionDenied => Err(Status::PermissionDenied(err)),
-                _ => Err(Status::IOError(err)),
-            };
-
-            r
-        }
-    }
-}
 
 /// Denotes a key range
 pub struct Range<'a> {