use core::convert;
use core::fmt;
use core::num::ParseIntError;
#[cfg(feature = "std")]
use std::error::Error;
#[cfg(feature = "std")]
use std::io::ErrorKind as IOError;
#[cfg(feature = "ut1")]
use reqwest::StatusCode;
use crate::Weekday;
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum Errors {
Carry,
ParseError(ParsingErrors),
ConversionOverlapError(f64, f64),
Overflow,
SystemTimeError,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum ParsingErrors {
ParseIntError,
ValueError,
TimeSystem,
ISO8601,
UnknownFormat,
UnknownOrMissingUnit,
UnsupportedTimeSystem,
UnknownWeekday,
UnknownMonthName,
UnknownFormattingToken(char),
UnexpectedCharacter {
found: char,
option1: Option<char>,
option2: Option<char>,
},
WeekdayMismatch {
found: Weekday,
expected: Weekday,
},
#[cfg(feature = "std")]
IOError(IOError),
#[cfg(feature = "ut1")]
DownloadError(StatusCode),
}
impl fmt::Display for Errors {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Self::Carry => write!(f, "a carry error (e.g. 61 seconds)"),
Self::ParseError(kind) => write!(f, "ParseError: {:?}", kind),
Self::ConversionOverlapError(hi, lo) => {
write!(f, "hi and lo values overlap: {}, {}", hi, lo)
}
Self::Overflow => write!(
f,
"overflow occured when trying to convert Duration information"
),
Self::SystemTimeError => write!(f, "std::time::SystemTime returned an error"),
}
}
}
impl convert::From<ParseIntError> for Errors {
fn from(_: ParseIntError) -> Self {
Errors::ParseError(ParsingErrors::ParseIntError)
}
}
#[cfg(feature = "std")]
impl Error for Errors {}
#[cfg(test)]
mod tests {
use crate::{Errors, ParsingErrors, TimeScale};
#[test]
fn enum_eq() {
assert!(Errors::Carry == Errors::Carry);
assert!(ParsingErrors::ParseIntError == ParsingErrors::ParseIntError);
assert!(TimeScale::ET == TimeScale::ET);
}
}