| use core::fmt; |
| |
| /// The error type for decoding a hex string into `Vec<u8>` or `[u8; N]`. |
| #[derive(Debug, Clone, Copy, PartialEq)] |
| pub enum FromHexError { |
| /// An invalid character was found. Valid ones are: `0...9`, `a...f` |
| /// or `A...F`. |
| InvalidHexCharacter { c: char, index: usize }, |
| |
| /// A hex string's length needs to be even, as two digits correspond to |
| /// one byte. |
| OddLength, |
| |
| /// If the hex string is decoded into a fixed sized container, such as an |
| /// array, the hex string's length * 2 has to match the container's |
| /// length. |
| InvalidStringLength, |
| } |
| |
| #[cfg(feature = "std")] |
| impl std::error::Error for FromHexError {} |
| |
| impl fmt::Display for FromHexError { |
| fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| match *self { |
| FromHexError::InvalidHexCharacter { c, index } => { |
| write!(f, "Invalid character {:?} at position {}", c, index) |
| } |
| FromHexError::OddLength => write!(f, "Odd number of digits"), |
| FromHexError::InvalidStringLength => write!(f, "Invalid string length"), |
| } |
| } |
| } |
| |
| #[cfg(test)] |
| // this feature flag is here to suppress unused |
| // warnings of `super::*` and `pretty_assertions::assert_eq` |
| #[cfg(feature = "alloc")] |
| mod tests { |
| use super::*; |
| #[cfg(feature = "alloc")] |
| use alloc::string::ToString; |
| use pretty_assertions::assert_eq; |
| |
| #[test] |
| #[cfg(feature = "alloc")] |
| fn test_display() { |
| assert_eq!( |
| FromHexError::InvalidHexCharacter { c: '\n', index: 5 }.to_string(), |
| "Invalid character '\\n' at position 5" |
| ); |
| |
| assert_eq!(FromHexError::OddLength.to_string(), "Odd number of digits"); |
| assert_eq!( |
| FromHexError::InvalidStringLength.to_string(), |
| "Invalid string length" |
| ); |
| } |
| } |