@@ -184,31 +184,22 @@ impl Toggle {
184184
185185 match self . do_eval ( & eval_param, deep) {
186186 Ok ( eval) => eval,
187- Err ( e) => self . default_variation ( & eval_param, Some ( e. to_string ( ) ) ) ,
187+ Err ( e) => self . disabled_variation ( & eval_param, Some ( e. to_string ( ) ) ) ,
188188 }
189189 }
190190
191191 fn do_eval (
192192 & self ,
193193 eval_param : & EvalParams ,
194- max_deep : u8 ,
194+ max_depth : u8 ,
195195 ) -> Result < EvalDetail < Value > , PrerequisiteError > {
196196 if !self . enabled {
197- let v = self . disabled_serve . select_variation ( eval_param) . ok ( ) ;
198- return Ok ( self . serve_variation (
199- v,
200- "disabled" . to_owned ( ) ,
201- None ,
202- eval_param. debug_until_time ,
203- ) ) ;
197+ return Ok ( self . disabled_variation ( eval_param, None ) )
204198 }
205199
206- match self . check_prerequisites ( eval_param, max_deep) {
207- Ok ( is_match) if !is_match => {
208- return Ok ( self . default_variation ( eval_param, None ) ) ;
209- }
210- Ok ( _is_match) => { }
211- Err ( e) => return Err ( e) ,
200+ if !self . meet_prerequisite ( eval_param, max_depth) ? {
201+ return Ok ( self . disabled_variation ( eval_param, Some (
202+ "Prerequisite not match" . to_owned ( ) ) ) ) ;
212203 }
213204
214205 for ( i, rule) in self . rules . iter ( ) . enumerate ( ) {
@@ -237,13 +228,13 @@ impl Toggle {
237228 Ok ( self . default_variation ( eval_param, None ) )
238229 }
239230
240- fn check_prerequisites (
231+ fn meet_prerequisite (
241232 & self ,
242233 eval_param : & EvalParams ,
243234 deep : u8 ,
244235 ) -> Result < bool , PrerequisiteError > {
245236 if deep == 0 {
246- return Err ( PrerequisiteError :: DeepOverflow ) ;
237+ return Err ( PrerequisiteError :: DepthOverflow ) ;
247238 }
248239
249240 if let Some ( ref prerequisites) = self . prerequisites {
@@ -300,10 +291,38 @@ impl Toggle {
300291 eval_param : & EvalParams ,
301292 reason : Option < String > ,
302293 ) -> EvalDetail < Value > {
303- match self . default_serve . select_variation ( eval_param) {
294+ return self . fixed_variation (
295+ & self . default_serve ,
296+ eval_param,
297+ "default." . to_owned ( ) ,
298+ reason,
299+ ) ;
300+ }
301+
302+ fn disabled_variation (
303+ & self ,
304+ eval_param : & EvalParams ,
305+ reason : Option < String > ,
306+ ) -> EvalDetail < Value > {
307+ return self . fixed_variation (
308+ & self . disabled_serve ,
309+ eval_param,
310+ "disabled." . to_owned ( ) ,
311+ reason,
312+ ) ;
313+ }
314+
315+ fn fixed_variation (
316+ & self ,
317+ serve : & Serve ,
318+ eval_param : & EvalParams ,
319+ default_reason : String ,
320+ reason : Option < String > ,
321+ ) -> EvalDetail < Value > {
322+ match serve. select_variation ( eval_param) {
304323 Ok ( v) => self . serve_variation (
305324 Some ( v) ,
306- concat_reason ( "default" . to_owned ( ) , reason) ,
325+ concat_reason ( default_reason , reason) ,
307326 None ,
308327 eval_param. debug_until_time ,
309328 ) ,
@@ -776,7 +795,7 @@ mod tests {
776795 }
777796
778797 #[ test]
779- fn test_prerequisite_not_exist ( ) {
798+ fn test_prerequisite_not_exist_should_return_disabled_variation ( ) {
780799 let mut path = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) ;
781800 path. push ( "resources/fixtures/repo.json" ) ;
782801 let json_str = fs:: read_to_string ( path) . unwrap ( ) ;
@@ -789,12 +808,12 @@ mod tests {
789808 let toggle = repo. toggles . get ( "prerequisite_toggle_not_exist" ) . unwrap ( ) ;
790809 let r = toggle. eval ( & user, & repo. segments , & repo. toggles , false , MAX_DEEP , None ) ;
791810
792- assert ! ( r. value. unwrap( ) . as_object( ) . unwrap( ) . get( "1 " ) . is_some( ) ) ;
811+ assert ! ( r. value. unwrap( ) . as_object( ) . unwrap( ) . get( "0 " ) . is_some( ) ) ;
793812 assert ! ( r. reason. contains( "not exist" ) ) ;
794813 }
795814
796815 #[ test]
797- fn test_prerequisite_not_match ( ) {
816+ fn test_prerequisite_not_match_should_return_disabled_variation ( ) {
798817 let mut path = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) ;
799818 path. push ( "resources/fixtures/repo.json" ) ;
800819 let json_str = fs:: read_to_string ( path) . unwrap ( ) ;
@@ -807,12 +826,12 @@ mod tests {
807826 let toggle = repo. toggles . get ( "prerequisite_toggle_not_match" ) . unwrap ( ) ;
808827 let r = toggle. eval ( & user, & repo. segments , & repo. toggles , false , MAX_DEEP , None ) ;
809828
810- assert ! ( r. value. unwrap( ) . as_object( ) . unwrap( ) . get( "1 " ) . is_some( ) ) ;
811- assert ! ( r. reason. contains( "default ." ) ) ;
829+ assert ! ( r. value. unwrap( ) . as_object( ) . unwrap( ) . get( "0 " ) . is_some( ) ) ;
830+ assert ! ( r. reason. contains( "disabled ." ) ) ;
812831 }
813832
814833 #[ test]
815- fn test_prerequisite_max_deep ( ) {
834+ fn test_prerequisite_depth_overflow_should_return_disabled_variation ( ) {
816835 let mut path = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) ;
817836 path. push ( "resources/fixtures/repo.json" ) ;
818837 let json_str = fs:: read_to_string ( path) . unwrap ( ) ;
@@ -825,8 +844,8 @@ mod tests {
825844 let toggle = repo. toggles . get ( "prerequisite_toggle" ) . unwrap ( ) ;
826845 let r = toggle. eval ( & user, & repo. segments , & repo. toggles , false , 1 , None ) ;
827846
828- assert ! ( r. value. unwrap( ) . as_object( ) . unwrap( ) . get( "1 " ) . is_some( ) ) ;
829- assert ! ( r. reason. contains( "deep overflow" ) ) ;
847+ assert ! ( r. value. unwrap( ) . as_object( ) . unwrap( ) . get( "0 " ) . is_some( ) ) ;
848+ assert ! ( r. reason. contains( "depth overflow" ) ) ;
830849 }
831850
832851 fn gen_users ( num : usize , random : bool ) -> Vec < FPUser > {
0 commit comments