mock_digest/lib.rs
1//! This crate provides a mock of the [`Update`] trait from the [`digest`] crate.
2//! Its primary use is testing the `fingerprint-struct` crate.
3
4use digest::{Reset, Update};
5
6/// A mock of the [`Update`] trait
7///
8/// Instead of actually hashing its input, it just collects all bytes and stores them.
9///
10/// # Examples
11/// ```
12/// use digest::Update;
13/// use mock_digest::MockDigest;
14///
15/// let mut mock_digest = MockDigest::default();
16///
17/// mock_digest.update(&[1, 2]);
18/// mock_digest.update(&[3]);
19///
20/// assert_eq!(&[1, 2, 3], mock_digest.as_ref());
21/// ```
22#[derive(Hash, Debug, Clone, Default)]
23pub struct MockDigest {
24 input: Vec<u8>,
25}
26
27impl Update for MockDigest {
28 /// Collect and store bytes
29 fn update(&mut self, data: &[u8]) {
30 self.input.extend_from_slice(data)
31 }
32}
33
34impl Reset for MockDigest {
35 /// Resets hasher to initial state, discarding all stored bytes.
36 fn reset(&mut self) {
37 self.input = Vec::new();
38 }
39}
40
41impl From<MockDigest> for Vec<u8> {
42 /// Extracts collected bytes.
43 fn from(src: MockDigest) -> Self {
44 src.input
45 }
46}
47
48impl AsRef<[u8]> for MockDigest {
49 /// Gets collected bytes as a slice.
50 fn as_ref(&self) -> &[u8] {
51 &self.input
52 }
53}