Skip to content

Commit d9471db

Browse files
author
Michael Ng
authored
Merge branch 'fm-beta' into jctong/lint
2 parents 2ee2abb + 947bf00 commit d9471db

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+1371
-170
lines changed

.golangci.yml

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
linters-settings:
2+
govet:
3+
check-shadowing: true
4+
golint:
5+
min-confidence: 0
6+
gocyclo:
7+
min-complexity: 16
8+
maligned:
9+
suggest-new: true
10+
dupl:
11+
threshold: 100
12+
goconst:
13+
min-len: 2
14+
min-occurrences: 2
15+
misspell:
16+
locale: US
17+
lll:
18+
line-length: 140
19+
gocritic:
20+
enabled-tags:
21+
- performance
22+
- style
23+
- experimental
24+
disabled-checks:
25+
- wrapperFunc
26+
- hugeParam
27+
- rangeValCopy
28+
29+
linters:
30+
disable-all: true
31+
enable:
32+
- megacheck
33+
- golint
34+
- govet
35+
- unconvert
36+
- megacheck
37+
- structcheck
38+
- gas
39+
- gocyclo
40+
- dupl
41+
- misspell
42+
- unparam
43+
- varcheck
44+
- deadcode
45+
- typecheck
46+
- ineffassign
47+
- varcheck
48+
- stylecheck
49+
#- gochecknoinits
50+
- scopelint
51+
- gocritic
52+
- golint
53+
- nakedret
54+
- gosimple
55+
- prealloc
56+
- maligned
57+
fast: false
58+
59+
run:
60+
skip-dirs:
61+
- vendor
62+
concurrency: 4
63+
64+
issues:
65+
exclude-rules:
66+
- text: "weak cryptographic primitive"
67+
linters:
68+
- gosec
69+
exclude-use-default: false
70+
71+
service:
72+
golangci-lint-version: 1.17.x

optimizely/client/client.go

Lines changed: 75 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* limitations under the License. *
1515
***************************************************************************/
1616

17+
// Package client has client definitions
1718
package client
1819

1920
import (
@@ -22,6 +23,7 @@ import (
2223
"fmt"
2324
"reflect"
2425
"runtime/debug"
26+
"strconv"
2527

2628
"github.com/optimizely/go-sdk/optimizely/event"
2729

@@ -36,7 +38,7 @@ var logger = logging.GetLogger("Client")
3638
// OptimizelyClient is the entry point to the Optimizely SDK
3739
type OptimizelyClient struct {
3840
configManager optimizely.ProjectConfigManager
39-
decisionService decision.DecisionService
41+
decisionService decision.Service
4042
eventProcessor event.Processor
4143
isValid bool
4244

@@ -54,15 +56,16 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
5456
}
5557
}()
5658

57-
if isValid, err := o.isValidClient("IsFeatureEnabled"); !isValid {
59+
var isValid bool
60+
if isValid, err = o.isValidClient("IsFeatureEnabled"); !isValid {
5861
return false, err
5962
}
6063

6164
projectConfig := o.configManager.GetConfig()
62-
feature, err := projectConfig.GetFeatureByKey(featureKey)
63-
if err != nil {
64-
logger.Error("Error retrieving feature", err)
65-
return result, err
65+
feature, e := projectConfig.GetFeatureByKey(featureKey)
66+
if e != nil {
67+
logger.Error("Error retrieving feature", e)
68+
return result, e
6669
}
6770
featureDecisionContext := decision.FeatureDecisionContext{
6871
Feature: &feature,
@@ -71,14 +74,14 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
7174

7275
userID := userContext.ID
7376
logger.Debug(fmt.Sprintf(`Evaluating feature "%s" for user "%s".`, featureKey, userID))
74-
featureDecision, err := o.decisionService.GetFeatureDecision(featureDecisionContext, userContext)
77+
featureDecision, e1 := o.decisionService.GetFeatureDecision(featureDecisionContext, userContext)
7578

76-
if err != nil {
77-
logger.Error("Received an error while computing feature decision", err)
78-
return result, err
79+
if e1 != nil {
80+
logger.Error("received an error while computing feature decision", e1)
81+
return result, e1
7982
}
8083

81-
result = (featureDecision.Variation.FeatureEnabled == true)
84+
result = featureDecision.Variation.FeatureEnabled
8285
if result {
8386
logger.Info(fmt.Sprintf(`Feature "%s" is enabled for user "%s".`, featureKey, userID))
8487
} else {
@@ -98,7 +101,7 @@ func (o *OptimizelyClient) GetEnabledFeatures(userContext entities.UserContext)
98101

99102
defer func() {
100103
if r := recover(); r != nil {
101-
errorMessage := fmt.Sprintf(`Optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
104+
errorMessage := fmt.Sprintf(`optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
102105
err = errors.New(errorMessage)
103106
logger.Error(errorMessage, err)
104107
}
@@ -124,15 +127,15 @@ func (o *OptimizelyClient) GetEnabledFeatures(userContext entities.UserContext)
124127
// Track take and event key with event tags and if the event is part of the config, send to events backend.
125128
func (o *OptimizelyClient) Track(eventKey string, userContext entities.UserContext, eventTags map[string]interface{}) (err error) {
126129
if !o.isValid {
127-
errorMessage := "Optimizely instance is not valid. Failing GetEnabledFeatures."
130+
errorMessage := "optimizely instance is not valid; failing GetEnabledFeatures"
128131
err = errors.New(errorMessage)
129132
logger.Error(errorMessage, err)
130133
return err
131134
}
132135

133136
defer func() {
134137
if r := recover(); r != nil {
135-
errorMessage := fmt.Sprintf(`Optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
138+
errorMessage := fmt.Sprintf(`optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
136139
err = errors.New(errorMessage)
137140
logger.Error(errorMessage, err)
138141
}
@@ -144,52 +147,92 @@ func (o *OptimizelyClient) Track(eventKey string, userContext entities.UserConte
144147
userEvent := event.CreateConversionUserEvent(o.configManager.GetConfig(), configEvent, userContext, eventTags)
145148
o.eventProcessor.ProcessEvent(userEvent)
146149
} else {
147-
errorMessage := fmt.Sprintf(`Optimizely SDK track: error getting event with key "%s"`, eventKey)
150+
errorMessage := fmt.Sprintf(`optimizely SDK track: error getting event with key "%s"`, eventKey)
148151
logger.Error(errorMessage, eventError)
149152
return eventError
150153
}
151154

152155
return nil
153156
}
154157

158+
// GetFeatureVariableBoolean returns boolean feature variable value
159+
func (o *OptimizelyClient) GetFeatureVariableBoolean(featureKey, variableKey string, userContext entities.UserContext) (value bool, err error) {
160+
val, valueType, err := o.getFeatureVariable(featureKey, variableKey, userContext)
161+
if err != nil {
162+
return false, err
163+
}
164+
convertedValue, err := strconv.ParseBool(val)
165+
if err != nil || valueType != entities.Boolean {
166+
return false, fmt.Errorf("variable value for key %s is invalid or wrong type", variableKey)
167+
}
168+
return convertedValue, err
169+
}
170+
171+
// GetFeatureVariableDouble returns double feature variable value
172+
func (o *OptimizelyClient) GetFeatureVariableDouble(featureKey, variableKey string, userContext entities.UserContext) (value float64, err error) {
173+
val, valueType, err := o.getFeatureVariable(featureKey, variableKey, userContext)
174+
if err != nil {
175+
return 0, err
176+
}
177+
convertedValue, err := strconv.ParseFloat(val, 64)
178+
if err != nil || valueType != entities.Double {
179+
return 0, fmt.Errorf("variable value for key %s is invalid or wrong type", variableKey)
180+
}
181+
return convertedValue, err
182+
}
183+
184+
// GetFeatureVariableInteger returns integer feature variable value
185+
func (o *OptimizelyClient) GetFeatureVariableInteger(featureKey, variableKey string, userContext entities.UserContext) (value int, err error) {
186+
val, valueType, err := o.getFeatureVariable(featureKey, variableKey, userContext)
187+
if err != nil {
188+
return 0, err
189+
}
190+
convertedValue, err := strconv.Atoi(val)
191+
if err != nil || valueType != entities.Integer {
192+
return 0, fmt.Errorf("variable value for key %s is invalid or wrong type", variableKey)
193+
}
194+
return convertedValue, err
195+
}
196+
155197
// GetFeatureVariableString returns string feature variable value
156-
func (o *OptimizelyClient) GetFeatureVariableString(featureKey string, variableKey string, userContext entities.UserContext) (value string, err error) {
198+
func (o *OptimizelyClient) GetFeatureVariableString(featureKey, variableKey string, userContext entities.UserContext) (value string, err error) {
157199
value, valueType, err := o.getFeatureVariable(featureKey, variableKey, userContext)
158200
if err != nil {
159201
return "", err
160202
}
161-
if valueType != "string" {
162-
return "", fmt.Errorf("Variable value for key %s is wrong type", variableKey)
203+
if valueType != entities.String {
204+
return "", fmt.Errorf("variable value for key %s is wrong type", variableKey)
163205
}
164206
return value, err
165207
}
166208

167-
func (o *OptimizelyClient) getFeatureVariable(featureKey string, variableKey string, userContext entities.UserContext) (value string, valueType string, err error) {
209+
func (o *OptimizelyClient) getFeatureVariable(featureKey, variableKey string, userContext entities.UserContext) (value string, valueType entities.VariableType, err error) {
168210

169211
defer func() {
170212
if r := recover(); r != nil {
171-
errorMessage := fmt.Sprintf(`Optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
213+
errorMessage := fmt.Sprintf(`optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
172214
err = errors.New(errorMessage)
173215
logger.Error(errorMessage, err)
174216
}
175217
}()
176218

177-
if isValid, err := o.isValidClient("getFeatureVariable"); !isValid {
219+
var isValid bool
220+
if isValid, err = o.isValidClient("getFeatureVariable"); !isValid {
178221
return "", "", err
179222
}
180223

181224
projectConfig := o.configManager.GetConfig()
182225

183-
feature, err := projectConfig.GetFeatureByKey(featureKey)
184-
if err != nil {
185-
logger.Error("Error retrieving feature", err)
186-
return "", "", err
226+
feature, e := projectConfig.GetFeatureByKey(featureKey)
227+
if e != nil {
228+
logger.Error("error retrieving feature", e)
229+
return "", "", e
187230
}
188231

189-
variable, err := projectConfig.GetVariableByKey(featureKey, variableKey)
190-
if err != nil {
191-
logger.Error("Error retrieving variable", err)
192-
return "", "", err
232+
variable, e1 := projectConfig.GetVariableByKey(featureKey, variableKey)
233+
if e1 != nil {
234+
logger.Error("error retrieving variable", e1)
235+
return "", "", e1
193236
}
194237

195238
var featureValue = variable.DefaultValue
@@ -199,8 +242,8 @@ func (o *OptimizelyClient) getFeatureVariable(featureKey string, variableKey str
199242
ProjectConfig: projectConfig,
200243
}
201244

202-
featureDecision, err := o.decisionService.GetFeatureDecision(featureDecisionContext, userContext)
203-
if err == nil {
245+
featureDecision, e2 := o.decisionService.GetFeatureDecision(featureDecisionContext, userContext)
246+
if e2 == nil {
204247
if v, ok := featureDecision.Variation.Variables[variable.ID]; ok && featureDecision.Variation.FeatureEnabled {
205248
featureValue = v.Value
206249
}
@@ -212,7 +255,7 @@ func (o *OptimizelyClient) getFeatureVariable(featureKey string, variableKey str
212255

213256
func (o *OptimizelyClient) isValidClient(methodName string) (result bool, err error) {
214257
if !o.isValid {
215-
errorMessage := fmt.Sprintf("Optimizely instance is not valid. Failing %s.", methodName)
258+
errorMessage := fmt.Sprintf("optimizely instance is not valid. Failing %s.", methodName)
216259
err := errors.New(errorMessage)
217260
logger.Error(errorMessage, nil)
218261
return false, err

0 commit comments

Comments
 (0)