initial commit

This commit is contained in:
grambbledook
2026-01-12 16:30:40 +01:00
parent 0d1ec94548
commit f3fd2676ca
2 changed files with 51 additions and 3 deletions
+11
View File
@@ -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 {
+40 -3
View File
@@ -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