1#![warn(rust_2018_idioms, unused_lifetimes, unused_qualifications, clippy::all)]
5#![forbid(unsafe_code)]
6
7mod hash;
8mod reader;
9mod writer;
10
11pub use hash::{Error, Hash};
12pub use reader::Reader;
13pub use writer::Writer;
14
15impl Hash {
16 pub fn reader<T>(self, reader: T) -> Reader<T> {
17 let inner = match self.0 {
18 hash::Inner::Sha224(..) => reader::Inner::Sha224(Default::default()),
19 hash::Inner::Sha256(..) => reader::Inner::Sha256(Default::default()),
20 hash::Inner::Sha384(..) => reader::Inner::Sha384(Default::default()),
21 hash::Inner::Sha512(..) => reader::Inner::Sha512(Default::default()),
22 };
23
24 Reader {
25 reader,
26 inner,
27 hash: self,
28 }
29 }
30
31 pub fn writer<T>(&self, writer: T) -> Writer<T> {
32 let inner = match self.0 {
33 hash::Inner::Sha224(..) => writer::Inner::Sha224(Default::default()),
34 hash::Inner::Sha256(..) => writer::Inner::Sha256(Default::default()),
35 hash::Inner::Sha384(..) => writer::Inner::Sha384(Default::default()),
36 hash::Inner::Sha512(..) => writer::Inner::Sha512(Default::default()),
37 };
38
39 Writer { writer, inner }
40 }
41}
42
43impl<T> Reader<T> {
44 fn hash(&self) -> Hash {
45 use hash::Buffer;
46 use sha2::Digest;
47
48 Hash(match &self.inner {
49 reader::Inner::Sha224(h) => hash::Inner::Sha224(Buffer(h.clone().finalize())),
50 reader::Inner::Sha256(h) => hash::Inner::Sha256(Buffer(h.clone().finalize())),
51 reader::Inner::Sha384(h) => hash::Inner::Sha384(Buffer(h.clone().finalize())),
52 reader::Inner::Sha512(h) => hash::Inner::Sha512(Buffer(h.clone().finalize())),
53 })
54 }
55}
56
57impl<T> Writer<T> {
58 pub fn finish(self) -> Hash {
59 use hash::Buffer;
60 use sha2::Digest;
61
62 Hash(match self.inner {
63 writer::Inner::Sha224(h) => hash::Inner::Sha224(Buffer(h.finalize())),
64 writer::Inner::Sha256(h) => hash::Inner::Sha256(Buffer(h.finalize())),
65 writer::Inner::Sha384(h) => hash::Inner::Sha384(Buffer(h.finalize())),
66 writer::Inner::Sha512(h) => hash::Inner::Sha512(Buffer(h.finalize())),
67 })
68 }
69}