use std::error::Error;
use std::fmt::{self, Display};
#[derive(Debug)]
pub struct UnknownDiscriminant<T> {
pub ident: &'static str,
pub discriminant: T,
}
#[derive(Debug)]
pub struct InsufficientBytes;
#[derive(Debug)]
pub struct InvalidChar;
#[derive(Debug)]
pub struct IntegerOverflow;
#[derive(Debug)]
pub struct InvalidBoolValue;
impl<T> Error for UnknownDiscriminant<T> where T: std::fmt::Debug + Display {}
impl Error for InsufficientBytes {}
impl Error for InvalidChar {}
impl Error for IntegerOverflow {}
impl Error for InvalidBoolValue {}
impl<D> UnknownDiscriminant<D>
where
D: std::fmt::Debug + Display + Send + Sync + 'static,
{
#[inline]
#[doc(hidden)]
pub fn new_boxed_err<T>(ident: &'static str, discriminant: D) -> crate::Result<T> {
Err(Box::new(Self {
ident,
discriminant,
}))
}
}
impl<T: Display> Display for UnknownDiscriminant<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let Self {
ident,
discriminant,
} = self;
writeln!(f, "unknown `{discriminant}` discriminator of `{ident}`")
}
}
impl Display for InsufficientBytes {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
writeln!(f, "insufficient bytes")
}
}
impl Display for InvalidChar {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
writeln!(f, "invalid char")
}
}
impl Display for IntegerOverflow {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
writeln!(f, "out of range integral type conversion attempted")
}
}
impl Display for InvalidBoolValue {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
writeln!(f, "invalid value for bool type: expected 0 or 1")
}
}