11//! Deserialization utilities.
22
33use crate :: { Row , Value } ;
4- use serde:: de:: { value:: Error as DeError , Error , IntoDeserializer , MapAccess , Visitor } ;
4+ use serde:: de:: { value:: Error as DeError , Error , IntoDeserializer , MapAccess , SeqAccess , Visitor } ;
55use serde:: { Deserialize , Deserializer } ;
66
77struct RowDeserializer < ' de > {
@@ -15,15 +15,12 @@ impl<'de> Deserializer<'de> for RowDeserializer<'de> {
1515 where
1616 V : Visitor < ' de > ,
1717 {
18- Err ( DeError :: custom ( "Expects a struct" ) )
18+ Err ( DeError :: custom (
19+ "Expects a map, newtype, sequence, struct, or tuple" ,
20+ ) )
1921 }
2022
21- fn deserialize_struct < V > (
22- self ,
23- _name : & ' static str ,
24- _fields : & ' static [ & ' static str ] ,
25- visitor : V ,
26- ) -> Result < V :: Value , Self :: Error >
23+ fn deserialize_map < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
2724 where
2825 V : Visitor < ' de > ,
2926 {
@@ -73,10 +70,83 @@ impl<'de> Deserializer<'de> for RowDeserializer<'de> {
7370 } )
7471 }
7572
73+ fn deserialize_struct < V > (
74+ self ,
75+ _name : & ' static str ,
76+ _fields : & ' static [ & ' static str ] ,
77+ visitor : V ,
78+ ) -> Result < V :: Value , Self :: Error >
79+ where
80+ V : Visitor < ' de > ,
81+ {
82+ self . deserialize_map ( visitor)
83+ }
84+
85+ fn deserialize_seq < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
86+ where
87+ V : Visitor < ' de > ,
88+ {
89+ struct RowSeqAccess < ' a > {
90+ row : & ' a Row ,
91+ idx : std:: ops:: Range < usize > ,
92+ }
93+
94+ impl < ' de > SeqAccess < ' de > for RowSeqAccess < ' de > {
95+ type Error = DeError ;
96+
97+ fn next_element_seed < T > ( & mut self , seed : T ) -> Result < Option < T :: Value > , Self :: Error >
98+ where
99+ T : serde:: de:: DeserializeSeed < ' de > ,
100+ {
101+ match self . idx . next ( ) {
102+ None => Ok ( None ) ,
103+ Some ( i) => {
104+ let value = self . row . get_value ( i as i32 ) . map_err ( DeError :: custom) ?;
105+ seed. deserialize ( value. into_deserializer ( ) ) . map ( Some )
106+ }
107+ }
108+ }
109+ }
110+
111+ visitor. visit_seq ( RowSeqAccess {
112+ row : self . row ,
113+ idx : 0 ..( self . row . column_count ( ) as usize ) ,
114+ } )
115+ }
116+
117+ fn deserialize_tuple < V > ( self , _len : usize , visitor : V ) -> Result < V :: Value , Self :: Error >
118+ where
119+ V : Visitor < ' de > ,
120+ {
121+ self . deserialize_seq ( visitor)
122+ }
123+
124+ fn deserialize_tuple_struct < V > (
125+ self ,
126+ _name : & ' static str ,
127+ _len : usize ,
128+ visitor : V ,
129+ ) -> Result < V :: Value , Self :: Error >
130+ where
131+ V : Visitor < ' de > ,
132+ {
133+ self . deserialize_seq ( visitor)
134+ }
135+
136+ fn deserialize_newtype_struct < V > (
137+ self ,
138+ _name : & ' static str ,
139+ visitor : V ,
140+ ) -> Result < V :: Value , Self :: Error >
141+ where
142+ V : Visitor < ' de > ,
143+ {
144+ visitor. visit_newtype_struct ( self )
145+ }
146+
76147 serde:: forward_to_deserialize_any! {
77148 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
78- bytes byte_buf option unit unit_struct newtype_struct seq tuple
79- tuple_struct map enum identifier ignored_any
149+ bytes byte_buf option unit unit_struct enum identifier ignored_any
80150 }
81151}
82152
0 commit comments