@@ -32,6 +32,17 @@ const (
32
32
type Query interface {
33
33
GetSegment (identifier string ) (rest.Segment , error )
34
34
GetFlag (identifier string ) (rest.FeatureConfig , error )
35
+ GetFlags () ([]rest.FeatureConfig , error )
36
+ }
37
+
38
+ // FlagVariations list of FlagVariations
39
+ type FlagVariations []FlagVariation
40
+
41
+ // FlagVariation contains all required for ff-server to evaluate.
42
+ type FlagVariation struct {
43
+ FlagIdentifier string
44
+ Kind rest.FeatureConfigKind
45
+ Variation rest.Variation
35
46
}
36
47
37
48
// PostEvalData holds information for post evaluation processing
@@ -327,28 +338,55 @@ func (e Evaluator) checkPreRequisite(fc *rest.FeatureConfig, target *Target) (bo
327
338
return true , nil
328
339
}
329
340
330
- // Evaluate exposes evaluate to the caller.
331
- func (e Evaluator ) Evaluate (identifier string , target * Target , kind string ) (rest.Variation , error ) {
341
+ // EvaluateAll evaluates all the flags
342
+ func (e Evaluator ) EvaluateAll (target * Target ) (FlagVariations , error ) {
343
+ return e .evaluateAll (target )
344
+ }
345
+
346
+ // takes uses feature store.List function to get all the flags.
347
+ func (e Evaluator ) evaluateAll (target * Target ) ([]FlagVariation , error ) {
348
+ var variations []FlagVariation
349
+ flags , err := e .query .GetFlags ()
350
+ if err != nil {
351
+ return variations , err
352
+ }
353
+ for _ , f := range flags {
354
+ v , _ := e .getVariationForTheFlag (f , target )
355
+ variations = append (variations , FlagVariation {f .Feature , f .Kind , v })
356
+ }
357
+
358
+ return variations , nil
359
+ }
332
360
333
- return e .evaluate (identifier , target , kind )
361
+ // Evaluate exposes evaluate to the caller.
362
+ func (e Evaluator ) Evaluate (identifier string , target * Target ) (FlagVariation , error ) {
363
+ return e .evaluate (identifier , target )
334
364
}
335
365
336
- func (e Evaluator ) evaluate (identifier string , target * Target , kind string ) (rest.Variation , error ) {
366
+ // this is evaluating flag.
367
+ func (e Evaluator ) evaluate (identifier string , target * Target ) (FlagVariation , error ) {
337
368
338
369
if e .query == nil {
339
370
e .logger .Errorf (ErrQueryProviderMissing .Error ())
340
- return rest. Variation {}, ErrQueryProviderMissing
371
+ return FlagVariation {}, ErrQueryProviderMissing
341
372
}
342
373
flag , err := e .query .GetFlag (identifier )
343
374
if err != nil {
344
- return rest. Variation {}, err
375
+ return FlagVariation {}, err
345
376
}
346
- if string (flag .Kind ) != kind {
347
- return rest.Variation {}, fmt .Errorf ("%w, expected: %s, got: %s" , ErrFlagKindMismatch , kind , flag .Kind )
377
+
378
+ variation , err := e .getVariationForTheFlag (flag , target )
379
+ if err != nil {
380
+ return FlagVariation {}, err
348
381
}
382
+ return FlagVariation {flag .Feature , flag .Kind , variation }, nil
383
+ }
384
+
385
+ // evaluates the flag and returns a proper variation.
386
+ func (e Evaluator ) getVariationForTheFlag (flag rest.FeatureConfig , target * Target ) (rest.Variation , error ) {
349
387
350
388
if flag .Prerequisites != nil {
351
- prereq , err := e .checkPreRequisite (& flag , target ) // equivalent of evaluateWithPreReqq
389
+ prereq , err := e .checkPreRequisite (& flag , target )
352
390
if err != nil || ! prereq {
353
391
return findVariation (flag .Variations , flag .OffVariation )
354
392
}
@@ -371,34 +409,33 @@ func (e Evaluator) evaluate(identifier string, target *Target, kind string) (res
371
409
372
410
// BoolVariation returns boolean evaluation for target
373
411
func (e Evaluator ) BoolVariation (identifier string , target * Target , defaultValue bool ) bool {
374
- variation , err := e .evaluate (identifier , target , "boolean" )
412
+ //flagVariation, err := e.evaluate(identifier, target, "boolean")
413
+ flagVariation , err := e .evaluate (identifier , target )
375
414
if err != nil {
376
415
e .logger .Errorf ("Error while evaluating boolean flag '%s', err: %v" , identifier , err )
377
416
return defaultValue
378
417
}
379
- return strings .ToLower (variation .Value ) == "true"
418
+ return strings .ToLower (flagVariation . Variation .Value ) == "true"
380
419
}
381
420
382
421
// StringVariation returns string evaluation for target
383
422
func (e Evaluator ) StringVariation (identifier string , target * Target , defaultValue string ) string {
384
-
385
- variation , err := e .evaluate (identifier , target , "string" )
423
+ flagVariation , err := e .evaluate (identifier , target )
386
424
if err != nil {
387
425
e .logger .Errorf ("Error while evaluating string flag '%s', err: %v" , identifier , err )
388
426
return defaultValue
389
427
}
390
- return variation .Value
428
+ return flagVariation . Variation .Value
391
429
}
392
430
393
431
// IntVariation returns int evaluation for target
394
432
func (e Evaluator ) IntVariation (identifier string , target * Target , defaultValue int ) int {
395
-
396
- variation , err := e .evaluate (identifier , target , "int" )
433
+ flagVariation , err := e .evaluate (identifier , target )
397
434
if err != nil {
398
435
e .logger .Errorf ("Error while evaluating int flag '%s', err: %v" , identifier , err )
399
436
return defaultValue
400
437
}
401
- val , err := strconv .Atoi (variation .Value )
438
+ val , err := strconv .Atoi (flagVariation . Variation .Value )
402
439
if err != nil {
403
440
return defaultValue
404
441
}
@@ -408,12 +445,12 @@ func (e Evaluator) IntVariation(identifier string, target *Target, defaultValue
408
445
// NumberVariation returns number evaluation for target
409
446
func (e Evaluator ) NumberVariation (identifier string , target * Target , defaultValue float64 ) float64 {
410
447
//all numbers are stored as ints in the database
411
- variation , err := e .evaluate (identifier , target , "int" )
448
+ flagVariation , err := e .evaluate (identifier , target )
412
449
if err != nil {
413
450
e .logger .Errorf ("Error while evaluating number flag '%s', err: %v" , identifier , err )
414
451
return defaultValue
415
452
}
416
- val , err := strconv .ParseFloat (variation .Value , 64 )
453
+ val , err := strconv .ParseFloat (flagVariation . Variation .Value , 64 )
417
454
if err != nil {
418
455
return defaultValue
419
456
}
@@ -423,14 +460,13 @@ func (e Evaluator) NumberVariation(identifier string, target *Target, defaultVal
423
460
// JSONVariation returns json evaluation for target
424
461
func (e Evaluator ) JSONVariation (identifier string , target * Target ,
425
462
defaultValue map [string ]interface {}) map [string ]interface {} {
426
-
427
- variation , err := e .evaluate (identifier , target , "json" )
463
+ flagVariation , err := e .evaluate (identifier , target )
428
464
if err != nil {
429
465
e .logger .Errorf ("Error while evaluating json flag '%s', err: %v" , identifier , err )
430
466
return defaultValue
431
467
}
432
468
val := make (map [string ]interface {})
433
- err = json .Unmarshal ([]byte (variation .Value ), & val )
469
+ err = json .Unmarshal ([]byte (flagVariation . Variation .Value ), & val )
434
470
if err != nil {
435
471
return defaultValue
436
472
}
0 commit comments