Skip to content

Commit 699ea48

Browse files
committed
fixup: further improvements
Signed-off-by: Simon Schrottner <[email protected]>
1 parent b169dc0 commit 699ea48

File tree

3 files changed

+47
-42
lines changed

3 files changed

+47
-42
lines changed

core/pkg/evaluator/json.go

Lines changed: 24 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,15 @@ type JsonDef struct {
451451
Metadata map[string]interface{} `json:"metadata"`
452452
}
453453

454+
type JsonArrayDef struct {
455+
JsonDef
456+
Flags []model.Flag `json:"flags"`
457+
}
458+
type JsonMapDef struct {
459+
JsonDef
460+
Flags map[string]model.Flag `json:"flags"`
461+
}
462+
454463
// configToFlagDefinition convert string configurations to flags and store them to pointer newFlags
455464
func (je *JSON) configToFlagDefinition(config string, definition *Definition) error {
456465
// json schema validation
@@ -481,26 +490,25 @@ func (je *JSON) configToFlagDefinition(config string, definition *Definition) er
481490
// Process flags directly
482491
switch v := intermediateConfig.Flags.(type) {
483492
case map[string]interface{}: // Handle ValidFlags format
484-
for k, e := range v {
485-
flag, err := convertToModelFlag(e)
486-
if err != nil {
487-
return fmt.Errorf("failed to process flag for key %s: %w", k, err)
488-
}
489-
flag.Key = k // Populate the `Key` field explicitly
490-
definition.Flags = append(definition.Flags, flag)
493+
var jsonDef JsonMapDef
494+
err = json.Unmarshal([]byte(transposedConfig), &jsonDef)
495+
if err != nil {
496+
return fmt.Errorf("unmarshalling provided configurations: %w", err)
497+
}
498+
var flags []model.Flag
499+
for key, flagDef := range jsonDef.Flags {
500+
flagDef.Key = key
501+
flags = append(flags, flagDef)
491502
}
503+
definition.Flags = flags
492504

493505
case []interface{}: // Handle ValidMapFlags format
494-
for _, value := range v {
495-
flag, err := convertToModelFlag(value)
496-
if err != nil {
497-
return fmt.Errorf("failed to process flag: %w", err)
498-
}
499-
if flag.Key == "" {
500-
return fmt.Errorf("invalid key for flag: %s", value)
501-
}
502-
definition.Flags = append(definition.Flags, flag)
506+
var jsonDef JsonArrayDef
507+
err = json.Unmarshal([]byte(transposedConfig), &jsonDef)
508+
if err != nil {
509+
return fmt.Errorf("unmarshalling provided configurations: %w", err)
503510
}
511+
definition.Flags = jsonDef.Flags
504512

505513
default:
506514
return fmt.Errorf("unexpected type for flags property: %T", v)
@@ -509,31 +517,6 @@ func (je *JSON) configToFlagDefinition(config string, definition *Definition) er
509517
return validateDefaultVariants(definition)
510518
}
511519

512-
// Refactored Helper Function to Convert interface{} to model.Flag
513-
func convertToModelFlag(data interface{}) (model.Flag, error) {
514-
515-
type Flag struct {
516-
Key string `json:"key,omitempty"`
517-
model.Flag
518-
}
519-
520-
var flag Flag
521-
jsonBytes, err := json.Marshal(data)
522-
523-
if err != nil {
524-
return flag.Flag, fmt.Errorf("failed to marshal flag data: %w", err)
525-
}
526-
527-
if err := json.Unmarshal(jsonBytes, &flag); err != nil {
528-
return flag.Flag, fmt.Errorf("failed to unmarshal flag data: %w", err)
529-
}
530-
531-
exportFlag := flag.Flag
532-
exportFlag.Key = flag.Key
533-
534-
return exportFlag, nil
535-
}
536-
537520
// validateDefaultVariants returns an error if any of the default variants aren't valid
538521
func validateDefaultVariants(flags *Definition) error {
539522
for _, flag := range flags.Flags {

core/pkg/evaluator/json_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1359,6 +1359,16 @@ func TestState_Evaluator(t *testing.T) {
13591359
for i, v := range parsed.Flags {
13601360
v.FlagSetId = "flagSetId"
13611361
parsed.Flags[i] = v
1362+
1363+
// json data can be formatted differently, hence we remove it from the object and compare separately
1364+
parsedTargeting, _ := normalizeJSON(v.Targeting)
1365+
parsed.Flags[i].Targeting = nil
1366+
gotTargeting, _ := normalizeJSON(got[i].Targeting)
1367+
got[i].Targeting = nil
1368+
1369+
if !reflect.DeepEqual(parsedTargeting, gotTargeting) {
1370+
t.Errorf("\nexpected targeting: %s\ngot targeting: %s", parsedTargeting, gotTargeting)
1371+
}
13621372
}
13631373

13641374
if !reflect.DeepEqual(parsed.Flags, got) {
@@ -1368,6 +1378,18 @@ func TestState_Evaluator(t *testing.T) {
13681378
}
13691379
}
13701380

1381+
func normalizeJSON(jsonData []byte) (interface{}, error) {
1382+
var result interface{}
1383+
if jsonData == nil {
1384+
return nil, nil // Handle nil gracefully
1385+
}
1386+
err := json.Unmarshal(jsonData, &result)
1387+
if err != nil {
1388+
return nil, fmt.Errorf("failed to unmarshal JSON: %w", err)
1389+
}
1390+
return result, nil
1391+
}
1392+
13711393
func TestFlagStateSafeForConcurrentReadWrites(t *testing.T) {
13721394
tests := map[string]struct {
13731395
flagResolution func(evaluator *JSON) error

core/pkg/model/flag.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const Source = "Source"
88
const Priority = "Priority"
99

1010
type Flag struct {
11-
Key string `json:"-"` // not serialized, used only for indexing
11+
Key string `json:"key" json:"-"`
1212
FlagSetId string `json:"-"` // not serialized, used only for indexing
1313
Priority int `json:"-"` // not serialized, used only for indexing
1414
State string `json:"state"`

0 commit comments

Comments
 (0)