From f3fd2676cad8b51b06cfda8d7ddaf855b6997607 Mon Sep 17 00:00:00 2001 From: grambbledook Date: Mon, 8 Dec 2025 14:41:26 +0100 Subject: [PATCH] initial commit --- pkg/services/featuremgmt/models.go | 11 ++++++ pkg/services/featuremgmt/static_provider.go | 43 +++++++++++++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/pkg/services/featuremgmt/models.go b/pkg/services/featuremgmt/models.go index d59dff63c37..f47c0484127 100644 --- a/pkg/services/featuremgmt/models.go +++ b/pkg/services/featuremgmt/models.go @@ -126,6 +126,15 @@ func (s *FeatureFlagStage) UnmarshalJSON(b []byte) error { return nil } +type FeatureFlagType string + +const ( + Boolean = "boolean" + Number = "number" + Object = "object" + String = "string" +) + // These are properties about the feature, but not the current state or value for it type FeatureFlag struct { Name string `json:"name" yaml:"name"` // Unique name @@ -143,6 +152,8 @@ type FeatureFlag struct { // The server must be initialized with the value RequiresRestart bool `json:"requiresRestart,omitempty"` + + Type FeatureFlagType `json:"type,omitempty"` } type FeatureToggleWebhookPayload struct { diff --git a/pkg/services/featuremgmt/static_provider.go b/pkg/services/featuremgmt/static_provider.go index f384bd00de1..22f6f3ff3db 100644 --- a/pkg/services/featuremgmt/static_provider.go +++ b/pkg/services/featuremgmt/static_provider.go @@ -1,6 +1,7 @@ package featuremgmt import ( + "fmt" "github.com/open-feature/go-sdk/openfeature" "github.com/open-feature/go-sdk/openfeature/memprovider" ) @@ -38,10 +39,18 @@ func newStaticProvider(confFlags map[string]bool) (openfeature.FeatureProvider, // Add standard flags for _, flag := range standardFeatureFlags { - if _, exists := flags[flag.Name]; !exists { - enabled := flag.Expression == "true" - flags[flag.Name] = createInMemoryFlag(flag.Name, enabled) + _, exists := flags[flag.Name] + + if exists && flag.Type != Boolean { + return nil, fmt.Errorf("flag %s already exists", flag.Name) } + + inMemFlag, err := createFlag(flag) + if err != nil { + return nil, err + } + + flags[flag.Name] = inMemFlag } return newInMemoryBulkProvider(flags), nil @@ -62,3 +71,31 @@ func createInMemoryFlag(name string, enabled bool) memprovider.InMemoryFlag { }, } } + +func createFlag(flag FeatureFlag) (memprovider.InMemoryFlag, error) { + defaultVariant := "default" + + var value any + switch flag.Type { + case Boolean: + value = flag.Expression == "true" + case String: + value = flag.Expression + case Number: + value = f + case Object: + value = value + default: + return memprovider.InMemoryFlag{}, fmt.Errorf("unsupported flag type %s", flag.Type) + } + + return memprovider.InMemoryFlag{ + Key: flag.Name, + DefaultVariant: defaultVariant, + Variants: map[string]any{ + defaultVariant: value, + }, + }, nil +} + +func