use core::fmt;
use crate::error::ParseError;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Ipv6ExtensionTraversalError {
Parse(ParseError),
InvalidExtensionHeaderLength {
next_header: u8,
minimum: usize,
actual: usize,
},
UnresolvedPayloadLength,
}
impl fmt::Display for Ipv6ExtensionTraversalError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Parse(error) => write!(formatter, "IPv6 extension traversal failed: {error}"),
Self::InvalidExtensionHeaderLength {
next_header,
minimum,
actual,
} => write!(
formatter,
"invalid IPv6 extension header length for next header {next_header}: minimum {minimum}, got {actual}"
),
Self::UnresolvedPayloadLength => {
formatter.write_str("IPv6 payload length is unresolved")
}
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Ipv6DispatchError {
Traversal(Ipv6ExtensionTraversalError),
UpperLayer(ParseError),
}
impl fmt::Display for Ipv6DispatchError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Traversal(error) => write!(formatter, "IPv6 dispatch traversal failed: {error}"),
Self::UpperLayer(error) => {
write!(formatter, "IPv6 upper-layer parsing failed: {error}")
}
}
}
}