Mercurial > lbo > hg > leveldb-rs
view src/error.rs @ 379:57890f618949
block_builder: Introduce total-entries counter and add test for reset()
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sun, 08 Oct 2017 16:47:52 +0200 |
parents | 0c1c12771889 |
children | 4c3bc235f465 |
line wrap: on
line source
use std::convert::From; use std::error::Error; use std::fmt::{self, Display, Formatter}; use std::io; use std::result; use std::sync; #[derive(Clone, Debug, PartialEq)] #[allow(dead_code)] pub enum StatusCode { OK, AlreadyExists, Corruption, IOError, InvalidArgument, InvalidData, LockError, NotFound, NotSupported, PermissionDenied, Unknown, } #[derive(Clone, Debug, PartialEq)] pub struct Status { pub code: StatusCode, pub 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, }; } } /// LevelDB's result type pub type Result<T> = result::Result<T, Status>; /// err returns a new Status wrapped in a Result. pub fn err<T>(code: StatusCode, msg: &str) -> Result<T> { Err(Status::new(code, msg)) } 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()) } } impl<T> From<sync::PoisonError<T>> for Status { fn from(_: sync::PoisonError<T>) -> Status { Status::new(StatusCode::LockError, "lock poisoned") } }