• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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