pub trait OptionExt<T> {
fn unpack(self) -> Result<T, OptionError>;
fn unpack_for(self, param_name: &'static str) -> Result<T, OptionError>;
}
impl<T> OptionExt<T> for Option<T> {
fn unpack(self) -> Result<T, OptionError> {
if let Some(v) = self {
Ok(v)
} else {
Err(OptionError::CanNotBeNull)
}
}
fn unpack_for(self, param_name: &'static str) -> Result<T, OptionError> {
if let Some(v) = self {
Ok(v)
} else {
Err(OptionError::CanNotBeNullFor(param_name))
}
}
}
use std::fmt;
use std::error::Error;
#[derive(Debug, Clone)]
pub enum OptionError {
CanNotBeNull,
CanNotBeNullFor(&'static str),
}
impl fmt::Display for OptionError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
OptionError::CanNotBeNull => write!(f, "param can not be null"),
OptionError::CanNotBeNullFor(msg) => write!(f, "{} can not be null", msg),
}
}
}
impl Error for OptionError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
None }
}