@@ -154,6 +154,14 @@ pub trait ArgType<'a> {
154154 ) )
155155 }
156156
157+ #[ doc( hidden) ]
158+ fn from_state_and_value_owned (
159+ _state : Option < & ' a State > ,
160+ value : Value ,
161+ ) -> Result < Self :: Output , Error > {
162+ Self :: from_value_owned ( value)
163+ }
164+
157165 #[ doc( hidden) ]
158166 fn from_state_and_value (
159167 _state : Option < & ' a State > ,
@@ -566,6 +574,16 @@ impl<'a> ArgType<'a> for Cow<'_, str> {
566574 None => Err ( Error :: from ( ErrorKind :: MissingArgument ) ) ,
567575 }
568576 }
577+
578+ fn from_state_and_value (
579+ state : Option < & ' a State > ,
580+ value : Option < & ' a Value > ,
581+ ) -> Result < ( Self :: Output , usize ) , Error > {
582+ if let ( Some ( state) , Some ( value) ) = ( state, value) {
583+ ok ! ( state. undefined_behavior( ) . assert_value_not_undefined( value) ) ;
584+ }
585+ Ok ( ( ok ! ( Self :: from_value( value) ) , 1 ) )
586+ }
569587}
570588
571589impl < ' a > ArgType < ' a > for & Value {
@@ -675,15 +693,15 @@ impl<'a, T: ArgType<'a, Output = T>> ArgType<'a> for Rest<T> {
675693 }
676694
677695 fn from_state_and_values (
678- _state : Option < & ' a State > ,
696+ state : Option < & ' a State > ,
679697 values : & ' a [ Value ] ,
680698 offset : usize ,
681699 ) -> Result < ( Self , usize ) , Error > {
682700 let args = values. get ( offset..) . unwrap_or_default ( ) ;
683701 Ok ( (
684702 Rest ( ok ! ( args
685703 . iter( )
686- . map( |v| T :: from_value ( Some ( v) ) )
704+ . map( |v| T :: from_state_and_value ( state , Some ( v) ) . map ( |x| x . 0 ) )
687705 . collect:: <Result <_, _>>( ) ) ) ,
688706 args. len ( ) ,
689707 ) )
@@ -979,6 +997,28 @@ impl<'a> ArgType<'a> for String {
979997 }
980998 }
981999
1000+ fn from_state_and_value (
1001+ state : Option < & ' a State > ,
1002+ value : Option < & ' a Value > ,
1003+ ) -> Result < ( Self :: Output , usize ) , Error > {
1004+ if let ( Some ( state) , Some ( value) ) = ( state, value) {
1005+ ok ! ( state. undefined_behavior( ) . assert_value_not_undefined( value) ) ;
1006+ }
1007+ Ok ( ( ok ! ( Self :: from_value( value) ) , 1 ) )
1008+ }
1009+
1010+ fn from_state_and_value_owned (
1011+ state : Option < & ' a State > ,
1012+ value : Value ,
1013+ ) -> Result < Self :: Output , Error > {
1014+ if let Some ( state) = state {
1015+ ok ! ( state
1016+ . undefined_behavior( )
1017+ . assert_value_not_undefined( & value) ) ;
1018+ }
1019+ Self :: from_value_owned ( value)
1020+ }
1021+
9821022 fn from_value_owned ( value : Value ) -> Result < Self , Error > {
9831023 Ok ( value. to_string ( ) )
9841024 }
@@ -1005,6 +1045,27 @@ impl<'a, T: ArgType<'a, Output = T>> ArgType<'a> for Vec<T> {
10051045 }
10061046 }
10071047
1048+ fn from_state_and_value (
1049+ state : Option < & ' a State > ,
1050+ value : Option < & ' a Value > ,
1051+ ) -> Result < ( Self :: Output , usize ) , Error > {
1052+ match value {
1053+ None => Ok ( ( Vec :: new ( ) , 1 ) ) ,
1054+ Some ( value) => {
1055+ let iter = ok ! ( value
1056+ . as_object( )
1057+ . filter( |x| matches!( x. repr( ) , ObjectRepr :: Seq | ObjectRepr :: Iterable ) )
1058+ . and_then( |x| x. try_iter( ) )
1059+ . ok_or_else( || { Error :: new( ErrorKind :: InvalidOperation , "not iterable" ) } ) ) ;
1060+ let mut rv = Vec :: new ( ) ;
1061+ for value in iter {
1062+ rv. push ( ok ! ( T :: from_state_and_value_owned( state, value) ) ) ;
1063+ }
1064+ Ok ( ( rv, 1 ) )
1065+ }
1066+ }
1067+ }
1068+
10081069 fn from_value_owned ( value : Value ) -> Result < Self , Error > {
10091070 let iter = ok ! ( value
10101071 . as_object( )
0 commit comments