1#![warn(missing_docs)]
4#![warn(missing_debug_implementations)]
5extern crate digest;
6extern crate generic_array;
7
8use std::io;
9
10use generic_array::{ArrayLength, GenericArray};
11use digest::InvalidLength;
12pub use digest::{Input, BlockInput, FixedOutput, VariableOutput, Digest};
13
14#[derive(Debug, Clone, Default)]
34pub struct Writer<D>(D);
35
36impl<D: Input + FixedOutput> Writer<D> {
37 pub fn new(d: D) -> Writer<D> {
39 Writer(d)
40 }
41 pub fn get_ref(&self) -> &D {
43 &self.0
44 }
45 pub fn get_mut(&mut self) -> &mut D {
47 &mut self.0
48 }
49 pub fn into_inner(self) -> D {
51 self.0
52 }
53}
54
55impl<D: Input> io::Write for Writer<D> {
56
57 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
58 self.0.process(buf);
59 Ok(buf.len())
60 }
61 fn flush(&mut self) -> io::Result<()> {
62 Ok(())
63 }
64}
65
66impl<D: Input> Input for Writer<D> {
67 fn process(&mut self, input: &[u8]) {
68 self.0.process(input);
69 }
70}
71
72impl<D> BlockInput for Writer<D>
73 where D: BlockInput, D::BlockSize: ArrayLength<u8>
74{
75 type BlockSize = D::BlockSize;
76}
77
78impl<D> FixedOutput for Writer<D>
79 where D: FixedOutput, D::OutputSize: ArrayLength<u8>
80{
81 type OutputSize = D::OutputSize;
82
83 fn fixed_result(self) -> GenericArray<u8, Self::OutputSize> {
84 self.0.fixed_result()
85 }
86}
87
88impl<D: VariableOutput> VariableOutput for Writer<D> {
89 fn new(output_size: usize) -> Result<Writer<D>, InvalidLength> {
90 D::new(output_size).map(Writer)
91 }
92 fn output_size(&self) -> usize {
93 self.0.output_size()
94 }
95 fn variable_result(self, buffer: &mut [u8]) -> Result<&[u8], InvalidLength> {
96 self.0.variable_result(buffer)
97 }
98}