use crate::fields;
use displaydoc::Display;
#[derive(Display, Debug, Copy, Clone, PartialEq)]
#[non_exhaustive]
pub enum SkeletonError {
#[displaydoc("field too long in skeleton")]
InvalidFieldLength,
#[displaydoc("duplicate field in skeleton")]
DuplicateField,
#[displaydoc("symbol unknown {0} in skeleton")]
SymbolUnknown(char),
#[displaydoc("symbol invalid {0} in skeleton")]
SymbolInvalid(u8),
#[displaydoc("symbol unimplemented {0} in skeleton")]
SymbolUnimplemented(char),
#[displaydoc("unimplemented field {0} in skeleton")]
UnimplementedField(char),
#[displaydoc("skeleton has a variant subtag")]
SkeletonHasVariant,
#[displaydoc("{0}")]
Fields(fields::Error),
}
#[cfg(feature = "std")]
impl std::error::Error for SkeletonError {}
#[cfg(feature = "experimental")]
impl From<SkeletonError> for crate::DateTimeError {
fn from(e: SkeletonError) -> Self {
crate::DateTimeError::Skeleton(e)
}
}
impl From<fields::Error> for SkeletonError {
fn from(e: fields::Error) -> Self {
SkeletonError::Fields(e)
}
}
impl From<fields::LengthError> for SkeletonError {
fn from(_: fields::LengthError) -> Self {
Self::InvalidFieldLength
}
}
impl From<fields::SymbolError> for SkeletonError {
fn from(symbol_error: fields::SymbolError) -> Self {
match symbol_error {
fields::SymbolError::Invalid(ch) => match ch {
b'-' => Self::SkeletonHasVariant,
_ => Self::SymbolInvalid(ch),
},
fields::SymbolError::InvalidIndex(_) => unimplemented!(),
fields::SymbolError::Unknown(ch) => {
match ch {
'B'
| 'Q'
=> Self::SymbolUnimplemented(ch),
_ => Self::SymbolUnknown(ch),
}
}
}
}
}