14
14
* limitations under the License. *
15
15
***************************************************************************/
16
16
17
+ // Package client has client definitions
17
18
package client
18
19
19
20
import (
@@ -37,7 +38,7 @@ var logger = logging.GetLogger("Client")
37
38
// OptimizelyClient is the entry point to the Optimizely SDK
38
39
type OptimizelyClient struct {
39
40
configManager optimizely.ProjectConfigManager
40
- decisionService decision.DecisionService
41
+ decisionService decision.Service
41
42
eventProcessor event.Processor
42
43
isValid bool
43
44
@@ -55,15 +56,16 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
55
56
}
56
57
}()
57
58
58
- if isValid , err := o .isValidClient ("IsFeatureEnabled" ); ! isValid {
59
+ var isValid bool
60
+ if isValid , err = o .isValidClient ("IsFeatureEnabled" ); ! isValid {
59
61
return false , err
60
62
}
61
63
62
64
projectConfig := o .configManager .GetConfig ()
63
- feature , err := projectConfig .GetFeatureByKey (featureKey )
64
- if err != nil {
65
- logger .Error ("Error retrieving feature" , err )
66
- return result , err
65
+ feature , e := projectConfig .GetFeatureByKey (featureKey )
66
+ if e != nil {
67
+ logger .Error ("Error retrieving feature" , e )
68
+ return result , e
67
69
}
68
70
featureDecisionContext := decision.FeatureDecisionContext {
69
71
Feature : & feature ,
@@ -72,14 +74,14 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
72
74
73
75
userID := userContext .ID
74
76
logger .Debug (fmt .Sprintf (`Evaluating feature "%s" for user "%s".` , featureKey , userID ))
75
- featureDecision , err := o .decisionService .GetFeatureDecision (featureDecisionContext , userContext )
77
+ featureDecision , e1 := o .decisionService .GetFeatureDecision (featureDecisionContext , userContext )
76
78
77
- if err != nil {
78
- logger .Error ("Received an error while computing feature decision" , err )
79
- return result , err
79
+ if e1 != nil {
80
+ logger .Error ("received an error while computing feature decision" , e1 )
81
+ return result , e1
80
82
}
81
83
82
- result = ( featureDecision .Variation .FeatureEnabled == true )
84
+ result = featureDecision .Variation .FeatureEnabled
83
85
if result {
84
86
logger .Info (fmt .Sprintf (`Feature "%s" is enabled for user "%s".` , featureKey , userID ))
85
87
} else {
@@ -99,7 +101,7 @@ func (o *OptimizelyClient) GetEnabledFeatures(userContext entities.UserContext)
99
101
100
102
defer func () {
101
103
if r := recover (); r != nil {
102
- 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 ()))
103
105
err = errors .New (errorMessage )
104
106
logger .Error (errorMessage , err )
105
107
}
@@ -125,15 +127,15 @@ func (o *OptimizelyClient) GetEnabledFeatures(userContext entities.UserContext)
125
127
// Track take and event key with event tags and if the event is part of the config, send to events backend.
126
128
func (o * OptimizelyClient ) Track (eventKey string , userContext entities.UserContext , eventTags map [string ]interface {}) (err error ) {
127
129
if ! o .isValid {
128
- errorMessage := "Optimizely instance is not valid. Failing GetEnabledFeatures. "
130
+ errorMessage := "optimizely instance is not valid; failing GetEnabledFeatures"
129
131
err = errors .New (errorMessage )
130
132
logger .Error (errorMessage , err )
131
133
return err
132
134
}
133
135
134
136
defer func () {
135
137
if r := recover (); r != nil {
136
- 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 ()))
137
139
err = errors .New (errorMessage )
138
140
logger .Error (errorMessage , err )
139
141
}
@@ -145,7 +147,7 @@ func (o *OptimizelyClient) Track(eventKey string, userContext entities.UserConte
145
147
userEvent := event .CreateConversionUserEvent (o .configManager .GetConfig (), configEvent , userContext , eventTags )
146
148
o .eventProcessor .ProcessEvent (userEvent )
147
149
} else {
148
- 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 )
149
151
logger .Error (errorMessage , eventError )
150
152
return eventError
151
153
}
@@ -154,82 +156,83 @@ func (o *OptimizelyClient) Track(eventKey string, userContext entities.UserConte
154
156
}
155
157
156
158
// GetFeatureVariableBoolean returns boolean feature variable value
157
- func (o * OptimizelyClient ) GetFeatureVariableBoolean (featureKey string , variableKey string , userContext entities.UserContext ) (value bool , err error ) {
159
+ func (o * OptimizelyClient ) GetFeatureVariableBoolean (featureKey , variableKey string , userContext entities.UserContext ) (value bool , err error ) {
158
160
val , valueType , err := o .getFeatureVariable (featureKey , variableKey , userContext )
159
161
if err != nil {
160
162
return false , err
161
163
}
162
164
convertedValue , err := strconv .ParseBool (val )
163
165
if err != nil || valueType != entities .Boolean {
164
- return false , fmt .Errorf ("Variable value for key %s is invalid or wrong type" , variableKey )
166
+ return false , fmt .Errorf ("variable value for key %s is invalid or wrong type" , variableKey )
165
167
}
166
168
return convertedValue , err
167
169
}
168
170
169
171
// GetFeatureVariableDouble returns double feature variable value
170
- func (o * OptimizelyClient ) GetFeatureVariableDouble (featureKey string , variableKey string , userContext entities.UserContext ) (value float64 , err error ) {
172
+ func (o * OptimizelyClient ) GetFeatureVariableDouble (featureKey , variableKey string , userContext entities.UserContext ) (value float64 , err error ) {
171
173
val , valueType , err := o .getFeatureVariable (featureKey , variableKey , userContext )
172
174
if err != nil {
173
175
return 0 , err
174
176
}
175
177
convertedValue , err := strconv .ParseFloat (val , 64 )
176
178
if err != nil || valueType != entities .Double {
177
- return 0 , fmt .Errorf ("Variable value for key %s is invalid or wrong type" , variableKey )
179
+ return 0 , fmt .Errorf ("variable value for key %s is invalid or wrong type" , variableKey )
178
180
}
179
181
return convertedValue , err
180
182
}
181
183
182
184
// GetFeatureVariableInteger returns integer feature variable value
183
- func (o * OptimizelyClient ) GetFeatureVariableInteger (featureKey string , variableKey string , userContext entities.UserContext ) (value int , err error ) {
185
+ func (o * OptimizelyClient ) GetFeatureVariableInteger (featureKey , variableKey string , userContext entities.UserContext ) (value int , err error ) {
184
186
val , valueType , err := o .getFeatureVariable (featureKey , variableKey , userContext )
185
187
if err != nil {
186
188
return 0 , err
187
189
}
188
190
convertedValue , err := strconv .Atoi (val )
189
191
if err != nil || valueType != entities .Integer {
190
- return 0 , fmt .Errorf ("Variable value for key %s is invalid or wrong type" , variableKey )
192
+ return 0 , fmt .Errorf ("variable value for key %s is invalid or wrong type" , variableKey )
191
193
}
192
194
return convertedValue , err
193
195
}
194
196
195
197
// GetFeatureVariableString returns string feature variable value
196
- 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 ) {
197
199
value , valueType , err := o .getFeatureVariable (featureKey , variableKey , userContext )
198
200
if err != nil {
199
201
return "" , err
200
202
}
201
203
if valueType != entities .String {
202
- return "" , fmt .Errorf ("Variable value for key %s is wrong type" , variableKey )
204
+ return "" , fmt .Errorf ("variable value for key %s is wrong type" , variableKey )
203
205
}
204
206
return value , err
205
207
}
206
208
207
- func (o * OptimizelyClient ) getFeatureVariable (featureKey string , variableKey string , userContext entities.UserContext ) (value string , valueType entities.VariableType , err error ) {
209
+ func (o * OptimizelyClient ) getFeatureVariable (featureKey , variableKey string , userContext entities.UserContext ) (value string , valueType entities.VariableType , err error ) {
208
210
209
211
defer func () {
210
212
if r := recover (); r != nil {
211
- 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 ()))
212
214
err = errors .New (errorMessage )
213
215
logger .Error (errorMessage , err )
214
216
}
215
217
}()
216
218
217
- if isValid , err := o .isValidClient ("getFeatureVariable" ); ! isValid {
219
+ var isValid bool
220
+ if isValid , err = o .isValidClient ("getFeatureVariable" ); ! isValid {
218
221
return "" , "" , err
219
222
}
220
223
221
224
projectConfig := o .configManager .GetConfig ()
222
225
223
- feature , err := projectConfig .GetFeatureByKey (featureKey )
224
- if err != nil {
225
- logger .Error ("Error retrieving feature" , err )
226
- return "" , "" , err
226
+ feature , e := projectConfig .GetFeatureByKey (featureKey )
227
+ if e != nil {
228
+ logger .Error ("error retrieving feature" , e )
229
+ return "" , "" , e
227
230
}
228
231
229
- variable , err := projectConfig .GetVariableByKey (featureKey , variableKey )
230
- if err != nil {
231
- logger .Error ("Error retrieving variable" , err )
232
- return "" , "" , err
232
+ variable , e1 := projectConfig .GetVariableByKey (featureKey , variableKey )
233
+ if e1 != nil {
234
+ logger .Error ("error retrieving variable" , e1 )
235
+ return "" , "" , e1
233
236
}
234
237
235
238
var featureValue = variable .DefaultValue
@@ -239,8 +242,8 @@ func (o *OptimizelyClient) getFeatureVariable(featureKey string, variableKey str
239
242
ProjectConfig : projectConfig ,
240
243
}
241
244
242
- featureDecision , err := o .decisionService .GetFeatureDecision (featureDecisionContext , userContext )
243
- if err == nil {
245
+ featureDecision , e2 := o .decisionService .GetFeatureDecision (featureDecisionContext , userContext )
246
+ if e2 == nil {
244
247
if v , ok := featureDecision .Variation .Variables [variable .ID ]; ok && featureDecision .Variation .FeatureEnabled {
245
248
featureValue = v .Value
246
249
}
@@ -252,7 +255,7 @@ func (o *OptimizelyClient) getFeatureVariable(featureKey string, variableKey str
252
255
253
256
func (o * OptimizelyClient ) isValidClient (methodName string ) (result bool , err error ) {
254
257
if ! o .isValid {
255
- errorMessage := fmt .Sprintf ("Optimizely instance is not valid. Failing %s." , methodName )
258
+ errorMessage := fmt .Sprintf ("optimizely instance is not valid. Failing %s." , methodName )
256
259
err := errors .New (errorMessage )
257
260
logger .Error (errorMessage , nil )
258
261
return false , err
0 commit comments