|
|
|
@ -105,16 +105,19 @@ impl<T, E: error::Error> Mappable<T> for result::Result<T, E> { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static OPTION_NONE_ERROR: &str = "expected Some but got None"; |
|
|
|
|
#[derive(thiserror::Error, Debug)] |
|
|
|
|
enum OptionError { |
|
|
|
|
#[error("required but not given")] |
|
|
|
|
None, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl<T> Mappable<T> for Option<T> { |
|
|
|
|
fn or_unexpected(self) -> Result<T> { |
|
|
|
|
self.ok_or(Error::from(OPTION_NONE_ERROR)).or_unexpected() |
|
|
|
|
self.ok_or(OptionError::None).or_unexpected() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn or_unexpected_while<D: fmt::Display>(self, prefix: D) -> Result<T> { |
|
|
|
|
self.ok_or(Error::from(OPTION_NONE_ERROR)) |
|
|
|
|
.or_unexpected_while(prefix) |
|
|
|
|
self.ok_or(OptionError::None).or_unexpected_while(prefix) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn map_unexpected_while<F, D>(self, f: F) -> Result<T> |
|
|
|
@ -122,8 +125,7 @@ impl<T> Mappable<T> for Option<T> { |
|
|
|
|
F: FnOnce() -> D, |
|
|
|
|
D: fmt::Display, |
|
|
|
|
{ |
|
|
|
|
self.ok_or(Error::from(OPTION_NONE_ERROR)) |
|
|
|
|
.map_unexpected_while(f) |
|
|
|
|
self.ok_or(OptionError::None).map_unexpected_while(f) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|