1use bytemuck::{Pod, Zeroable};
2
3pub const HASH_BYTES: usize = 32;
4
5#[repr(C)]
6#[derive(Clone, Copy, PartialEq, Debug, Default, Pod, Zeroable)]
7pub struct Hash {
8 pub(crate) value: [u8; 32]
9}
10
11impl From<Hash> for [u8; HASH_BYTES] {
12 fn from(from: Hash) -> Self {
13 from.value
14 }
15}
16
17impl From<[u8; HASH_BYTES]> for Hash {
18 fn from(from: [u8; 32]) -> Self {
19 Self { value: from }
20 }
21}
22
23impl AsRef<[u8]> for Hash {
24 fn as_ref(&self) -> &[u8] {
25 &self.value
26 }
27}
28
29impl Hash {
30 pub const LEN: usize = HASH_BYTES;
31
32 pub fn new(hash_slice: &[u8]) -> Self {
33 Hash { value: <[u8; HASH_BYTES]>::try_from(hash_slice).unwrap() }
34 }
35
36 pub const fn new_from_array(hash_array: [u8; HASH_BYTES]) -> Self {
37 Self { value: hash_array }
38 }
39
40 pub fn to_bytes(self) -> [u8; HASH_BYTES] {
41 self.value
42 }
43}