@@ -19,6 +19,7 @@ use rand::prelude::*;
1919#[ cfg( target_family = "wasm" ) ] use regex:: { Captures , Regex } ;
2020use serde:: { Deserialize , Serialize } ;
2121use serde_json:: { json, Value } ;
22+ use serde_json:: Value :: Object ;
2223use tracing:: { debug, instrument, trace, warn} ;
2324use uuid:: Uuid ;
2425
@@ -825,11 +826,21 @@ impl GenerateValue<u16> for Generator {
825826 ) -> anyhow:: Result < u16 > {
826827 match self {
827828 & Generator :: RandomInt ( min, max) => Ok ( rand:: thread_rng ( ) . gen_range ( min as u16 ..( max as u16 ) . saturating_add ( 1 ) ) ) ,
828- & Generator :: ProviderStateGenerator ( ref exp, ref dt) =>
829- match generate_value_from_context ( exp, context, dt) {
829+ & Generator :: ProviderStateGenerator ( ref exp, ref dt) => {
830+ // Provider state values may come under a "providerState" key
831+ let provider_state_config = if let Some ( Object ( psc) ) = context. get ( "providerState" ) {
832+ psc
833+ . iter ( )
834+ . map ( |( k, v) | ( k. as_str ( ) , v. clone ( ) ) )
835+ . collect ( )
836+ } else {
837+ context. clone ( )
838+ } ;
839+ match generate_value_from_context ( exp, & provider_state_config, dt) {
830840 Ok ( val) => u16:: try_from ( val) ,
831841 Err ( err) => Err ( err)
832- } ,
842+ }
843+ }
833844 _ => Err ( anyhow ! ( "Could not generate a u16 value from {} using {:?}" , value, self ) )
834845 }
835846 }
@@ -973,8 +984,18 @@ impl GenerateValue<String> for Generator {
973984 }
974985 }
975986 Generator :: RandomBoolean => Ok ( format ! ( "{}" , rnd. gen :: <bool >( ) ) ) ,
976- Generator :: ProviderStateGenerator ( ref exp, ref dt) =>
977- generate_value_from_context ( exp, context, dt) . map ( |val| val. to_string ( ) ) ,
987+ Generator :: ProviderStateGenerator ( ref exp, ref dt) => {
988+ // Provider state values may come under a "providerState" key
989+ let provider_state_config = if let Some ( Object ( psc) ) = context. get ( "providerState" ) {
990+ psc
991+ . iter ( )
992+ . map ( |( k, v) | ( k. as_str ( ) , v. clone ( ) ) )
993+ . collect ( )
994+ } else {
995+ context. clone ( )
996+ } ;
997+ generate_value_from_context ( exp, & provider_state_config, dt) . map ( |val| val. to_string ( ) )
998+ }
978999 Generator :: MockServerURL ( example, regex) => if let Some ( mock_server_details) = context. get ( "mockServer" ) {
9791000 debug ! ( "Generating URL from Mock Server details" ) ;
9801001 match mock_server_details. as_object ( ) {
@@ -1140,11 +1161,21 @@ impl GenerateValue<Value> for Generator {
11401161 }
11411162 } ,
11421163 Generator :: RandomBoolean => Ok ( json ! ( rand:: thread_rng( ) . gen :: <bool >( ) ) ) ,
1143- Generator :: ProviderStateGenerator ( ref exp, ref dt) =>
1144- match generate_value_from_context ( exp, context, dt) {
1164+ Generator :: ProviderStateGenerator ( ref exp, ref dt) => {
1165+ // Provider state values may come under a "providerState" key
1166+ let provider_state_config = if let Some ( Object ( psc) ) = context. get ( "providerState" ) {
1167+ psc
1168+ . iter ( )
1169+ . map ( |( k, v) | ( k. as_str ( ) , v. clone ( ) ) )
1170+ . collect ( )
1171+ } else {
1172+ context. clone ( )
1173+ } ;
1174+ match generate_value_from_context ( exp, & provider_state_config, dt) {
11451175 Ok ( val) => val. as_json ( ) ,
11461176 Err ( err) => Err ( err)
1147- } ,
1177+ }
1178+ }
11481179 Generator :: MockServerURL ( example, regex) => {
11491180 debug ! ( "context = {:?}" , context) ;
11501181 if let Some ( mock_server_details) = context. get ( "mockServer" ) {
0 commit comments