use core::fmt;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum Field {
Key,
Id,
App,
Title,
Msg,
Progress,
}
impl Field {
pub const fn as_str(self) -> &'static str {
match self {
Field::Key => "key",
Field::Id => "id",
Field::App => "app",
Field::Title => "title",
Field::Msg => "msg",
Field::Progress => "progress",
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum Error {
SequenceTooLong,
TooLong(Field),
InvalidBase64(Field),
InvalidUtf8(Field),
ControlCharacter(Field),
MissingState,
UnknownState,
InvalidId,
InvalidApp,
InvalidProgress,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::SequenceTooLong => f.write_str("sequence exceeds 4096 bytes"),
Error::TooLong(field) => write!(f, "{} exceeds its length limit", field.as_str()),
Error::InvalidBase64(field) => write!(f, "{} is not valid base64", field.as_str()),
Error::InvalidUtf8(field) => write!(f, "{} is not valid UTF-8", field.as_str()),
Error::ControlCharacter(field) => {
write!(f, "{} contains a control character", field.as_str())
}
Error::MissingState => f.write_str("report has no state"),
Error::UnknownState => f.write_str("unrecognized state"),
Error::InvalidId => f.write_str("id does not match the id grammar"),
Error::InvalidApp => f.write_str("app does not match [A-Za-z0-9_.+-]{1,32}"),
Error::InvalidProgress => f.write_str("progress is not an integer 0 to 100"),
}
}
}
impl core::error::Error for Error {}