1 /// Error when decoding the IPv6 header. 2 #[derive(Clone, Debug, Eq, PartialEq, Hash)] 3 pub enum HeaderError { 4 /// Error when the IPv6 header version field is not equal to 6. 5 UnexpectedVersion { 6 /// The unexpected version number in the IPv6 header. 7 version_number: u8, 8 }, 9 } 10 11 impl core::fmt::Display for HeaderError { fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result12 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { 13 use HeaderError::*; 14 match self { 15 UnexpectedVersion { version_number } => write!(f, "IPv6 Header Error: Encountered '{}' as IP version number in the IPv6 header (must be '6' in an IPv6 header).", version_number), 16 } 17 } 18 } 19 20 #[cfg(feature = "std")] 21 #[cfg_attr(docsrs, doc(cfg(feature = "std")))] 22 impl std::error::Error for HeaderError { source(&self) -> Option<&(dyn std::error::Error + 'static)>23 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { 24 None 25 } 26 } 27 28 #[cfg(test)] 29 mod tests { 30 use super::{HeaderError::*, *}; 31 use alloc::format; 32 use std::{ 33 collections::hash_map::DefaultHasher, 34 error::Error, 35 hash::{Hash, Hasher}, 36 }; 37 38 #[test] debug()39 fn debug() { 40 assert_eq!( 41 "UnexpectedVersion { version_number: 1 }", 42 format!("{:?}", UnexpectedVersion { version_number: 1 }) 43 ); 44 } 45 46 #[test] clone_eq_hash()47 fn clone_eq_hash() { 48 let err = HeaderError::UnexpectedVersion { version_number: 6 }; 49 assert_eq!(err, err.clone()); 50 let hash_a = { 51 let mut hasher = DefaultHasher::new(); 52 err.hash(&mut hasher); 53 hasher.finish() 54 }; 55 let hash_b = { 56 let mut hasher = DefaultHasher::new(); 57 err.clone().hash(&mut hasher); 58 hasher.finish() 59 }; 60 assert_eq!(hash_a, hash_b); 61 } 62 63 #[test] fmt()64 fn fmt() { 65 assert_eq!( 66 "IPv6 Header Error: Encountered '1' as IP version number in the IPv6 header (must be '6' in an IPv6 header).", 67 format!("{}", UnexpectedVersion{ version_number: 1 }) 68 ); 69 } 70 71 #[cfg(feature = "std")] 72 #[test] source()73 fn source() { 74 let values = [UnexpectedVersion { version_number: 0 }]; 75 for v in values { 76 assert!(v.source().is_none()); 77 } 78 } 79 } 80