use crate::argument::{
ArgumentError,
ArgumentErrorKind,
ArgumentResult,
sealed::Sealed,
};
pub trait OptionArgument<T>: Sealed + Sized {
fn require_some(self, path: &str) -> ArgumentResult<T>;
fn validate_if_some<F>(self, validator: F) -> ArgumentResult<Self>
where
F: FnOnce(&T) -> ArgumentResult<()>;
}
impl<T> OptionArgument<T> for Option<T> {
#[inline]
fn require_some(self, path: &str) -> ArgumentResult<T> {
match self {
Some(value) => Ok(value),
None => Err(ArgumentError::new(path, ArgumentErrorKind::Missing)),
}
}
#[inline]
fn validate_if_some<F>(self, validator: F) -> ArgumentResult<Self>
where
F: FnOnce(&T) -> ArgumentResult<()>,
{
if let Some(value) = self.as_ref() {
validator(value)?;
}
Ok(self)
}
}