#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Incomplete {
pub needed: usize,
pub available: usize,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct TrailingBytes(pub usize);
impl core::fmt::Display for Incomplete {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(
f,
"incomplete input: needed {} bytes, {} available",
self.needed, self.available
)
}
}
impl core::error::Error for Incomplete {}
impl core::fmt::Display for TrailingBytes {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{} trailing bytes after decode", self.0)
}
}
impl core::error::Error for TrailingBytes {}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct InvalidWidth {
pub max: usize,
pub got: usize,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct InsufficientBuffer {
pub needed: usize,
pub available: usize,
}
impl core::fmt::Display for InvalidWidth {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "invalid width: got {}, max {}", self.got, self.max)
}
}
impl core::error::Error for InvalidWidth {}
impl core::fmt::Display for InsufficientBuffer {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(
f,
"insufficient buffer: needed {} bytes, {} available",
self.needed, self.available
)
}
}
impl core::error::Error for InsufficientBuffer {}
#[cfg(test)]
mod tests {
use super::*;
use std::string::ToString;
#[test]
fn incomplete_display() {
let e = Incomplete {
needed: 4,
available: 1,
};
assert_eq!(
e.to_string(),
"incomplete input: needed 4 bytes, 1 available"
);
}
#[test]
fn trailing_display() {
assert_eq!(
TrailingBytes(3).to_string(),
"3 trailing bytes after decode"
);
}
fn assert_is_error<T: core::error::Error>() {}
#[test]
fn impl_core_error() {
assert_is_error::<Incomplete>();
assert_is_error::<TrailingBytes>();
}
#[test]
fn invalid_width_display() {
let e = InvalidWidth { max: 16, got: 255 };
assert_eq!(e.to_string(), "invalid width: got 255, max 16");
}
#[test]
fn insufficient_buffer_display() {
let e = InsufficientBuffer {
needed: 8,
available: 4,
};
assert_eq!(
e.to_string(),
"insufficient buffer: needed 8 bytes, 4 available"
);
}
#[test]
fn new_fragments_impl_core_error() {
assert_is_error::<InvalidWidth>();
assert_is_error::<InsufficientBuffer>();
}
}