@@ -6,16 +6,6 @@ use std::convert::{TryFrom, TryInto};
6
6
#[ cfg_attr( feature = "serde1" , derive( serde:: Serialize ) ) ]
7
7
pub struct Id < ' a > ( & ' a [ u8 ; SHA1_SIZE ] ) ;
8
8
9
- #[ cfg( feature = "serde1" ) ]
10
- impl < ' de : ' a , ' a > serde:: Deserialize < ' de > for Id < ' a > {
11
- fn deserialize < D > ( _deserializer : D ) -> Result < Self , <D as serde:: Deserializer < ' de > >:: Error >
12
- where
13
- D : serde:: Deserializer < ' de > ,
14
- {
15
- unimplemented ! ( "deserialize" )
16
- }
17
- }
18
-
19
9
impl < ' a > Id < ' a > {
20
10
pub fn encode_to_40_bytes_slice ( & self , out : & mut [ u8 ] ) -> Result < ( ) , hex:: FromHexError > {
21
11
hex:: encode_to_slice ( self . 0 , out)
@@ -38,3 +28,67 @@ impl<'a> TryFrom<&'a [u8]> for Id<'a> {
38
28
Ok ( Id ( value. try_into ( ) ?) )
39
29
}
40
30
}
31
+
32
+ /// Manually created from a version that uses a slice, and we forcefully try to convert it into a borrowed array of the desired size
33
+ /// Could be improved by fitting this into serde
34
+ /// Unfortunately the serde::Deserialize derive wouldn't work for borrowed arrays.
35
+ #[ cfg( feature = "serde1" ) ]
36
+ impl < ' de : ' a , ' a > serde:: Deserialize < ' de > for Id < ' a > {
37
+ fn deserialize < D > ( deserializer : D ) -> Result < Self , <D as serde:: Deserializer < ' de > >:: Error >
38
+ where
39
+ D : serde:: Deserializer < ' de > ,
40
+ {
41
+ struct __Visitor < ' de : ' a , ' a > {
42
+ marker : serde:: export:: PhantomData < Id < ' a > > ,
43
+ lifetime : serde:: export:: PhantomData < & ' de ( ) > ,
44
+ }
45
+ impl < ' de : ' a , ' a > serde:: de:: Visitor < ' de > for __Visitor < ' de , ' a > {
46
+ type Value = Id < ' a > ;
47
+ fn expecting ( & self , __formatter : & mut serde:: export:: Formatter ) -> serde:: export:: fmt:: Result {
48
+ serde:: export:: Formatter :: write_str ( __formatter, "tuple struct Id" )
49
+ }
50
+ #[ inline]
51
+ fn visit_newtype_struct < __E > ( self , __e : __E ) -> serde:: export:: Result < Self :: Value , __E:: Error >
52
+ where
53
+ __E : serde:: Deserializer < ' de > ,
54
+ {
55
+ let __field0: & ' a [ u8 ] = match <& ' a [ u8 ] as serde:: Deserialize >:: deserialize ( __e) {
56
+ serde:: export:: Ok ( __val) => __val,
57
+ serde:: export:: Err ( __err) => {
58
+ return serde:: export:: Err ( __err) ;
59
+ }
60
+ } ;
61
+ serde:: export:: Ok ( Id ( __field0. try_into ( ) . expect ( "exactly 20 bytes" ) ) )
62
+ }
63
+ #[ inline]
64
+ fn visit_seq < __A > ( self , mut __seq : __A ) -> serde:: export:: Result < Self :: Value , __A:: Error >
65
+ where
66
+ __A : serde:: de:: SeqAccess < ' de > ,
67
+ {
68
+ let __field0 = match match serde:: de:: SeqAccess :: next_element :: < & ' a [ u8 ] > ( & mut __seq) {
69
+ serde:: export:: Ok ( __val) => __val,
70
+ serde:: export:: Err ( __err) => {
71
+ return serde:: export:: Err ( __err) ;
72
+ }
73
+ } {
74
+ serde:: export:: Some ( __value) => __value,
75
+ serde:: export:: None => {
76
+ return serde:: export:: Err ( serde:: de:: Error :: invalid_length (
77
+ 0usize ,
78
+ & "tuple struct Id with 1 element" ,
79
+ ) ) ;
80
+ }
81
+ } ;
82
+ serde:: export:: Ok ( Id ( __field0. try_into ( ) . expect ( "exactly 20 bytes" ) ) )
83
+ }
84
+ }
85
+ serde:: Deserializer :: deserialize_newtype_struct (
86
+ deserializer,
87
+ "Id" ,
88
+ __Visitor {
89
+ marker : serde:: export:: PhantomData :: < Id < ' a > > ,
90
+ lifetime : serde:: export:: PhantomData ,
91
+ } ,
92
+ )
93
+ }
94
+ }
0 commit comments