1 use crate::*; 2 3 /// Error when decoding the IP extension header. 4 #[derive(Clone, Debug, Eq, PartialEq, Hash)] 5 pub enum HeaderError { 6 /// Error in the IPv4 extension headers (only authentication header). 7 Ipv4Ext(err::ip_auth::HeaderError), 8 9 /// Error in the IPv6 extension headers. 10 Ipv6Ext(err::ipv6_exts::HeaderError), 11 } 12 13 impl core::fmt::Display for HeaderError { fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result14 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { 15 use HeaderError::*; 16 match self { 17 Ipv4Ext(err) => err.fmt(f), 18 Ipv6Ext(err) => err.fmt(f), 19 } 20 } 21 } 22 23 #[cfg(feature = "std")] 24 #[cfg_attr(docsrs, doc(cfg(feature = "std")))] 25 impl std::error::Error for HeaderError { source(&self) -> Option<&(dyn std::error::Error + 'static)>26 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { 27 use HeaderError::*; 28 match self { 29 Ipv4Ext(err) => Some(err), 30 Ipv6Ext(err) => Some(err), 31 } 32 } 33 } 34 35 #[cfg(test)] 36 mod tests { 37 use super::{super::HeaderError::*, *}; 38 use alloc::format; 39 use std::{ 40 collections::hash_map::DefaultHasher, 41 error::Error, 42 hash::{Hash, Hasher}, 43 }; 44 45 #[test] debug()46 fn debug() { 47 assert_eq!( 48 "Ipv4Ext(ZeroPayloadLen)", 49 format!("{:?}", Ipv4Ext(err::ip_auth::HeaderError::ZeroPayloadLen)) 50 ); 51 } 52 53 #[test] clone_eq_hash()54 fn clone_eq_hash() { 55 let err = Ipv4Ext(err::ip_auth::HeaderError::ZeroPayloadLen); 56 assert_eq!(err, err.clone()); 57 let hash_a = { 58 let mut hasher = DefaultHasher::new(); 59 err.hash(&mut hasher); 60 hasher.finish() 61 }; 62 let hash_b = { 63 let mut hasher = DefaultHasher::new(); 64 err.clone().hash(&mut hasher); 65 hasher.finish() 66 }; 67 assert_eq!(hash_a, hash_b); 68 } 69 70 #[test] fmt()71 fn fmt() { 72 { 73 let err = err::ip_auth::HeaderError::ZeroPayloadLen; 74 assert_eq!(format!("{}", Ipv4Ext(err.clone())), format!("{}", err)); 75 } 76 { 77 let err = err::ipv6_exts::HeaderError::HopByHopNotAtStart; 78 assert_eq!(format!("{}", Ipv6Ext(err.clone())), format!("{}", err)); 79 } 80 } 81 82 #[cfg(feature = "std")] 83 #[test] source()84 fn source() { 85 let values = [ 86 Ipv4Ext(err::ip_auth::HeaderError::ZeroPayloadLen), 87 Ipv6Ext(err::ipv6_exts::HeaderError::HopByHopNotAtStart), 88 ]; 89 for v in values { 90 assert!(v.source().is_some()); 91 } 92 } 93 } 94