Skip to content

Commit

Permalink
use map[string]interface{} for notifications
Browse files Browse the repository at this point in the history
Signed-off-by: Skye Gill <[email protected]>
  • Loading branch information
skyerus committed Jan 6, 2023
1 parent 8f1712f commit 8850bbb
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 63 deletions.
31 changes: 1 addition & 30 deletions pkg/eval/ievaluator.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,13 @@ const (
NotificationUpdate StateChangeNotificationType = "update"
)

type StateChangeNotification struct {
Type StateChangeNotificationType `json:"type"`
Source string `json:"source"`
FlagKey string `json:"flagKey"`
}

/*
IEvaluator implementations store the state of the flags,
do parsing and validation of the flag state and evaluate flags in response to handlers.
*/
type IEvaluator interface {
GetState() (string, error)
SetState(source string, state string) ([]StateChangeNotification, error)
SetState(source string, state string) (map[string]interface{}, error)

ResolveBooleanValue(
reqID string,
Expand All @@ -47,26 +41,3 @@ type IEvaluator interface {
flagKey string,
context *structpb.Struct) (value map[string]any, variant string, reasons string, err error)
}

func (s *StateChangeNotification) ToMap() map[string]interface{} {
return map[string]interface{}{
"type": string(s.Type),
"source": s.Source,
"flagKey": s.FlagKey,
}
}

func StateChangeNotificationsToMap(scns []StateChangeNotification) map[string]interface{} {
m := make(map[string]interface{}, len(scns))

for _, scn := range scns {
m[scn.FlagKey] = map[string]interface{}{
"type": string(scn.Type),
"source": scn.Source,
}
}

return map[string]interface{}{
"flags": m,
}
}
2 changes: 1 addition & 1 deletion pkg/eval/json_evaluator.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ func (je *JSONEvaluator) GetState() (string, error) {
return string(data), nil
}

func (je *JSONEvaluator) SetState(source string, state string) ([]StateChangeNotification, error) {
func (je *JSONEvaluator) SetState(source string, state string) (map[string]interface{}, error) {
schemaLoader := gojsonschema.NewStringLoader(schema.FlagdDefinitions)
flagStringLoader := gojsonschema.NewStringLoader(state)
result, err := gojsonschema.Validate(schemaLoader, flagStringLoader)
Expand Down
31 changes: 14 additions & 17 deletions pkg/eval/json_evaluator_model.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,17 @@ type Evaluators struct {
Evaluators map[string]json.RawMessage `json:"$evaluators"`
}

func (f Flags) Merge(logger *logger.Logger, source string, ff Flags) (Flags, []StateChangeNotification) {
notifications := []StateChangeNotification{}
func (f Flags) Merge(logger *logger.Logger, source string, ff Flags) (Flags, map[string]interface{}) {
notifications := map[string]interface{}{}
result := Flags{Flags: make(map[string]Flag)}
for k, v := range f.Flags {
if v.Source == source {
if _, ok := ff.Flags[k]; !ok {
// flag has been deleted
notifications = append(notifications, StateChangeNotification{
Type: NotificationDelete,
Source: source,
FlagKey: k,
})
notifications[k] = map[string]interface{}{
"type": string(NotificationDelete),
"source": source,
}
continue
}
}
Expand All @@ -37,11 +36,10 @@ func (f Flags) Merge(logger *logger.Logger, source string, ff Flags) (Flags, []S
v.Source = source
val, ok := result.Flags[k]
if !ok {
notifications = append(notifications, StateChangeNotification{
Type: NotificationCreate,
Source: source,
FlagKey: k,
})
notifications[k] = map[string]interface{}{
"type": string(NotificationCreate),
"source": source,
}
} else if !reflect.DeepEqual(val, v) {
if val.Source != source {
logger.Warn(
Expand All @@ -53,11 +51,10 @@ func (f Flags) Merge(logger *logger.Logger, source string, ff Flags) (Flags, []S
),
)
}
notifications = append(notifications, StateChangeNotification{
Type: NotificationUpdate,
Source: source,
FlagKey: k,
})
notifications[k] = map[string]interface{}{
"type": string(NotificationUpdate),
"source": source,
}
}
result.Flags[k] = v
}
Expand Down
22 changes: 11 additions & 11 deletions pkg/eval/json_evaluator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -744,35 +744,35 @@ func TestMergeFlags(t *testing.T) {
new eval.Flags
newSource string
want eval.Flags
wantNotifs []eval.StateChangeNotification
wantNotifs map[string]interface{}
}{
{
name: "both nil",
current: eval.Flags{Flags: nil},
new: eval.Flags{Flags: nil},
want: eval.Flags{Flags: map[string]eval.Flag{}},
wantNotifs: []eval.StateChangeNotification{},
wantNotifs: map[string]interface{}{},
},
{
name: "both empty flags",
current: eval.Flags{Flags: map[string]eval.Flag{}},
new: eval.Flags{Flags: map[string]eval.Flag{}},
want: eval.Flags{Flags: map[string]eval.Flag{}},
wantNotifs: []eval.StateChangeNotification{},
wantNotifs: map[string]interface{}{},
},
{
name: "empty current",
current: eval.Flags{Flags: nil},
new: eval.Flags{Flags: map[string]eval.Flag{}},
want: eval.Flags{Flags: map[string]eval.Flag{}},
wantNotifs: []eval.StateChangeNotification{},
wantNotifs: map[string]interface{}{},
},
{
name: "empty new",
current: eval.Flags{Flags: map[string]eval.Flag{}},
new: eval.Flags{Flags: nil},
want: eval.Flags{Flags: map[string]eval.Flag{}},
wantNotifs: []eval.StateChangeNotification{},
wantNotifs: map[string]interface{}{},
},
{
name: "extra fields on each",
Expand All @@ -798,8 +798,8 @@ func TestMergeFlags(t *testing.T) {
Source: "2",
},
}},
wantNotifs: []eval.StateChangeNotification{
{Type: "write", Source: "2", FlagKey: "paka"},
wantNotifs: map[string]interface{}{
"paka": map[string]interface{}{"type": "write", "source": "2"},
},
},
{
Expand All @@ -815,9 +815,9 @@ func TestMergeFlags(t *testing.T) {
"waka": {DefaultVariant: "on"},
"paka": {DefaultVariant: "on"},
}},
wantNotifs: []eval.StateChangeNotification{
{Type: "update", FlagKey: "waka"},
{Type: "write", FlagKey: "paka"},
wantNotifs: map[string]interface{}{
"waka": map[string]interface{}{"type": "update", "source": ""},
"paka": map[string]interface{}{"type": "write", "source": ""},
},
},
{
Expand All @@ -831,7 +831,7 @@ func TestMergeFlags(t *testing.T) {
want: eval.Flags{Flags: map[string]eval.Flag{
"hello": {DefaultVariant: "off"},
}},
wantNotifs: []eval.StateChangeNotification{},
wantNotifs: map[string]interface{}{},
},
}

Expand Down
5 changes: 2 additions & 3 deletions pkg/eval/mock/ievaluator.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion pkg/runtime/runtime.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,9 @@ func (r *Runtime) updateState(ctx context.Context, syncr sync.ISync) error {

r.Service.Notify(service.Notification{
Type: service.ConfigurationChange,
Data: eval.StateChangeNotificationsToMap(notifications),
Data: map[string]interface{}{
"flags": notifications,
},
})
return nil
}

0 comments on commit 8850bbb

Please sign in to comment.