error.rs (3529B)
1 use core::fmt; 2 3 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 4 pub enum RadrootsProtectedStoreError { 5 EntropyUnavailable, 6 UnsupportedEnvelopeVersion(u8), 7 InvalidStoreKeyLength(usize), 8 EnvelopeEncodeFailed, 9 EnvelopeDecodeFailed, 10 KeyWrapFailed, 11 KeyUnwrapFailed, 12 EncryptFailed, 13 DecryptFailed, 14 } 15 16 impl fmt::Display for RadrootsProtectedStoreError { 17 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 18 match self { 19 Self::EntropyUnavailable => f.write_str("protected-store entropy is unavailable"), 20 Self::UnsupportedEnvelopeVersion(version) => { 21 write!( 22 f, 23 "protected-store envelope version {version} is unsupported" 24 ) 25 } 26 Self::InvalidStoreKeyLength(length) => { 27 write!(f, "protected-store key must be 32 bytes, got {length}") 28 } 29 Self::EnvelopeEncodeFailed => f.write_str("protected-store envelope encoding failed"), 30 Self::EnvelopeDecodeFailed => f.write_str("protected-store envelope decoding failed"), 31 Self::KeyWrapFailed => f.write_str("protected-store key wrapping failed"), 32 Self::KeyUnwrapFailed => f.write_str("protected-store key unwrapping failed"), 33 Self::EncryptFailed => f.write_str("protected-store encryption failed"), 34 Self::DecryptFailed => f.write_str("protected-store decryption failed"), 35 } 36 } 37 } 38 39 #[cfg(feature = "std")] 40 impl std::error::Error for RadrootsProtectedStoreError {} 41 42 #[cfg(test)] 43 mod tests { 44 use super::*; 45 use alloc::string::ToString; 46 47 #[test] 48 fn display_covers_all_error_variants() { 49 let cases = [ 50 ( 51 RadrootsProtectedStoreError::EntropyUnavailable, 52 "protected-store entropy is unavailable", 53 ), 54 ( 55 RadrootsProtectedStoreError::UnsupportedEnvelopeVersion(7), 56 "protected-store envelope version 7 is unsupported", 57 ), 58 ( 59 RadrootsProtectedStoreError::InvalidStoreKeyLength(31), 60 "protected-store key must be 32 bytes, got 31", 61 ), 62 ( 63 RadrootsProtectedStoreError::EnvelopeEncodeFailed, 64 "protected-store envelope encoding failed", 65 ), 66 ( 67 RadrootsProtectedStoreError::EnvelopeDecodeFailed, 68 "protected-store envelope decoding failed", 69 ), 70 ( 71 RadrootsProtectedStoreError::KeyWrapFailed, 72 "protected-store key wrapping failed", 73 ), 74 ( 75 RadrootsProtectedStoreError::KeyUnwrapFailed, 76 "protected-store key unwrapping failed", 77 ), 78 ( 79 RadrootsProtectedStoreError::EncryptFailed, 80 "protected-store encryption failed", 81 ), 82 ( 83 RadrootsProtectedStoreError::DecryptFailed, 84 "protected-store decryption failed", 85 ), 86 ]; 87 88 for (error, expected) in cases { 89 assert_eq!(error.to_string(), expected); 90 } 91 } 92 93 #[cfg(feature = "std")] 94 #[test] 95 fn error_trait_is_available_with_std() { 96 let error = RadrootsProtectedStoreError::DecryptFailed; 97 let dyn_error: &dyn std::error::Error = &error; 98 99 assert_eq!(dyn_error.to_string(), "protected-store decryption failed"); 100 } 101 }