blob: b7871a6a4e7194ff5f619fcded19eaf322b2e228 [file] [log] [blame]
use scanlex::ScanError;
use std::error::Error;
use std::fmt;
#[derive(Debug)]
pub struct DateError {
details: String,
}
impl fmt::Display for DateError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f,"{}",self.details)
}
}
impl Error for DateError {
fn description(&self) -> &str {
&self.details
}
}
pub type DateResult<T> = Result<T,DateError>;
pub fn date_error(msg: &str) -> DateError {
DateError{details: msg.into()}
}
pub fn date_result<T>(msg: &str) -> DateResult<T> {
Err(date_error(msg).into())
}
impl From<ScanError> for DateError {
fn from(err: ScanError) -> DateError {
date_error(err.description())
}
}
/// This trait maps optional values onto `DateResult`
pub trait OrErr<T> {
/// use when the error message is always a simple string
fn or_err(self, msg: &str) -> DateResult<T>;
/// use when the message needs to be constructed
fn or_then_err<C: FnOnce()->String>(self,fun:C) -> DateResult<T>;
}
impl <T>OrErr<T> for Option<T> {
fn or_err(self, msg: &str) -> DateResult<T> {
self.ok_or(date_error(msg))
}
fn or_then_err<C: FnOnce()->String>(self,fun:C) -> DateResult<T> {
self.ok_or_else(|| date_error(&fun()))
}
}