1use super::{Harvest, Multihash, MultihashError};
10use crypto_sha1 as digester;
11use crypto_sha1::Digest;
12use tag::Tag;
13use uvar::Uvar;
14
15#[derive(Debug, PartialEq)]
16pub struct Sha1;
17
18impl Default for Sha1 {
19 fn default() -> Self {
20 Sha1
21 }
22}
23
24impl From<Sha1> for Uvar {
25 fn from(hash: Sha1) -> Uvar {
26 hash.code()
27 }
28}
29
30impl From<Uvar> for Result<Sha1, MultihashError> {
31 fn from(code: Uvar) -> Result<Sha1, MultihashError> {
32 let n: u64 = code.into();
33
34 if n == 0x11 {
35 Ok(Sha1)
36 } else {
37 Err(MultihashError::Unknown)
38 }
39 }
40}
41
42impl Multihash for Sha1 {
43 type Digester = digester::Sha1;
44
45 fn name(&self) -> &'static str {
46 "sha1"
47 }
48
49 fn code(&self) -> Uvar {
50 Uvar::from(0x11)
51 }
52
53 fn length(&self) -> u8 {
54 20
55 }
56
57 fn digest_primitive(&self, tag: Tag, bytes: &[u8]) -> Harvest {
58 let mut digester = Self::Digester::default();
59 digester.input(&tag.to_bytes());
60 digester.input(bytes);
61 digester.result().as_ref().to_vec().into()
62 }
63
64 fn digest_collection(&self, tag: Tag, list: Vec<Vec<u8>>) -> Harvest {
65 let mut digester = Self::Digester::default();
66 digester.input(&tag.to_bytes());
67
68 for bytes in list {
69 digester.input(&bytes);
70 }
71
72 digester.result().as_ref().to_vec().into()
73 }
74}