Skip to content

Commit 5272447

Browse files
authored
refactor: use flatCtx for vars/types of FlattenedContext (#388)
Signed-off-by: Sahid Velji <[email protected]>
1 parent a40081f commit 5272447

File tree

13 files changed

+94
-95
lines changed

13 files changed

+94
-95
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -365,27 +365,27 @@ func (i MyFeatureProvider) Hooks() []openfeature.Hook {
365365
return []openfeature.Hook{}
366366
}
367367
// BooleanEvaluation returns a boolean flag
368-
func (i MyFeatureProvider) BooleanEvaluation(ctx context.Context, flag string, defaultValue bool, evalCtx openfeature.FlattenedContext) openfeature.BoolResolutionDetail {
368+
func (i MyFeatureProvider) BooleanEvaluation(ctx context.Context, flag string, defaultValue bool, flatCtx openfeature.FlattenedContext) openfeature.BoolResolutionDetail {
369369
// code to evaluate boolean
370370
}
371371

372372
// StringEvaluation returns a string flag
373-
func (i MyFeatureProvider) StringEvaluation(ctx context.Context, flag string, defaultValue string, evalCtx openfeature.FlattenedContext) openfeature.StringResolutionDetail {
373+
func (i MyFeatureProvider) StringEvaluation(ctx context.Context, flag string, defaultValue string, flatCtx openfeature.FlattenedContext) openfeature.StringResolutionDetail {
374374
// code to evaluate string
375375
}
376376

377377
// FloatEvaluation returns a float flag
378-
func (i MyFeatureProvider) FloatEvaluation(ctx context.Context, flag string, defaultValue float64, evalCtx openfeature.FlattenedContext) openfeature.FloatResolutionDetail {
378+
func (i MyFeatureProvider) FloatEvaluation(ctx context.Context, flag string, defaultValue float64, flatCtx openfeature.FlattenedContext) openfeature.FloatResolutionDetail {
379379
// code to evaluate float
380380
}
381381

382382
// IntEvaluation returns an int flag
383-
func (i MyFeatureProvider) IntEvaluation(ctx context.Context, flag string, defaultValue int64, evalCtx openfeature.FlattenedContext) openfeature.IntResolutionDetail {
383+
func (i MyFeatureProvider) IntEvaluation(ctx context.Context, flag string, defaultValue int64, flatCtx openfeature.FlattenedContext) openfeature.IntResolutionDetail {
384384
// code to evaluate int
385385
}
386386

387387
// ObjectEvaluation returns an object flag
388-
func (i MyFeatureProvider) ObjectEvaluation(ctx context.Context, flag string, defaultValue any, evalCtx openfeature.FlattenedContext) openfeature.InterfaceResolutionDetail {
388+
func (i MyFeatureProvider) ObjectEvaluation(ctx context.Context, flag string, defaultValue any, flatCtx openfeature.FlattenedContext) openfeature.InterfaceResolutionDetail {
389389
// code to evaluate object
390390
}
391391

e2e/common_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import (
66
)
77

88
// ctxFunction is a context based evaluation callback
9-
var ctxFunction = func(this memprovider.InMemoryFlag, evalCtx openfeature.FlattenedContext) (
10-
any, openfeature.ProviderResolutionDetail) {
11-
9+
var ctxFunction = func(this memprovider.InMemoryFlag, flatCtx openfeature.FlattenedContext) (
10+
any, openfeature.ProviderResolutionDetail,
11+
) {
1212
defaultValue := this.Variants[this.DefaultVariant]
1313
defaultResolution := openfeature.ProviderResolutionDetail{
1414
Reason: openfeature.DefaultReason,
@@ -23,7 +23,7 @@ var ctxFunction = func(this memprovider.InMemoryFlag, evalCtx openfeature.Flatte
2323
}
2424

2525
for k, v := range expects {
26-
if v != evalCtx[k] {
26+
if v != flatCtx[k] {
2727
return defaultValue, defaultResolution
2828
}
2929
}

openfeature/client.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -670,8 +670,8 @@ func (c *Client) Track(ctx context.Context, trackingEventName string, evalCtx Ev
670670
// - client
671671
// - invocation (highest precedence)
672672
func (c *Client) forTracking(ctx context.Context, evalCtx EvaluationContext) (Tracker, EvaluationContext) {
673-
provider, _, apiCtx := c.api.ForEvaluation(c.metadata.domain)
674-
evalCtx = mergeContexts(evalCtx, c.evaluationContext, TransactionContext(ctx), apiCtx)
673+
provider, _, globalEvalCtx := c.api.ForEvaluation(c.metadata.domain)
674+
evalCtx = mergeContexts(evalCtx, c.evaluationContext, TransactionContext(ctx), globalEvalCtx)
675675
trackingProvider, ok := provider.(Tracker)
676676
if !ok {
677677
trackingProvider = NoopProvider{}
@@ -695,9 +695,9 @@ func (c *Client) evaluate(
695695
}
696696

697697
// ensure that the same provider & hooks are used across this transaction to avoid unexpected behaviour
698-
provider, globalHooks, globalCtx := c.api.ForEvaluation(c.metadata.domain)
698+
provider, globalHooks, globalEvalCtx := c.api.ForEvaluation(c.metadata.domain)
699699

700-
evalCtx = mergeContexts(evalCtx, c.evaluationContext, TransactionContext(ctx), globalCtx) // API (global) -> transaction -> client -> invocation
700+
evalCtx = mergeContexts(evalCtx, c.evaluationContext, TransactionContext(ctx), globalEvalCtx) // API (global) -> transaction -> client -> invocation
701701
apiClientInvocationProviderHooks := append(append(append(globalHooks, c.hooks...), options.hooks...), provider.Hooks()...) // API, Client, Invocation, Provider
702702
providerInvocationClientApiHooks := append(append(append(provider.Hooks(), options.hooks...), c.hooks...), globalHooks...) // Provider, Invocation, Client, API
703703

openfeature/interfaces.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type IEvaluation interface {
1515
GetNamedProviderMetadata(name string) Metadata
1616
GetClient() IClient
1717
GetNamedClient(clientName string) IClient
18-
SetEvaluationContext(apiCtx EvaluationContext)
18+
SetEvaluationContext(evalCtx EvaluationContext)
1919
AddHooks(hooks ...Hook)
2020
Shutdown()
2121
IEventing

openfeature/interfaces_mock.go

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

openfeature/memprovider/in_memory_provider.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func (i InMemoryProvider) Metadata() openfeature.Metadata {
3030
}
3131
}
3232

33-
func (i InMemoryProvider) BooleanEvaluation(ctx context.Context, flag string, defaultValue bool, evalCtx openfeature.FlattenedContext) openfeature.BoolResolutionDetail {
33+
func (i InMemoryProvider) BooleanEvaluation(ctx context.Context, flag string, defaultValue bool, flatCtx openfeature.FlattenedContext) openfeature.BoolResolutionDetail {
3434
memoryFlag, details, ok := i.find(flag)
3535
if !ok {
3636
return openfeature.BoolResolutionDetail{
@@ -39,7 +39,7 @@ func (i InMemoryProvider) BooleanEvaluation(ctx context.Context, flag string, de
3939
}
4040
}
4141

42-
resolveFlag, detail := memoryFlag.Resolve(defaultValue, evalCtx)
42+
resolveFlag, detail := memoryFlag.Resolve(defaultValue, flatCtx)
4343
result := genericResolve[bool](resolveFlag, defaultValue, &detail)
4444

4545
return openfeature.BoolResolutionDetail{
@@ -48,7 +48,7 @@ func (i InMemoryProvider) BooleanEvaluation(ctx context.Context, flag string, de
4848
}
4949
}
5050

51-
func (i InMemoryProvider) StringEvaluation(ctx context.Context, flag string, defaultValue string, evalCtx openfeature.FlattenedContext) openfeature.StringResolutionDetail {
51+
func (i InMemoryProvider) StringEvaluation(ctx context.Context, flag string, defaultValue string, flatCtx openfeature.FlattenedContext) openfeature.StringResolutionDetail {
5252
memoryFlag, details, ok := i.find(flag)
5353
if !ok {
5454
return openfeature.StringResolutionDetail{
@@ -57,7 +57,7 @@ func (i InMemoryProvider) StringEvaluation(ctx context.Context, flag string, def
5757
}
5858
}
5959

60-
resolveFlag, detail := memoryFlag.Resolve(defaultValue, evalCtx)
60+
resolveFlag, detail := memoryFlag.Resolve(defaultValue, flatCtx)
6161
result := genericResolve[string](resolveFlag, defaultValue, &detail)
6262

6363
return openfeature.StringResolutionDetail{
@@ -66,7 +66,7 @@ func (i InMemoryProvider) StringEvaluation(ctx context.Context, flag string, def
6666
}
6767
}
6868

69-
func (i InMemoryProvider) FloatEvaluation(ctx context.Context, flag string, defaultValue float64, evalCtx openfeature.FlattenedContext) openfeature.FloatResolutionDetail {
69+
func (i InMemoryProvider) FloatEvaluation(ctx context.Context, flag string, defaultValue float64, flatCtx openfeature.FlattenedContext) openfeature.FloatResolutionDetail {
7070
memoryFlag, details, ok := i.find(flag)
7171
if !ok {
7272
return openfeature.FloatResolutionDetail{
@@ -75,7 +75,7 @@ func (i InMemoryProvider) FloatEvaluation(ctx context.Context, flag string, defa
7575
}
7676
}
7777

78-
resolveFlag, detail := memoryFlag.Resolve(defaultValue, evalCtx)
78+
resolveFlag, detail := memoryFlag.Resolve(defaultValue, flatCtx)
7979
result := genericResolve[float64](resolveFlag, defaultValue, &detail)
8080

8181
return openfeature.FloatResolutionDetail{
@@ -84,7 +84,7 @@ func (i InMemoryProvider) FloatEvaluation(ctx context.Context, flag string, defa
8484
}
8585
}
8686

87-
func (i InMemoryProvider) IntEvaluation(ctx context.Context, flag string, defaultValue int64, evalCtx openfeature.FlattenedContext) openfeature.IntResolutionDetail {
87+
func (i InMemoryProvider) IntEvaluation(ctx context.Context, flag string, defaultValue int64, flatCtx openfeature.FlattenedContext) openfeature.IntResolutionDetail {
8888
memoryFlag, details, ok := i.find(flag)
8989
if !ok {
9090
return openfeature.IntResolutionDetail{
@@ -93,7 +93,7 @@ func (i InMemoryProvider) IntEvaluation(ctx context.Context, flag string, defaul
9393
}
9494
}
9595

96-
resolveFlag, detail := memoryFlag.Resolve(defaultValue, evalCtx)
96+
resolveFlag, detail := memoryFlag.Resolve(defaultValue, flatCtx)
9797
result := genericResolve[int](resolveFlag, int(defaultValue), &detail)
9898

9999
return openfeature.IntResolutionDetail{
@@ -102,7 +102,7 @@ func (i InMemoryProvider) IntEvaluation(ctx context.Context, flag string, defaul
102102
}
103103
}
104104

105-
func (i InMemoryProvider) ObjectEvaluation(ctx context.Context, flag string, defaultValue any, evalCtx openfeature.FlattenedContext) openfeature.InterfaceResolutionDetail {
105+
func (i InMemoryProvider) ObjectEvaluation(ctx context.Context, flag string, defaultValue any, flatCtx openfeature.FlattenedContext) openfeature.InterfaceResolutionDetail {
106106
memoryFlag, details, ok := i.find(flag)
107107
if !ok {
108108
return openfeature.InterfaceResolutionDetail{
@@ -111,7 +111,7 @@ func (i InMemoryProvider) ObjectEvaluation(ctx context.Context, flag string, def
111111
}
112112
}
113113

114-
resolveFlag, detail := memoryFlag.Resolve(defaultValue, evalCtx)
114+
resolveFlag, detail := memoryFlag.Resolve(defaultValue, flatCtx)
115115

116116
var result any
117117
if resolveFlag != nil {
@@ -175,7 +175,7 @@ type State string
175175

176176
// ContextEvaluator is a callback to perform openfeature.EvaluationContext backed evaluations.
177177
// This is a callback implemented by the flag definer.
178-
type ContextEvaluator *func(this InMemoryFlag, evalCtx openfeature.FlattenedContext) (any, openfeature.ProviderResolutionDetail)
178+
type ContextEvaluator *func(this InMemoryFlag, flatCtx openfeature.FlattenedContext) (any, openfeature.ProviderResolutionDetail)
179179

180180
// InMemoryFlag is the feature flag representation accepted by InMemoryProvider
181181
type InMemoryFlag struct {
@@ -186,9 +186,9 @@ type InMemoryFlag struct {
186186
ContextEvaluator ContextEvaluator
187187
}
188188

189-
func (flag *InMemoryFlag) Resolve(defaultValue any, evalCtx openfeature.FlattenedContext) (
190-
any, openfeature.ProviderResolutionDetail) {
191-
189+
func (flag *InMemoryFlag) Resolve(defaultValue any, flatCtx openfeature.FlattenedContext) (
190+
any, openfeature.ProviderResolutionDetail,
191+
) {
192192
// check the state
193193
if flag.State == Disabled {
194194
return defaultValue, openfeature.ProviderResolutionDetail{
@@ -199,7 +199,7 @@ func (flag *InMemoryFlag) Resolve(defaultValue any, evalCtx openfeature.Flattene
199199

200200
// first resolve from context callback
201201
if flag.ContextEvaluator != nil {
202-
return (*flag.ContextEvaluator)(*flag, evalCtx)
202+
return (*flag.ContextEvaluator)(*flag, flatCtx)
203203
}
204204

205205
// fallback to evaluation

openfeature/memprovider/in_memory_provider_test.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,11 @@ func TestInMemoryProvider_Object(t *testing.T) {
132132
}
133133

134134
func TestInMemoryProvider_WithContext(t *testing.T) {
135-
var variantKey = "VariantSelector"
135+
variantKey := "VariantSelector"
136136

137137
// simple context handling - variant is selected from key and returned
138-
var evaluator = func(callerFlag InMemoryFlag, evalCtx openfeature.FlattenedContext) (any, openfeature.ProviderResolutionDetail) {
139-
s := evalCtx[variantKey]
138+
evaluator := func(callerFlag InMemoryFlag, flatCtx openfeature.FlattenedContext) (any, openfeature.ProviderResolutionDetail) {
139+
s := flatCtx[variantKey]
140140
return callerFlag.Variants[s.(string)], openfeature.ProviderResolutionDetail{}
141141
}
142142

@@ -156,7 +156,6 @@ func TestInMemoryProvider_WithContext(t *testing.T) {
156156
ctx := context.Background()
157157

158158
t.Run("test with context", func(t *testing.T) {
159-
160159
evaluation := memoryProvider.BooleanEvaluation(ctx, "contextFlag", true, map[string]any{
161160
variantKey: "false",
162161
})

openfeature/noop_provider.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ func (e NoopProvider) Metadata() Metadata {
1212
}
1313

1414
// BooleanEvaluation returns a boolean flag.
15-
func (e NoopProvider) BooleanEvaluation(ctx context.Context, flag string, defaultValue bool, evalCtx FlattenedContext) BoolResolutionDetail {
15+
func (e NoopProvider) BooleanEvaluation(ctx context.Context, flag string, defaultValue bool, flatCtx FlattenedContext) BoolResolutionDetail {
1616
return BoolResolutionDetail{
1717
Value: defaultValue,
1818
ProviderResolutionDetail: ProviderResolutionDetail{
@@ -23,7 +23,7 @@ func (e NoopProvider) BooleanEvaluation(ctx context.Context, flag string, defaul
2323
}
2424

2525
// StringEvaluation returns a string flag.
26-
func (e NoopProvider) StringEvaluation(ctx context.Context, flag string, defaultValue string, evalCtx FlattenedContext) StringResolutionDetail {
26+
func (e NoopProvider) StringEvaluation(ctx context.Context, flag string, defaultValue string, flatCtx FlattenedContext) StringResolutionDetail {
2727
return StringResolutionDetail{
2828
Value: defaultValue,
2929
ProviderResolutionDetail: ProviderResolutionDetail{
@@ -34,7 +34,7 @@ func (e NoopProvider) StringEvaluation(ctx context.Context, flag string, default
3434
}
3535

3636
// FloatEvaluation returns a float flag.
37-
func (e NoopProvider) FloatEvaluation(ctx context.Context, flag string, defaultValue float64, evalCtx FlattenedContext) FloatResolutionDetail {
37+
func (e NoopProvider) FloatEvaluation(ctx context.Context, flag string, defaultValue float64, flatCtx FlattenedContext) FloatResolutionDetail {
3838
return FloatResolutionDetail{
3939
Value: defaultValue,
4040
ProviderResolutionDetail: ProviderResolutionDetail{
@@ -45,7 +45,7 @@ func (e NoopProvider) FloatEvaluation(ctx context.Context, flag string, defaultV
4545
}
4646

4747
// IntEvaluation returns an int flag.
48-
func (e NoopProvider) IntEvaluation(ctx context.Context, flag string, defaultValue int64, evalCtx FlattenedContext) IntResolutionDetail {
48+
func (e NoopProvider) IntEvaluation(ctx context.Context, flag string, defaultValue int64, flatCtx FlattenedContext) IntResolutionDetail {
4949
return IntResolutionDetail{
5050
Value: defaultValue,
5151
ProviderResolutionDetail: ProviderResolutionDetail{
@@ -56,7 +56,7 @@ func (e NoopProvider) IntEvaluation(ctx context.Context, flag string, defaultVal
5656
}
5757

5858
// ObjectEvaluation returns an object flag
59-
func (e NoopProvider) ObjectEvaluation(ctx context.Context, flag string, defaultValue any, evalCtx FlattenedContext) InterfaceResolutionDetail {
59+
func (e NoopProvider) ObjectEvaluation(ctx context.Context, flag string, defaultValue any, flatCtx FlattenedContext) InterfaceResolutionDetail {
6060
return InterfaceResolutionDetail{
6161
Value: defaultValue,
6262
ProviderResolutionDetail: ProviderResolutionDetail{

openfeature/openfeature_api.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type evaluationAPI struct {
1515
defaultProvider FeatureProvider
1616
namedProviders map[string]FeatureProvider
1717
hks []Hook
18-
apiCtx EvaluationContext
18+
evalCtx EvaluationContext
1919
eventExecutor *eventExecutor
2020
mu sync.RWMutex
2121
}
@@ -26,7 +26,7 @@ func newEvaluationAPI(eventExecutor *eventExecutor) *evaluationAPI {
2626
defaultProvider: NoopProvider{},
2727
namedProviders: map[string]FeatureProvider{},
2828
hks: []Hook{},
29-
apiCtx: EvaluationContext{},
29+
evalCtx: EvaluationContext{},
3030
mu: sync.RWMutex{},
3131
eventExecutor: eventExecutor,
3232
}
@@ -106,11 +106,11 @@ func (api *evaluationAPI) GetNamedClient(clientName string) IClient {
106106
return newClient(clientName, api, api.eventExecutor)
107107
}
108108

109-
func (api *evaluationAPI) SetEvaluationContext(apiCtx EvaluationContext) {
109+
func (api *evaluationAPI) SetEvaluationContext(evalCtx EvaluationContext) {
110110
api.mu.Lock()
111111
defer api.mu.Unlock()
112112

113-
api.apiCtx = apiCtx
113+
api.evalCtx = evalCtx
114114
}
115115

116116
// Deprecated: use [github.com/open-feature/go-sdk/openfeature/hooks.LoggingHook] instead.
@@ -171,7 +171,7 @@ func (api *evaluationAPI) ForEvaluation(clientName string) (FeatureProvider, []H
171171
provider = api.defaultProvider
172172
}
173173

174-
return provider, api.hks, api.apiCtx
174+
return provider, api.hks, api.evalCtx
175175
}
176176

177177
// GetProvider returns the default FeatureProvider
@@ -216,9 +216,9 @@ func (api *evaluationAPI) initNewAndShutdownOld(clientName string, newProvider F
216216
event, _ := initializer(newProvider, ctx)
217217
executor.states.Store(clientName, stateFromEventOrError(event, nil))
218218
executor.triggerEvent(event, newProvider)
219-
}(api.eventExecutor, api.apiCtx)
219+
}(api.eventExecutor, api.evalCtx)
220220
} else {
221-
event, err := initializer(newProvider, api.apiCtx)
221+
event, err := initializer(newProvider, api.evalCtx)
222222
api.eventExecutor.states.Store(clientName, stateFromEventOrError(event, err))
223223
api.eventExecutor.triggerEvent(event, newProvider)
224224
if err != nil {
@@ -249,7 +249,7 @@ func (api *evaluationAPI) initNewAndShutdownOld(clientName string, newProvider F
249249

250250
// initializer is a helper to execute provider initialization and generate appropriate event for the initialization
251251
// It also returns an error if the initialization resulted in an error
252-
func initializer(provider FeatureProvider, apiCtx EvaluationContext) (Event, error) {
252+
func initializer(provider FeatureProvider, evalCtx EvaluationContext) (Event, error) {
253253
event := Event{
254254
ProviderName: provider.Metadata().Name,
255255
EventType: ProviderReady,
@@ -264,7 +264,7 @@ func initializer(provider FeatureProvider, apiCtx EvaluationContext) (Event, err
264264
return event, nil
265265
}
266266

267-
err := handler.Init(apiCtx)
267+
err := handler.Init(evalCtx)
268268
if err != nil {
269269
event.EventType = ProviderError
270270
event.Message = fmt.Sprintf("Provider initialization error, %v", err)

0 commit comments

Comments
 (0)