@@ -12,18 +12,19 @@ use crate::Field;
1212/// 'b: field lifetime may go across the whole query.
1313pub struct RecordDeserializer < ' b , R >
1414where
15- R : IntoIterator < Item = ( & ' b Field , BorrowedValue < ' b > ) > ,
15+ R : Iterator < Item = ( & ' b Field , BorrowedValue < ' b > ) > ,
1616{
17- inner : < R as IntoIterator > :: IntoIter ,
17+ inner : R ,
1818 value : Option < BorrowedValue < ' b > > ,
1919 _marker : PhantomData < & ' b u8 > ,
2020}
2121
22- impl < ' b , R > From < R > for RecordDeserializer < ' b , R >
22+ impl < ' b , R , T > From < T > for RecordDeserializer < ' b , R >
2323where
24- R : IntoIterator < Item = ( & ' b Field , BorrowedValue < ' b > ) > ,
24+ R : Iterator < Item = ( & ' b Field , BorrowedValue < ' b > ) > ,
25+ T : IntoIterator < Item = ( & ' b Field , BorrowedValue < ' b > ) , IntoIter = R > ,
2526{
26- fn from ( input : R ) -> Self {
27+ fn from ( input : T ) -> Self {
2728 Self {
2829 inner : input. into_iter ( ) ,
2930 value : None ,
@@ -34,16 +35,24 @@ where
3435
3536impl < ' b , R > RecordDeserializer < ' b , R >
3637where
37- R : IntoIterator < Item = ( & ' b Field , BorrowedValue < ' b > ) > ,
38+ R : Iterator < Item = ( & ' b Field , BorrowedValue < ' b > ) > ,
3839{
3940 fn next_value ( & mut self ) -> Option < BorrowedValue < ' b > > {
4041 self . inner . next ( ) . map ( |( _, v) | v)
4142 }
4243}
4344
45+ // impl<'b, R> RecordDeserializer<'b, R>
46+ // where
47+ // R: Iterator<Item = (&'b Field, BorrowedValue<'b>)>,
48+ // {
49+ // fn cloned(&self) -> RecordDeserializer<'b, std::iter::Cloned<R>> {
50+ // RecordDeserializer::from(self.inner.ier().cloned())
51+ // }
52+ // }
4453impl < ' de , ' b : ' de , R > MapAccess < ' de > for RecordDeserializer < ' b , R >
4554where
46- R : IntoIterator < Item = ( & ' b Field , BorrowedValue < ' b > ) > ,
55+ R : Iterator < Item = ( & ' b Field , BorrowedValue < ' b > ) > ,
4756{
4857 type Error = Error ;
4958
7382
7483impl < ' de , ' b : ' de , R > SeqAccess < ' de > for RecordDeserializer < ' b , R >
7584where
76- R : IntoIterator < Item = ( & ' b Field , BorrowedValue < ' b > ) > ,
85+ R : Iterator < Item = ( & ' b Field , BorrowedValue < ' b > ) > ,
7786{
7887 type Error = Error ;
7988
@@ -93,25 +102,26 @@ where
93102
94103impl < ' de , ' b : ' de , R > Deserializer < ' de > for RecordDeserializer < ' b , R >
95104where
96- R : IntoIterator < Item = ( & ' b Field , BorrowedValue < ' b > ) > ,
105+ R : Iterator < Item = ( & ' b Field , BorrowedValue < ' b > ) > ,
97106{
98107 type Error = Error ;
99108
100109 // Look at the input data to decide what Serde data model type to
101110 // deserialize as. Not all data formats are able to support this operation.
102111 // Formats that support `deserialize_any` are known as self-describing.
103- fn deserialize_any < V > ( mut self , visitor : V ) -> Result < V :: Value , Self :: Error >
112+ fn deserialize_any < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
104113 where
105114 V : Visitor < ' de > ,
106115 {
107- match self . next_value ( ) {
108- Some ( v) => v
109- . deserialize_any ( visitor)
110- . map_err ( <Self :: Error as serde:: de:: Error >:: custom) ,
111- None => Err ( <Self :: Error as serde:: de:: Error >:: custom (
112- "expect value, not none" ,
113- ) ) ,
114- }
116+ visitor. visit_map ( self )
117+ // match self.next_value() {
118+ // Some(v) => v
119+ // .deserialize_any(visitor)
120+ // .map_err(<Self::Error as serde::de::Error>::custom),
121+ // None => Err(<Self::Error as serde::de::Error>::custom(
122+ // "expect value, not none",
123+ // )),
124+ // }
115125 }
116126
117127 serde:: forward_to_deserialize_any! {
@@ -263,3 +273,266 @@ where
263273 self . deserialize_map ( visitor)
264274 }
265275}
276+
277+ #[ cfg( test) ]
278+ mod tests {
279+ use serde:: Deserialize ;
280+
281+ use crate :: common:: Ty ;
282+
283+ use super :: * ;
284+
285+ #[ test]
286+ fn test_empty_deserializer ( ) {
287+ let fields = vec ! [ ] ;
288+ let values = vec ! [ ] ;
289+
290+ {
291+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
292+
293+ let deserializer = RecordDeserializer :: from ( iter) ;
294+
295+ #[ derive( Deserialize , PartialEq , Eq , Debug ) ]
296+ struct Record { }
297+ let record = Record :: deserialize ( deserializer) . unwrap ( ) ;
298+ assert_eq ! ( record, Record { } ) ;
299+ }
300+ {
301+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
302+
303+ let deserializer = RecordDeserializer :: from ( iter) ;
304+
305+ #[ derive( Deserialize , PartialEq , Eq , Debug ) ]
306+ struct Record {
307+ a : Option < i32 > ,
308+ }
309+ let record = Record :: deserialize ( deserializer) . unwrap ( ) ;
310+ assert_eq ! ( record, Record { a: None } ) ;
311+ }
312+ }
313+ #[ test]
314+ fn test_borrowed_values_deserializer ( ) {
315+ let fields = vec ! [
316+ Field :: new( "a" , Ty :: Int , 4 ) ,
317+ Field :: new( "b" , Ty :: VarChar , 128 ) ,
318+ Field :: new( "c" , Ty :: NChar , 128 ) ,
319+ ] ;
320+ let values = vec ! [
321+ BorrowedValue :: Null ( Ty :: Int ) ,
322+ BorrowedValue :: Null ( Ty :: VarChar ) ,
323+ BorrowedValue :: Null ( Ty :: NChar ) ,
324+ ] ;
325+
326+ {
327+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
328+
329+ let deserializer = RecordDeserializer :: from ( iter) ;
330+
331+ #[ derive( Deserialize , PartialEq , Eq , Debug ) ]
332+ struct Record {
333+ a : i32 ,
334+ b : i32 ,
335+ c : i32 ,
336+ }
337+ let record = Record :: deserialize ( deserializer) ;
338+ assert ! ( record. is_err( ) ) ;
339+ }
340+ {
341+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
342+
343+ let deserializer = RecordDeserializer :: from ( iter) ;
344+
345+ #[ derive( Deserialize , PartialEq , Eq , Debug ) ]
346+ struct Record < ' a > {
347+ a : i32 ,
348+ b : Option < & ' a str > ,
349+ c : Option < & ' a str > ,
350+ }
351+ let record = Record :: deserialize ( deserializer) ;
352+ assert_eq ! (
353+ record. unwrap_err( ) . to_string( ) ,
354+ "invalid type: Option value, expected i32"
355+ ) ;
356+ }
357+ {
358+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
359+
360+ let deserializer = RecordDeserializer :: from ( iter) ;
361+
362+ #[ derive( Deserialize , PartialEq , Eq , Debug ) ]
363+ struct Record < ' a > {
364+ a : Option < i32 > ,
365+ b : & ' a str ,
366+ c : Option < & ' a str > ,
367+ }
368+ let record = Record :: deserialize ( deserializer) . unwrap ( ) ;
369+ assert_eq ! (
370+ record,
371+ Record {
372+ a: None ,
373+ b: "" ,
374+ c: None
375+ }
376+ ) ;
377+ }
378+ {
379+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
380+
381+ let deserializer = RecordDeserializer :: from ( iter) ;
382+
383+ #[ derive( Deserialize , PartialEq , Eq , Debug ) ]
384+ struct Record < ' a > {
385+ a : Option < i32 > ,
386+ b : Option < & ' a str > ,
387+ c : Option < & ' a str > ,
388+ }
389+ let record = Record :: deserialize ( deserializer) . unwrap ( ) ;
390+ assert_eq ! (
391+ record,
392+ Record {
393+ a: None ,
394+ b: None ,
395+ c: None
396+ }
397+ ) ;
398+ }
399+ }
400+ #[ test]
401+ fn test_record_deserializer ( ) {
402+ let fields = vec ! [
403+ Field :: new( "a" , Ty :: Int , 4 ) ,
404+ Field :: new( "b" , Ty :: Int , 4 ) ,
405+ Field :: new( "c" , Ty :: Int , 4 ) ,
406+ ] ;
407+ let values = vec ! [
408+ BorrowedValue :: Int ( 1 ) ,
409+ BorrowedValue :: Int ( 2 ) ,
410+ BorrowedValue :: Int ( 3 ) ,
411+ ] ;
412+
413+ {
414+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
415+
416+ let deserializer = RecordDeserializer :: from ( iter) ;
417+
418+ #[ derive( Deserialize , PartialEq , Eq , Debug ) ]
419+ struct Record {
420+ a : i32 ,
421+ b : i32 ,
422+ c : i32 ,
423+ } // New type struct
424+ let record = Record :: deserialize ( deserializer) . unwrap ( ) ;
425+ assert_eq ! ( record, Record { a: 1 , b: 2 , c: 3 } ) ;
426+ }
427+ {
428+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
429+
430+ let deserializer = RecordDeserializer :: from ( iter) ;
431+
432+ #[ derive( Deserialize , PartialEq , Eq , Debug ) ]
433+ struct Record ; // Unit struct
434+ let record = Record :: deserialize ( deserializer) . unwrap ( ) ;
435+ assert_eq ! ( record, Record ) ;
436+ }
437+ {
438+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
439+
440+ let deserializer = RecordDeserializer :: from ( iter) ;
441+
442+ #[ derive( Deserialize , PartialEq , Eq , Debug ) ]
443+ struct Record ( serde_json:: Value ) ; // Tuple struct
444+ let record = Record :: deserialize ( deserializer) . unwrap ( ) ;
445+ assert_eq ! ( record, Record ( serde_json:: json!( { "a" : 1 , "b" : 2 , "c" : 3 } ) ) ) ;
446+ }
447+ {
448+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
449+
450+ let deserializer = RecordDeserializer :: from ( iter) ;
451+
452+ #[ derive( Deserialize , PartialEq , Eq , Debug ) ]
453+ struct Record ( i32 , i32 , i32 ) ; // Tuple struct
454+ let record = Record :: deserialize ( deserializer) . unwrap ( ) ;
455+ assert_eq ! ( record, Record ( 1 , 2 , 3 ) ) ;
456+ }
457+
458+ {
459+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
460+
461+ let deserializer = RecordDeserializer :: from ( iter) ;
462+
463+ type Record = ( i32 , i32 , i32 ) ;
464+ let record = Record :: deserialize ( deserializer) . unwrap ( ) ;
465+ assert_eq ! ( record, ( 1 , 2 , 3 ) ) ;
466+ }
467+
468+ {
469+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
470+
471+ let deserializer = RecordDeserializer :: from ( iter) ;
472+
473+ type Record = [ i32 ; 3 ] ;
474+ let record = Record :: deserialize ( deserializer) . unwrap ( ) ;
475+ assert_eq ! ( record, [ 1 , 2 , 3 ] ) ;
476+ }
477+
478+ {
479+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
480+
481+ let deserializer = RecordDeserializer :: from ( iter) ;
482+
483+ type Record = Vec < i32 > ;
484+ let record = Record :: deserialize ( deserializer) . unwrap ( ) ;
485+ assert_eq ! ( record, vec![ 1 , 2 , 3 ] ) ;
486+ }
487+
488+ {
489+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
490+
491+ let deserializer = RecordDeserializer :: from ( iter) ;
492+ let value: [ crate :: common:: Value ; 3 ] =
493+ serde:: Deserialize :: deserialize ( deserializer) . unwrap ( ) ;
494+ dbg ! ( & value) ;
495+ assert_eq ! (
496+ value,
497+ [
498+ crate :: common:: Value :: Int ( 1 ) ,
499+ crate :: common:: Value :: Int ( 2 ) ,
500+ crate :: common:: Value :: Int ( 3 )
501+ ]
502+ ) ;
503+ }
504+ {
505+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
506+
507+ let deserializer = RecordDeserializer :: from ( iter) ;
508+ let value: String = serde:: Deserialize :: deserialize ( deserializer) . unwrap ( ) ;
509+ dbg ! ( & value) ;
510+ assert_eq ! ( value, "1" ) ;
511+ }
512+ {
513+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
514+
515+ let deserializer = RecordDeserializer :: from ( iter) ;
516+ let value: ( ) = serde:: Deserialize :: deserialize ( deserializer) . unwrap ( ) ;
517+ dbg ! ( & value) ;
518+ assert_eq ! ( value, ( ) ) ;
519+ }
520+ {
521+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
522+
523+ let deserializer = RecordDeserializer :: from ( iter) ;
524+ let value: Option < String > = serde:: Deserialize :: deserialize ( deserializer) . unwrap ( ) ;
525+ dbg ! ( & value) ;
526+ assert_eq ! ( value, Some ( "1" . to_string( ) ) ) ;
527+ }
528+
529+ {
530+ let iter = fields. iter ( ) . zip ( values. iter ( ) . cloned ( ) ) ;
531+
532+ let deserializer = RecordDeserializer :: from ( iter) ;
533+ let value = serde_json:: Value :: deserialize ( deserializer) . unwrap ( ) ;
534+ dbg ! ( & value) ;
535+ assert_eq ! ( value, serde_json:: json!( { "a" : 1 , "b" : 2 , "c" : 3 } ) ) ;
536+ }
537+ }
538+ }
0 commit comments