@@ -405,3 +405,50 @@ impl<T: FromRow> Deref for Rows<T> {
405405 & self . 0
406406 }
407407}
408+
409+ /// A list received from a response
410+ pub struct RList < T : FromValue = Value > ( Vec < T > ) ;
411+
412+ impl < T : FromValue > RList < T > {
413+ /// Returns the values of the list
414+ pub fn into_values ( self ) -> Vec < T > {
415+ self . 0
416+ }
417+ }
418+
419+ impl < T : FromValue > Deref for RList < T > {
420+ type Target = [ T ] ;
421+ fn deref ( & self ) -> & Self :: Target {
422+ & self . 0
423+ }
424+ }
425+
426+ impl < T : FromValue > FromValue for RList < T > {
427+ fn from_value ( v : Value ) -> ClientResult < Self > {
428+ match v {
429+ Value :: List ( l) => {
430+ let mut ret = Vec :: new ( ) ;
431+ for value in l {
432+ ret. push ( T :: from_value ( value) ?) ;
433+ }
434+ Ok ( Self ( ret) )
435+ }
436+ _ => Err ( Error :: ParseError ( ParseError :: TypeMismatch ) ) ,
437+ }
438+ }
439+ }
440+
441+ #[ test]
442+ fn resp_list_parse ( ) {
443+ let response_list = Response :: Row ( Row :: new ( vec ! [
444+ Value :: String ( "sayan" . to_owned( ) ) ,
445+ Value :: List ( vec![
446+ Value :: String ( "c" . to_owned( ) ) ,
447+ Value :: String ( "assembly" . to_owned( ) ) ,
448+ Value :: String ( "rust" . to_owned( ) ) ,
449+ ] ) ,
450+ ] ) ) ;
451+ let ( name, languages) = response_list. parse :: < ( String , RList < String > ) > ( ) . unwrap ( ) ;
452+ assert_eq ! ( name, "sayan" ) ;
453+ assert_eq ! ( languages. as_ref( ) , vec![ "c" , "assembly" , "rust" ] ) ;
454+ }
0 commit comments