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+ } ;
46
57pub ( 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+ }
716}
817
918impl < ' de > Deserializer < ' de > for RowDeserializer < ' de > {
@@ -20,17 +29,125 @@ impl<'de> Deserializer<'de> for RowDeserializer<'de> {
2029 self ,
2130 _name : & ' static str ,
2231 _fields : & ' static [ & ' static str ] ,
23- _visitor : V ,
32+ visitor : V ,
2433 ) -> Result < V :: Value , Self :: Error >
2534 where
2635 V : Visitor < ' de > ,
2736 {
28- todo ! ( )
37+ visitor . visit_map ( self )
2938 }
3039
3140 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
3443 tuple_struct map enum identifier ignored_any
3544 }
3645}
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