Skip to content

Commit 47bc6fa

Browse files
Fix error when calling variation before initialisation (#361)
Signed-off-by: Thomas Poignant <[email protected]> Signed-off-by: Thomas Poignant <[email protected]>
1 parent d6dd663 commit 47bc6fa

File tree

2 files changed

+299
-102
lines changed

2 files changed

+299
-102
lines changed

variation.go

+53-6
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,15 @@ const (
1717
errorWrongVariation = "wrong variation used for flag %v"
1818
)
1919

20-
var offlineVariationResult = model.VariationResult{VariationType: flag.VariationSDKDefault, Failed: true}
20+
var (
21+
offlineVariationResult = model.VariationResult{VariationType: flag.VariationSDKDefault, Failed: false}
22+
notInitVariationResult = model.VariationResult{
23+
VariationType: flag.VariationSDKDefault,
24+
Failed: true,
25+
Reason: flag.ReasonError,
26+
ErrorCode: flag.ErrorCodeProviderNotReady,
27+
}
28+
)
2129

2230
// BoolVariation return the value of the flag in boolean.
2331
// An error is return if you don't have init the library before calling the function.
@@ -143,6 +151,10 @@ func (g *GoFeatureFlag) JSONVariation(
143151
// AllFlagsState return a flagstate.AllFlags that contains all the flags for a specific user.
144152
func (g *GoFeatureFlag) AllFlagsState(user ffuser.User) flagstate.AllFlags {
145153
flags := map[string]flag.Flag{}
154+
if g == nil {
155+
// empty AllFlags will set valid to false
156+
return flagstate.AllFlags{}
157+
}
146158

147159
if !g.config.Offline {
148160
var err error
@@ -211,9 +223,14 @@ func (g *GoFeatureFlag) GetFlagsFromCache() (map[string]flag.Flag, error) {
211223
}
212224

213225
// boolVariation is the internal func that handle the logic of a variation with a bool value
214-
// the result will always contains a valid model.BoolVarResult
226+
// the result will always contain a valid model.BoolVarResult
215227
func (g *GoFeatureFlag) boolVariation(flagKey string, user ffuser.User, sdkDefaultValue bool,
216228
) (model.BoolVarResult, error) {
229+
if g == nil {
230+
return model.BoolVarResult{Value: sdkDefaultValue, VariationResult: notInitVariationResult},
231+
fmt.Errorf("go-feature-flag is not initialised, default value is used")
232+
}
233+
217234
if g.config.Offline {
218235
return model.BoolVarResult{Value: sdkDefaultValue, VariationResult: offlineVariationResult}, nil
219236
}
@@ -254,6 +271,11 @@ func (g *GoFeatureFlag) boolVariation(flagKey string, user ffuser.User, sdkDefau
254271
// the result will always contain a valid model.IntVarResult
255272
func (g *GoFeatureFlag) intVariation(flagKey string, user ffuser.User, sdkDefaultValue int,
256273
) (model.IntVarResult, error) {
274+
if g == nil {
275+
return model.IntVarResult{Value: sdkDefaultValue, VariationResult: notInitVariationResult},
276+
fmt.Errorf("go-feature-flag is not initialised, default value is used")
277+
}
278+
257279
if g.config.Offline {
258280
return model.IntVarResult{Value: sdkDefaultValue, VariationResult: offlineVariationResult}, nil
259281
}
@@ -298,9 +320,14 @@ func (g *GoFeatureFlag) intVariation(flagKey string, user ffuser.User, sdkDefaul
298320
}
299321

300322
// float64Variation is the internal func that handle the logic of a variation with a float64 value
301-
// the result will always contains a valid model.Float64VarResult
323+
// the result will always contain a valid model.Float64VarResult
302324
func (g *GoFeatureFlag) float64Variation(flagKey string, user ffuser.User, sdkDefaultValue float64,
303325
) (model.Float64VarResult, error) {
326+
if g == nil {
327+
return model.Float64VarResult{Value: sdkDefaultValue, VariationResult: notInitVariationResult},
328+
fmt.Errorf("go-feature-flag is not initialised, default value is used")
329+
}
330+
304331
if g.config.Offline {
305332
return model.Float64VarResult{Value: sdkDefaultValue, VariationResult: offlineVariationResult}, nil
306333
}
@@ -337,9 +364,14 @@ func (g *GoFeatureFlag) float64Variation(flagKey string, user ffuser.User, sdkDe
337364
}
338365

339366
// stringVariation is the internal func that handle the logic of a variation with a string value
340-
// the result will always contains a valid model.StringVarResult
367+
// the result will always contain a valid model.StringVarResult
341368
func (g *GoFeatureFlag) stringVariation(flagKey string, user ffuser.User, sdkDefaultValue string,
342369
) (model.StringVarResult, error) {
370+
if g == nil {
371+
return model.StringVarResult{Value: sdkDefaultValue, VariationResult: notInitVariationResult},
372+
fmt.Errorf("go-feature-flag is not initialised, default value is used")
373+
}
374+
343375
if g.config.Offline {
344376
return model.StringVarResult{Value: sdkDefaultValue, VariationResult: offlineVariationResult}, nil
345377
}
@@ -376,9 +408,14 @@ func (g *GoFeatureFlag) stringVariation(flagKey string, user ffuser.User, sdkDef
376408
}
377409

378410
// jsonArrayVariation is the internal func that handle the logic of a variation with a json value
379-
// the result will always contains a valid model.JSONArrayVarResult
411+
// the result will always contain a valid model.JSONArrayVarResult
380412
func (g *GoFeatureFlag) jsonArrayVariation(flagKey string, user ffuser.User, sdkDefaultValue []interface{},
381413
) (model.JSONArrayVarResult, error) {
414+
if g == nil {
415+
return model.JSONArrayVarResult{Value: sdkDefaultValue, VariationResult: notInitVariationResult},
416+
fmt.Errorf("go-feature-flag is not initialised, default value is used")
417+
}
418+
382419
if g.config.Offline {
383420
return model.JSONArrayVarResult{Value: sdkDefaultValue, VariationResult: offlineVariationResult}, nil
384421
}
@@ -415,9 +452,14 @@ func (g *GoFeatureFlag) jsonArrayVariation(flagKey string, user ffuser.User, sdk
415452
}
416453

417454
// jsonVariation is the internal func that handle the logic of a variation with a json value
418-
// the result will always contains a valid model.JSONVarResult
455+
// the result will always contain a valid model.JSONVarResult
419456
func (g *GoFeatureFlag) jsonVariation(flagKey string, user ffuser.User, sdkDefaultValue map[string]interface{},
420457
) (model.JSONVarResult, error) {
458+
if g == nil {
459+
return model.JSONVarResult{Value: sdkDefaultValue, VariationResult: notInitVariationResult},
460+
fmt.Errorf("go-feature-flag is not initialised, default value is used")
461+
}
462+
421463
if g.config.Offline {
422464
return model.JSONVarResult{Value: sdkDefaultValue, VariationResult: offlineVariationResult}, nil
423465
}
@@ -477,6 +519,11 @@ func computeVariationResult(flag flag.Flag, resolutionDetails flag.ResolutionDet
477519
// Note: Use this function only if you are using multiple go-feature-flag instances.
478520
func (g *GoFeatureFlag) RawVariation(flagKey string, user ffuser.User, sdkDefaultValue interface{},
479521
) (model.RawVarResult, error) {
522+
if g == nil {
523+
return model.RawVarResult{Value: sdkDefaultValue, VariationResult: notInitVariationResult},
524+
fmt.Errorf("go-feature-flag is not initialised, default value is used")
525+
}
526+
480527
if g.config.Offline {
481528
return model.RawVarResult{Value: sdkDefaultValue, VariationResult: offlineVariationResult}, nil
482529
}

0 commit comments

Comments
 (0)