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