use std::error::Error as IError;
use std::fmt;
use std::io;
use std::time;
#[derive(Debug, PartialEq)]
pub enum Cause {
AlreadyExists,
NotFound,
ConcurrencyError,
InvalidData,
InvalidState,
SerializationError,
IOError,
TimeError,
GeneralError(String),
}
#[derive(Debug)]
pub struct Error {
pub cause: Cause,
pub message: String,
}
impl Error {
pub fn new(cause: Cause, msg: &str) -> Error {
Error {
cause,
message: String::from(msg),
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "[{:?}] - {}", self.cause, self.message)
}
}
impl IError for Error {}
impl From<io::Error> for Error {
fn from(v: io::Error) -> Error {
Error::new(Cause::IOError, &format!("{}", v))
}
}
impl From<time::SystemTimeError> for Error {
fn from(v: time::SystemTimeError) -> Error {
Error::new(Cause::TimeError, &format!("{}", v))
}
}
pub type CausedResult<T> = Result<T, Error>;