use bincode;
use std::fmt;
use std::fmt::{Display, Formatter};
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum Error {
Db(String),
InvalidData(String),
ReportBug(String),
NotImplemented,
}
pub const BUG_REPORT_URL: &str = "https://gitlab.com/liberecofr/menhirkv/-/issues";
pub type Result<T> = std::result::Result<T, Error>;
impl Error {
pub(crate) fn db(why: &str) -> Error {
Error::Db(why.to_string())
}
pub(crate) fn invalid_data(why: &str) -> Error {
Error::InvalidData(why.to_string())
}
pub(crate) fn report_bug(why: &str) -> Error {
Error::ReportBug(why.to_string())
}
pub(crate) fn not_implemented() -> Error {
Error::NotImplemented
}
}
impl From<rocksdb::Error> for Error {
fn from(e: rocksdb::Error) -> Error {
Error::db(&format!("[rocksdb] {}", e))
}
}
impl From<bincode::Error> for Error {
fn from(e: bincode::Error) -> Error {
Error::invalid_data(&format!("[bincode] {}", e))
}
}
impl From<()> for Error {
fn from(_: ()) -> Error {
Error::not_implemented()
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter<'_>) -> std::result::Result<(), fmt::Error> {
match self {
Error::Db(e) => write!(f, "DB error: {}", e),
Error::InvalidData(e) => write!(f, "invalid data: {}", e),
Error::ReportBug(e) => write!(
f,
"unexpected bug, please report issue on <{}>: {}",
BUG_REPORT_URL, e
),
Error::NotImplemented => write!(f, "not implemented"),
}
}
}