1+ //! Adapters to/from `digest::Digest` traits e.g. sha2::Sha256
2+
3+ use core:: convert:: Infallible ;
4+ use digest:: Update ;
5+ use embedded_io:: { ErrorType , Write } ;
6+
7+ /// Adapter from `digest::Digest` traits.
8+ #[ derive( Clone ) ]
9+ pub struct FromDigest < T : ?Sized > {
10+ inner : T ,
11+ }
12+
13+ impl < T > FromDigest < T > {
14+ /// Create a new adapter.
15+ pub fn new ( inner : T ) -> Self {
16+ Self { inner }
17+ }
18+
19+ /// Consume the adapter, returning the inner object.
20+ pub fn into_inner ( self ) -> T {
21+ self . inner
22+ }
23+ }
24+
25+ impl < T : ?Sized > FromDigest < T > {
26+ /// Borrow the inner object.
27+ pub fn inner ( & self ) -> & T {
28+ & self . inner
29+ }
30+
31+ /// Mutably borrow the inner object.
32+ pub fn inner_mut ( & mut self ) -> & mut T {
33+ & mut self . inner
34+ }
35+ }
36+
37+ impl < T > ErrorType for FromDigest < T > {
38+ type Error = Infallible ;
39+ }
40+
41+ impl < T : Update > Write for FromDigest < T > {
42+ fn write ( & mut self , data : & [ u8 ] ) -> Result < usize , <Self as ErrorType >:: Error > {
43+ T :: update ( & mut self . inner , data) ;
44+ Ok ( data. len ( ) )
45+ }
46+ fn flush ( & mut self ) -> Result < ( ) , <Self as ErrorType >:: Error > { Ok ( ( ) ) }
47+ }
48+
49+ impl < T : Default > Default for FromDigest < T > {
50+ fn default ( ) -> Self {
51+ Self { inner : T :: default ( ) }
52+ }
53+ }
54+
55+ /// Adapter to `digest::Digest` traits.
56+ #[ derive( Clone ) ]
57+ pub struct ToDigest < T : ?Sized > {
58+ inner : T ,
59+ }
60+
61+ impl < T > ToDigest < T > {
62+ /// Create a new adapter.
63+ pub fn new ( inner : T ) -> Self {
64+ Self { inner }
65+ }
66+
67+ /// Consume the adapter, returning the inner object.
68+ pub fn into_inner ( self ) -> T {
69+ self . inner
70+ }
71+ }
72+
73+ impl < T : ?Sized > ToDigest < T > {
74+ /// Borrow the inner object.
75+ pub fn inner ( & self ) -> & T {
76+ & self . inner
77+ }
78+
79+ /// Mutably borrow the inner object.
80+ pub fn inner_mut ( & mut self ) -> & mut T {
81+ & mut self . inner
82+ }
83+ }
84+
85+ impl < T : Default > Default for ToDigest < T > {
86+ fn default ( ) -> Self {
87+ Self { inner : T :: default ( ) }
88+ }
89+ }
90+
91+ impl < T : ErrorType < Error =Infallible > + Write > Update for ToDigest < T > {
92+ fn update ( & mut self , data : & [ u8 ] ) {
93+ match self . inner . write_all ( data) {
94+ Ok ( ( ) ) => { } ,
95+ Err ( _) => unreachable ! ( ) ,
96+ }
97+ }
98+ }
0 commit comments