use std::fmt;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum BinaryError {
ReciprocalOverflow,
NegativeMantissa,
Nan,
Infinity,
}
impl fmt::Display for BinaryError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::ReciprocalOverflow => write!(f, "exponent overflow during reciprocal"),
Self::NegativeMantissa => {
write!(f, "cannot create unsigned binary from negative mantissa")
}
Self::Nan => write!(f, "cannot convert NaN to Binary"),
Self::Infinity => write!(f, "cannot convert infinity to Binary"),
}
}
}
impl std::error::Error for BinaryError {}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum XBinaryError {
Nan,
IndeterminateForm,
Binary(BinaryError),
}
impl fmt::Display for XBinaryError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Nan => write!(f, "cannot convert NaN to XBinary"),
Self::IndeterminateForm => write!(f, "indeterminate form (e.g., infinity - infinity)"),
Self::Binary(err) => write!(f, "{err}"),
}
}
}
impl std::error::Error for XBinaryError {}
impl From<BinaryError> for XBinaryError {
fn from(error: BinaryError) -> Self {
Self::Binary(error)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn binary_error_converts_to_xbinary_error() {
let binary_err = BinaryError::NegativeMantissa;
let xbinary_err: XBinaryError = binary_err.into();
assert!(matches!(
xbinary_err,
XBinaryError::Binary(BinaryError::NegativeMantissa)
));
}
}