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 (
@@ -22,6 +23,7 @@ import (
22
23
"fmt"
23
24
"reflect"
24
25
"runtime/debug"
26
+ "strconv"
25
27
26
28
"github.com/optimizely/go-sdk/optimizely/event"
27
29
@@ -36,7 +38,7 @@ var logger = logging.GetLogger("Client")
36
38
// OptimizelyClient is the entry point to the Optimizely SDK
37
39
type OptimizelyClient struct {
38
40
configManager optimizely.ProjectConfigManager
39
- decisionService decision.DecisionService
41
+ decisionService decision.Service
40
42
eventProcessor event.Processor
41
43
isValid bool
42
44
@@ -54,15 +56,16 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
54
56
}
55
57
}()
56
58
57
- if isValid , err := o .isValidClient ("IsFeatureEnabled" ); ! isValid {
59
+ var isValid bool
60
+ if isValid , err = o .isValidClient ("IsFeatureEnabled" ); ! isValid {
58
61
return false , err
59
62
}
60
63
61
64
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
66
69
}
67
70
featureDecisionContext := decision.FeatureDecisionContext {
68
71
Feature : & feature ,
@@ -71,14 +74,14 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
71
74
72
75
userID := userContext .ID
73
76
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 )
75
78
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
79
82
}
80
83
81
- result = ( featureDecision .Variation .FeatureEnabled == true )
84
+ result = featureDecision .Variation .FeatureEnabled
82
85
if result {
83
86
logger .Info (fmt .Sprintf (`Feature "%s" is enabled for user "%s".` , featureKey , userID ))
84
87
} else {
@@ -98,7 +101,7 @@ func (o *OptimizelyClient) GetEnabledFeatures(userContext entities.UserContext)
98
101
99
102
defer func () {
100
103
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 ()))
102
105
err = errors .New (errorMessage )
103
106
logger .Error (errorMessage , err )
104
107
}
@@ -124,15 +127,15 @@ func (o *OptimizelyClient) GetEnabledFeatures(userContext entities.UserContext)
124
127
// Track take and event key with event tags and if the event is part of the config, send to events backend.
125
128
func (o * OptimizelyClient ) Track (eventKey string , userContext entities.UserContext , eventTags map [string ]interface {}) (err error ) {
126
129
if ! o .isValid {
127
- errorMessage := "Optimizely instance is not valid. Failing GetEnabledFeatures. "
130
+ errorMessage := "optimizely instance is not valid; failing GetEnabledFeatures"
128
131
err = errors .New (errorMessage )
129
132
logger .Error (errorMessage , err )
130
133
return err
131
134
}
132
135
133
136
defer func () {
134
137
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 ()))
136
139
err = errors .New (errorMessage )
137
140
logger .Error (errorMessage , err )
138
141
}
@@ -144,52 +147,92 @@ func (o *OptimizelyClient) Track(eventKey string, userContext entities.UserConte
144
147
userEvent := event .CreateConversionUserEvent (o .configManager .GetConfig (), configEvent , userContext , eventTags )
145
148
o .eventProcessor .ProcessEvent (userEvent )
146
149
} 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 )
148
151
logger .Error (errorMessage , eventError )
149
152
return eventError
150
153
}
151
154
152
155
return nil
153
156
}
154
157
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
+
155
197
// 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 ) {
157
199
value , valueType , err := o .getFeatureVariable (featureKey , variableKey , userContext )
158
200
if err != nil {
159
201
return "" , err
160
202
}
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 )
163
205
}
164
206
return value , err
165
207
}
166
208
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 ) {
168
210
169
211
defer func () {
170
212
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 ()))
172
214
err = errors .New (errorMessage )
173
215
logger .Error (errorMessage , err )
174
216
}
175
217
}()
176
218
177
- if isValid , err := o .isValidClient ("getFeatureVariable" ); ! isValid {
219
+ var isValid bool
220
+ if isValid , err = o .isValidClient ("getFeatureVariable" ); ! isValid {
178
221
return "" , "" , err
179
222
}
180
223
181
224
projectConfig := o .configManager .GetConfig ()
182
225
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
187
230
}
188
231
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
193
236
}
194
237
195
238
var featureValue = variable .DefaultValue
@@ -199,8 +242,8 @@ func (o *OptimizelyClient) getFeatureVariable(featureKey string, variableKey str
199
242
ProjectConfig : projectConfig ,
200
243
}
201
244
202
- featureDecision , err := o .decisionService .GetFeatureDecision (featureDecisionContext , userContext )
203
- if err == nil {
245
+ featureDecision , e2 := o .decisionService .GetFeatureDecision (featureDecisionContext , userContext )
246
+ if e2 == nil {
204
247
if v , ok := featureDecision .Variation .Variables [variable .ID ]; ok && featureDecision .Variation .FeatureEnabled {
205
248
featureValue = v .Value
206
249
}
@@ -212,7 +255,7 @@ func (o *OptimizelyClient) getFeatureVariable(featureKey string, variableKey str
212
255
213
256
func (o * OptimizelyClient ) isValidClient (methodName string ) (result bool , err error ) {
214
257
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 )
216
259
err := errors .New (errorMessage )
217
260
logger .Error (errorMessage , nil )
218
261
return false , err
0 commit comments