From 168f10303558580840434eeb47ca65e3b2b9b5db Mon Sep 17 00:00:00 2001 From: Josh Triplett Date: Sun, 16 Feb 2025 21:06:11 +0100 Subject: Add `Hash::from_slice` to handle conversion from `&[u8]` bytes This is a convenience method, to avoid having to first call `<[u8; 32]>::try_from(slice)?`. --- src/lib.rs | 7 +++++++ src/test.rs | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 37c2c0b..355668f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -236,6 +236,13 @@ impl Hash { Self(bytes) } + /// Create a `Hash` from its raw bytes representation as a slice. + /// + /// Returns an error if the slice is not exactly 32 bytes long. + pub fn from_slice(bytes: &[u8]) -> Result { + Ok(Self::from_bytes(bytes.try_into()?)) + } + /// Encode a `Hash` in lowercase hexadecimal. /// /// The returned [`ArrayString`] is a fixed size and doesn't allocate memory diff --git a/src/test.rs b/src/test.rs index 3041b0c..506d7aa 100644 --- a/src/test.rs +++ b/src/test.rs @@ -763,6 +763,16 @@ fn test_hash_conversions() { let hex = hash1.to_hex(); let hash3 = crate::Hash::from_hex(hex.as_bytes()).unwrap(); assert_eq!(hash1, hash3); + + let slice1: &[u8] = bytes1.as_slice(); + let hash4 = crate::Hash::from_slice(slice1).expect("correct length"); + assert_eq!(hash1, hash4); + + assert!(crate::Hash::from_slice(&[]).is_err()); + assert!(crate::Hash::from_slice(&[42]).is_err()); + assert!(crate::Hash::from_slice([42; 31].as_slice()).is_err()); + assert!(crate::Hash::from_slice([42; 33].as_slice()).is_err()); + assert!(crate::Hash::from_slice([42; 100].as_slice()).is_err()); } #[test] -- cgit v1.2.3