use crate::argument::{
ArgumentError,
ArgumentErrorKind,
ArgumentResult,
ArgumentValue,
sealed::Sealed,
};
pub trait FloatArgument: Sealed + Sized {
fn require_finite(self, path: &str) -> ArgumentResult<Self>;
}
macro_rules! impl_float_argument {
($($float_type:ty),+ $(,)?) => {
$(
impl FloatArgument for $float_type {
#[inline]
fn require_finite(self, path: &str) -> ArgumentResult<Self> {
if self.is_nan() {
Err(ArgumentError::new(
path,
ArgumentErrorKind::NotANumber,
))
} else if self.is_finite() {
Ok(self)
} else {
Err(ArgumentError::new(
path,
ArgumentErrorKind::NotFinite {
actual: ArgumentValue::from(self),
},
))
}
}
}
)+
};
}
impl_float_argument!(f32, f64);