1
- use crate :: Row ;
2
- use serde:: de:: { value:: Error as DeError , Error , Visitor } ;
3
- use serde:: Deserializer ;
1
+ use crate :: { Row , Value } ;
2
+ use serde:: de:: {
3
+ self , value:: Error as DeError , DeserializeSeed , Deserializer , Error , IntoDeserializer ,
4
+ MapAccess , Visitor ,
5
+ } ;
4
6
5
7
pub ( crate ) struct RowDeserializer < ' de > {
6
- pub ( crate ) row : & ' de Row < ' de > ,
8
+ row : & ' de Row < ' de > ,
9
+ index : usize ,
10
+ }
11
+
12
+ impl < ' de > RowDeserializer < ' de > {
13
+ pub ( crate ) fn new ( row : & ' de Row < ' de > ) -> Self {
14
+ Self { row, index : 0 }
15
+ }
7
16
}
8
17
9
18
impl < ' de > Deserializer < ' de > for RowDeserializer < ' de > {
@@ -20,17 +29,125 @@ impl<'de> Deserializer<'de> for RowDeserializer<'de> {
20
29
self ,
21
30
_name : & ' static str ,
22
31
_fields : & ' static [ & ' static str ] ,
23
- _visitor : V ,
32
+ visitor : V ,
24
33
) -> Result < V :: Value , Self :: Error >
25
34
where
26
35
V : Visitor < ' de > ,
27
36
{
28
- todo ! ( )
37
+ visitor . visit_map ( self )
29
38
}
30
39
31
40
serde:: forward_to_deserialize_any! {
32
- bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
33
- bytes byte_buf option unit unit_struct newtype_struct seq tuple
41
+ bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string option
42
+ bytes byte_buf unit unit_struct newtype_struct seq tuple
34
43
tuple_struct map enum identifier ignored_any
35
44
}
36
45
}
46
+
47
+ impl < ' de > MapAccess < ' de > for RowDeserializer < ' de > {
48
+ type Error = DeError ;
49
+
50
+ fn next_key_seed < K > ( & mut self , seed : K ) -> Result < Option < K :: Value > , Self :: Error >
51
+ where
52
+ K : DeserializeSeed < ' de > ,
53
+ {
54
+ if self . index >= self . row . columns . len ( ) {
55
+ return Ok ( None ) ;
56
+ }
57
+ let name = self . row . columns . name ( self . index ) ;
58
+ seed. deserialize ( name. into_deserializer ( ) ) . map ( Some )
59
+ }
60
+
61
+ fn next_value_seed < V > ( & mut self , seed : V ) -> Result < V :: Value , Self :: Error >
62
+ where
63
+ V : DeserializeSeed < ' de > ,
64
+ {
65
+ if self . index >= self . row . values . len ( ) {
66
+ return Err ( de:: Error :: custom ( "Value index out of bounds" ) ) ;
67
+ }
68
+ let value = & self . row . values [ self . index ] ;
69
+ let result = seed. deserialize ( ValueDeserializer ( value) ) ;
70
+ self . index += 1 ;
71
+ result
72
+ }
73
+ }
74
+
75
+ struct ValueDeserializer < ' a > ( & ' a Value < ' a > ) ;
76
+
77
+ impl < ' de > Deserializer < ' de > for ValueDeserializer < ' de > {
78
+ type Error = DeError ;
79
+
80
+ fn deserialize_any < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
81
+ where
82
+ V : Visitor < ' de > ,
83
+ {
84
+ match * self . 0 {
85
+ Value :: Null => visitor. visit_none ( ) ,
86
+ Value :: I8 ( v) => visitor. visit_i8 ( v) ,
87
+ Value :: I16 ( v) => visitor. visit_i16 ( v) ,
88
+ Value :: I32 ( v) => visitor. visit_i32 ( v) ,
89
+ Value :: I64 ( v) => visitor. visit_i64 ( v) ,
90
+ Value :: F32 ( v) => visitor. visit_f32 ( v) ,
91
+ Value :: F64 ( v) => visitor. visit_f64 ( v) ,
92
+ Value :: Char ( v) => visitor. visit_str ( v) ,
93
+ }
94
+ }
95
+
96
+ fn deserialize_unit < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
97
+ where
98
+ V : Visitor < ' de > ,
99
+ {
100
+ visitor. visit_unit ( )
101
+ }
102
+
103
+ fn deserialize_option < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
104
+ where
105
+ V : Visitor < ' de > ,
106
+ {
107
+ match * self . 0 {
108
+ Value :: Null => visitor. visit_none ( ) ,
109
+ _ => visitor. visit_some ( self ) ,
110
+ }
111
+ }
112
+
113
+ serde:: forward_to_deserialize_any! {
114
+ bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
115
+ bytes byte_buf unit_struct newtype_struct seq tuple
116
+ tuple_struct map enum identifier ignored_any struct
117
+ }
118
+ }
119
+
120
+ #[ cfg( test) ]
121
+ mod tests {
122
+ use super :: * ;
123
+ use serde:: Deserialize ;
124
+ use std:: fmt:: Debug ;
125
+
126
+ #[ test]
127
+ fn test_deserialize_value ( ) {
128
+ fn de < ' a , T : Debug + PartialEq + Deserialize < ' a > > ( v : & ' a Value < ' a > , expected : T ) {
129
+ let v = ValueDeserializer ( v) ;
130
+ assert_eq ! ( Deserialize :: deserialize( v) , Ok ( expected) ) ;
131
+ }
132
+
133
+ de ( & Value :: Null , ( ) ) ;
134
+ de ( & Value :: Null , None :: < i8 > ) ;
135
+ de ( & Value :: Null , None :: < String > ) ;
136
+
137
+ de ( & Value :: I8 ( 1 ) , 1i8 ) ;
138
+ de ( & Value :: I8 ( 1 ) , Some ( 1i8 ) ) ;
139
+ de ( & Value :: I8 ( 1 ) , Some ( 1_u128 ) ) ;
140
+
141
+ de ( & Value :: I16 ( 1 ) , 1i16 ) ;
142
+ de ( & Value :: I16 ( 1 ) , Some ( 1i16 ) ) ;
143
+ de ( & Value :: I16 ( 1 ) , Some ( 1_u128 ) ) ;
144
+
145
+ de ( & Value :: Char ( "Hello" ) , String :: from ( "Hello" ) ) ;
146
+ de ( & Value :: Char ( "Hello" ) , Some ( String :: from ( "Hello" ) ) ) ;
147
+ }
148
+
149
+ #[ test]
150
+ fn test_deserialize_row ( ) {
151
+ // TODO
152
+ }
153
+ }
0 commit comments