use std::fmt::{Display, Formatter};
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ParseError {
Empty,
BadFormat(String),
MissingField(&'static str),
ExtraField(String),
Type(&'static str),
TypeField {
expected: &'static str,
field: Option<&'static str>,
},
InvalidUtf8,
InvalidBase64(String),
OutOfRange(&'static str),
Nested(Box<ParseError>),
}
impl Display for ParseError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
ParseError::Empty => f.write_str("input is empty"),
ParseError::BadFormat(msg) => write!(f, "bad format: {msg}"),
ParseError::MissingField(name) => write!(f, "missing field: {name}"),
ParseError::ExtraField(name) => write!(f, "unexpected field: {name}"),
ParseError::Type(expected) => write!(f, "expected {expected}"),
ParseError::TypeField {
expected,
field: Some(name),
} => write!(f, "expected {expected} for field {name}"),
ParseError::TypeField {
expected,
field: None,
} => write!(f, "expected {expected}"),
ParseError::InvalidUtf8 => f.write_str("invalid UTF-8"),
ParseError::InvalidBase64(msg) => write!(f, "invalid base64: {msg}"),
ParseError::OutOfRange(what) => write!(f, "out of range: {what}"),
ParseError::Nested(inner) => write!(f, "{inner}"),
}
}
}
impl std::error::Error for ParseError {}