use std::fmt;
use std::num::ParseFloatError;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DecimalParseError {
Empty,
Invalid,
Overflow,
Underflow,
}
impl fmt::Display for DecimalParseError {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match &self {
DecimalParseError::Empty => write!(f, "cannot parse number from empty string"),
DecimalParseError::Invalid => write!(f, "invalid number"),
DecimalParseError::Overflow => write!(f, "numeric overflow"),
DecimalParseError::Underflow => write!(f, "numeric underflow"),
}
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum DecimalConvertError {
Invalid,
Overflow,
}
impl fmt::Display for DecimalConvertError {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match &self {
DecimalConvertError::Invalid => write!(f, "invalid number"),
DecimalConvertError::Overflow => write!(f, "numeric overflow"),
}
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum DecimalFormatError {
Format(fmt::Error),
OutOfRange,
}
impl std::error::Error for DecimalFormatError {
#[inline]
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match &self {
DecimalFormatError::Format(e) => Some(e),
DecimalFormatError::OutOfRange => None,
}
}
}
impl fmt::Display for DecimalFormatError {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match &self {
DecimalFormatError::Format(e) => write!(f, "{}", e),
DecimalFormatError::OutOfRange => write!(f, "Data value out of range"),
}
}
}
impl From<DecimalParseError> for DecimalConvertError {
#[inline]
fn from(e: DecimalParseError) -> Self {
match e {
DecimalParseError::Empty | DecimalParseError::Invalid => DecimalConvertError::Invalid,
DecimalParseError::Overflow | DecimalParseError::Underflow => DecimalConvertError::Overflow,
}
}
}
impl From<ParseFloatError> for DecimalConvertError {
#[inline]
fn from(_: ParseFloatError) -> Self {
DecimalConvertError::Invalid
}
}
impl From<fmt::Error> for DecimalFormatError {
#[inline]
fn from(e: fmt::Error) -> Self {
DecimalFormatError::Format(e)
}
}