Skip to content

Commit dd17f1c

Browse files
committed
Updated treatments functions
1 parent a70de54 commit dd17f1c

File tree

2 files changed

+62
-113
lines changed

2 files changed

+62
-113
lines changed

splitio/client/client.go

Lines changed: 55 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,14 @@ import (
2323
)
2424

2525
const (
26-
treatment = "Treatment"
27-
treatments = "Treatments"
28-
treatmentsByFlagSet = "TreatmentsByFlagSet"
29-
treatmentsByFlagSets = "TreatmentsByFlagSets"
30-
treatmentWithConfig = "TreatmentWithConfig"
31-
treatmentsWithConfig = "TreatmentsWithConfig"
32-
treatmentsWithConfigByFlagSet = "TreatmentsWithConfigByFlagSet"
33-
treatmentsWithConfigByFlagSets = "TreatmentsWithConfigByFlagSets"
34-
treatmentWithEvaluationOptions = "TreatmentWithEvaluationOptions"
35-
treatmentsWithEvaluationOptions = "TreatmentsWithEvaluationOptions"
36-
treatmentsByFlagSetWithEvaluationOptions = "TreatmentsByFlagSetWithEvaluationOptions"
37-
treatmentsByFlagSetsWithEvaluationOptions = "TreatmentsByFlagSetsWithEvaluationOptions"
38-
treatmentWithConfigAndEvaluationOptions = "TreatmentWithConfigWithEvaluationOptions"
39-
treatmentsWithConfigAndEvaluationOptions = "TreatmentsWithConfigWithEvaluationOptions"
40-
treatmentsWithConfigByFlagSetAndEvaluationOptions = "TreatmentsWithConfigByFlagSetWithEvaluationOptions"
41-
treatmentsWithConfigByFlagSetsAndEvaluationOptions = "TreatmentsWithConfigByFlagSetsWithEvaluationOptions"
26+
treatment = "Treatment"
27+
treatments = "Treatments"
28+
treatmentsByFlagSet = "TreatmentsByFlagSet"
29+
treatmentsByFlagSets = "TreatmentsByFlagSets"
30+
treatmentWithConfig = "TreatmentWithConfig"
31+
treatmentsWithConfig = "TreatmentsWithConfig"
32+
treatmentsWithConfigByFlagSet = "TreatmentsWithConfigByFlagSet"
33+
treatmentsWithConfigByFlagSets = "TreatmentsWithConfigByFlagSets"
4234
)
4335

4436
// SplitClient is the entry-point of the split SDK.
@@ -63,6 +55,22 @@ type TreatmentResult struct {
6355
Config *string `json:"config"`
6456
}
6557

58+
type options struct {
59+
evaluationOptions *dtos.EvaluationOptions
60+
}
61+
62+
type OptFn = func(o *options)
63+
64+
func (c *SplitClient) WithEvaluationOptions(e *dtos.EvaluationOptions) OptFn {
65+
return func(o *options) { o.evaluationOptions = e }
66+
}
67+
68+
func defaultOpts() options {
69+
return options{
70+
evaluationOptions: nil,
71+
}
72+
}
73+
6674
// getEvaluationResult calls evaluation for one particular feature flag
6775
func (c *SplitClient) getEvaluationResult(matchingKey string, bucketingKey *string, featureFlag string, attributes map[string]interface{}, operation string) *evaluator.Result {
6876
if c.isReady() {
@@ -224,26 +232,24 @@ func serializeProperties(opts *dtos.EvaluationOptions) string {
224232

225233
// Treatment implements the main functionality of split. Retrieve treatments of a specific feature flag
226234
// for a certain key and set of attributes
227-
func (c *SplitClient) Treatment(key interface{}, featureFlagName string, attributes map[string]interface{}) string {
228-
return c.doTreatmentCall(key, featureFlagName, attributes, treatment, telemetry.Treatment, nil).Treatment
235+
func (c *SplitClient) Treatment(key interface{}, featureFlagName string, attributes map[string]interface{}, optFns ...OptFn) string {
236+
options := getOptions(optFns...)
237+
return c.doTreatmentCall(key, featureFlagName, attributes, treatment, telemetry.Treatment, options.evaluationOptions).Treatment
229238
}
230239

231-
// TreatmentWithConfig implements the main functionality of split. Retrieves the treatment of a specific feature flag
232-
// with the corresponding configuration if it is present
233-
func (c *SplitClient) TreatmentWithConfig(key interface{}, featureFlagName string, attributes map[string]interface{}) TreatmentResult {
234-
return c.doTreatmentCall(key, featureFlagName, attributes, treatmentWithConfig, telemetry.TreatmentWithConfig, nil)
235-
}
236-
237-
// TreatmentWithEvaluationOptions implements the main functionality of split. Retrieve treatments of a specific feature flag
238-
// for a certain key and set of attributes
239-
func (c *SplitClient) TreatmentWithEvaluationOptions(key interface{}, featureFlagName string, attributes map[string]interface{}, evaluationOptions dtos.EvaluationOptions) string {
240-
return c.doTreatmentCall(key, featureFlagName, attributes, treatmentWithEvaluationOptions, telemetry.TreatmentWithEvaluationOptions, &evaluationOptions).Treatment
240+
func getOptions(optFns ...OptFn) options {
241+
options := defaultOpts()
242+
for _, optFn := range optFns {
243+
optFn(&options)
244+
}
245+
return options
241246
}
242247

243-
// TreatmentWithConfigAndEvaluationOptions implements the main functionality of split. Retrieves the treatment of a specific feature flag
248+
// TreatmentWithConfig implements the main functionality of split. Retrieves the treatment of a specific feature flag
244249
// with the corresponding configuration if it is present
245-
func (c *SplitClient) TreatmentWithConfigAndEvaluationOptions(key interface{}, featureFlagName string, attributes map[string]interface{}, evaluationOptions dtos.EvaluationOptions) TreatmentResult {
246-
return c.doTreatmentCall(key, featureFlagName, attributes, treatmentWithConfigAndEvaluationOptions, telemetry.TreatmentWithConfigAndEvaluationOptions, &evaluationOptions)
250+
func (c *SplitClient) TreatmentWithConfig(key interface{}, featureFlagName string, attributes map[string]interface{}, optFns ...OptFn) TreatmentResult {
251+
options := getOptions(optFns...)
252+
return c.doTreatmentCall(key, featureFlagName, attributes, treatmentWithConfig, telemetry.TreatmentWithConfig, options.evaluationOptions)
247253
}
248254

249255
// Generates control treatments
@@ -357,19 +363,10 @@ func (c *SplitClient) doTreatmentsCallByFlagSets(key interface{}, flagSets []str
357363
}
358364

359365
// Treatments evaluates multiple feature flag names for a single user and set of attributes at once
360-
func (c *SplitClient) Treatments(key interface{}, featureFlagNames []string, attributes map[string]interface{}) map[string]string {
366+
func (c *SplitClient) Treatments(key interface{}, featureFlagNames []string, attributes map[string]interface{}, optFns ...OptFn) map[string]string {
367+
options := getOptions(optFns...)
361368
treatmentsResult := map[string]string{}
362-
result := c.doTreatmentsCall(key, featureFlagNames, attributes, treatments, telemetry.Treatments, nil)
363-
for feature, treatmentResult := range result {
364-
treatmentsResult[feature] = treatmentResult.Treatment
365-
}
366-
return treatmentsResult
367-
}
368-
369-
// TreatmentsWithEvaluationOptions evaluates multiple feature flag names for a single user and set of attributes at once
370-
func (c *SplitClient) TreatmentsWithEvaluationOptions(key interface{}, featureFlagNames []string, attributes map[string]interface{}, evaluationOptions dtos.EvaluationOptions) map[string]string {
371-
treatmentsResult := map[string]string{}
372-
result := c.doTreatmentsCall(key, featureFlagNames, attributes, treatmentsWithEvaluationOptions, telemetry.TreatmentsWithEvaluationOptions, &evaluationOptions)
369+
result := c.doTreatmentsCall(key, featureFlagNames, attributes, treatments, telemetry.Treatments, options.evaluationOptions)
373370
for feature, treatmentResult := range result {
374371
treatmentsResult[feature] = treatmentResult.Treatment
375372
}
@@ -397,55 +394,29 @@ func (c *SplitClient) validateSets(flagSets []string) []string {
397394
}
398395

399396
// Treatments evaluate multiple feature flag names belonging to a flag set for a single user and a set of attributes at once
400-
func (c *SplitClient) TreatmentsByFlagSet(key interface{}, flagSet string, attributes map[string]interface{}) map[string]string {
397+
func (c *SplitClient) TreatmentsByFlagSet(key interface{}, flagSet string, attributes map[string]interface{}, optFns ...OptFn) map[string]string {
398+
options := getOptions(optFns...)
401399
treatmentsResult := map[string]string{}
402400
sets := c.validateSets([]string{flagSet})
403401
if sets == nil {
404402
return treatmentsResult
405403
}
406-
result := c.doTreatmentsCallByFlagSets(key, sets, attributes, treatmentsByFlagSet, telemetry.TreatmentsByFlagSet, nil)
404+
result := c.doTreatmentsCallByFlagSets(key, sets, attributes, treatmentsByFlagSet, telemetry.TreatmentsByFlagSet, options.evaluationOptions)
407405
for feature, treatmentResult := range result {
408406
treatmentsResult[feature] = treatmentResult.Treatment
409407
}
410408
return treatmentsResult
411409
}
412410

413411
// Treatments evaluate multiple feature flag names belonging to flag sets for a single user and a set of attributes at once
414-
func (c *SplitClient) TreatmentsByFlagSets(key interface{}, flagSets []string, attributes map[string]interface{}) map[string]string {
415-
treatmentsResult := map[string]string{}
416-
flagSets = c.validateSets(flagSets)
417-
if flagSets == nil {
418-
return treatmentsResult
419-
}
420-
result := c.doTreatmentsCallByFlagSets(key, flagSets, attributes, treatmentsByFlagSets, telemetry.TreatmentsByFlagSets, nil)
421-
for feature, treatmentResult := range result {
422-
treatmentsResult[feature] = treatmentResult.Treatment
423-
}
424-
return treatmentsResult
425-
}
426-
427-
// TreatmentsByFlagSetWithEvaluationOptions evaluate multiple feature flag names belonging to a flag set for a single user and a set of attributes at once
428-
func (c *SplitClient) TreatmentsByFlagSetWithEvaluationOptions(key interface{}, flagSet string, attributes map[string]interface{}, evaluationOptions dtos.EvaluationOptions) map[string]string {
429-
treatmentsResult := map[string]string{}
430-
sets := c.validateSets([]string{flagSet})
431-
if sets == nil {
432-
return treatmentsResult
433-
}
434-
result := c.doTreatmentsCallByFlagSets(key, sets, attributes, treatmentsByFlagSetWithEvaluationOptions, telemetry.TreatmentsByFlagSetWithEvaluationOptions, &evaluationOptions)
435-
for feature, treatmentResult := range result {
436-
treatmentsResult[feature] = treatmentResult.Treatment
437-
}
438-
return treatmentsResult
439-
}
440-
441-
// TreatmentsByFlagSetsWithEvaluationOptions evaluate multiple feature flag names belonging to flag sets for a single user and a set of attributes at once
442-
func (c *SplitClient) TreatmentsByFlagSetsWithEvaluationOptions(key interface{}, flagSets []string, attributes map[string]interface{}, evaluationOptions dtos.EvaluationOptions) map[string]string {
412+
func (c *SplitClient) TreatmentsByFlagSets(key interface{}, flagSets []string, attributes map[string]interface{}, optFns ...OptFn) map[string]string {
413+
options := getOptions(optFns...)
443414
treatmentsResult := map[string]string{}
444415
flagSets = c.validateSets(flagSets)
445416
if flagSets == nil {
446417
return treatmentsResult
447418
}
448-
result := c.doTreatmentsCallByFlagSets(key, flagSets, attributes, treatmentsByFlagSetsWithEvaluationOptions, telemetry.TreatmentsByFlagSetsWithEvaluationOptions, &evaluationOptions)
419+
result := c.doTreatmentsCallByFlagSets(key, flagSets, attributes, treatmentsByFlagSets, telemetry.TreatmentsByFlagSets, options.evaluationOptions)
449420
for feature, treatmentResult := range result {
450421
treatmentsResult[feature] = treatmentResult.Treatment
451422
}
@@ -465,53 +436,31 @@ func (c *SplitClient) filterSetsAreInConfig(flagSets []string) []string {
465436
}
466437

467438
// TreatmentsWithConfig evaluates multiple feature flag names for a single user and set of attributes at once and returns configurations
468-
func (c *SplitClient) TreatmentsWithConfig(key interface{}, featureFlagNames []string, attributes map[string]interface{}) map[string]TreatmentResult {
469-
return c.doTreatmentsCall(key, featureFlagNames, attributes, treatmentsWithConfig, telemetry.TreatmentsWithConfig, nil)
470-
}
471-
472-
// TreatmentsWithConfigAndEvaluationOptions evaluates multiple feature flag names for a single user and set of attributes at once and returns configurations
473-
func (c *SplitClient) TreatmentsWithConfigAndEvaluationOptions(key interface{}, featureFlagNames []string, attributes map[string]interface{}, evaluationOptions dtos.EvaluationOptions) map[string]TreatmentResult {
474-
return c.doTreatmentsCall(key, featureFlagNames, attributes, treatmentsWithConfigAndEvaluationOptions, telemetry.TreatmentsWithConfigByFlagSetAndEvaluationOptions, &evaluationOptions)
439+
func (c *SplitClient) TreatmentsWithConfig(key interface{}, featureFlagNames []string, attributes map[string]interface{}, optFns ...OptFn) map[string]TreatmentResult {
440+
options := getOptions(optFns...)
441+
return c.doTreatmentsCall(key, featureFlagNames, attributes, treatmentsWithConfig, telemetry.TreatmentsWithConfig, options.evaluationOptions)
475442
}
476443

477444
// TreatmentsWithConfigByFlagSet evaluates multiple feature flag names belonging to a flag set for a single user and set of attributes at once and returns configurations
478-
func (c *SplitClient) TreatmentsWithConfigByFlagSet(key interface{}, flagSet string, attributes map[string]interface{}) map[string]TreatmentResult {
479-
treatmentsResult := make(map[string]TreatmentResult)
480-
sets := c.validateSets([]string{flagSet})
481-
if sets == nil {
482-
return treatmentsResult
483-
}
484-
return c.doTreatmentsCallByFlagSets(key, sets, attributes, treatmentsWithConfigByFlagSet, telemetry.TreatmentsWithConfigByFlagSet, nil)
485-
}
486-
487-
// TreatmentsWithConfigByFlagSetAndEvaluationOptions evaluates multiple feature flag names belonging to a flag set for a single user and set of attributes at once and returns configurations
488-
func (c *SplitClient) TreatmentsWithConfigByFlagSetAndEvaluationOptions(key interface{}, flagSet string, attributes map[string]interface{}, evaluationOptions dtos.EvaluationOptions) map[string]TreatmentResult {
445+
func (c *SplitClient) TreatmentsWithConfigByFlagSet(key interface{}, flagSet string, attributes map[string]interface{}, optFns ...OptFn) map[string]TreatmentResult {
446+
options := getOptions(optFns...)
489447
treatmentsResult := make(map[string]TreatmentResult)
490448
sets := c.validateSets([]string{flagSet})
491449
if sets == nil {
492450
return treatmentsResult
493451
}
494-
return c.doTreatmentsCallByFlagSets(key, sets, attributes, treatmentsWithConfigByFlagSetAndEvaluationOptions, telemetry.TreatmentsWithConfigByFlagSetAndEvaluationOptions, &evaluationOptions)
452+
return c.doTreatmentsCallByFlagSets(key, sets, attributes, treatmentsWithConfigByFlagSet, telemetry.TreatmentsWithConfigByFlagSet, options.evaluationOptions)
495453
}
496454

497455
// TreatmentsWithConfigByFlagSet evaluates multiple feature flag names belonging to a flag sets for a single user and set of attributes at once and returns configurations
498-
func (c *SplitClient) TreatmentsWithConfigByFlagSets(key interface{}, flagSets []string, attributes map[string]interface{}) map[string]TreatmentResult {
499-
treatmentsResult := make(map[string]TreatmentResult)
500-
flagSets = c.validateSets(flagSets)
501-
if flagSets == nil {
502-
return treatmentsResult
503-
}
504-
return c.doTreatmentsCallByFlagSets(key, flagSets, attributes, treatmentsWithConfigByFlagSets, telemetry.TreatmentsWithConfigByFlagSets, nil)
505-
}
506-
507-
// TreatmentsWithConfigByFlagSetsAndEvaluationOptions evaluates multiple feature flag names belonging to a flag sets for a single user and set of attributes at once and returns configurations
508-
func (c *SplitClient) TreatmentsWithConfigByFlagSetsAndEvaluationOptions(key interface{}, flagSets []string, attributes map[string]interface{}, evaluationOptions dtos.EvaluationOptions) map[string]TreatmentResult {
456+
func (c *SplitClient) TreatmentsWithConfigByFlagSets(key interface{}, flagSets []string, attributes map[string]interface{}, optFns ...OptFn) map[string]TreatmentResult {
457+
options := getOptions(optFns...)
509458
treatmentsResult := make(map[string]TreatmentResult)
510459
flagSets = c.validateSets(flagSets)
511460
if flagSets == nil {
512461
return treatmentsResult
513462
}
514-
return c.doTreatmentsCallByFlagSets(key, flagSets, attributes, treatmentsWithConfigByFlagSetsAndEvaluationOptions, telemetry.TreatmentsWithConfigByFlagSetsAndEvaluationOptions, &evaluationOptions)
463+
return c.doTreatmentsCallByFlagSets(key, flagSets, attributes, treatmentsWithConfigByFlagSets, telemetry.TreatmentsWithConfigByFlagSets, options.evaluationOptions)
515464
}
516465

517466
// isDestroyed returns true if the client has been destroyed

splitio/client/client_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ func TestClientGetTreatmentWithEvaluationProperties(t *testing.T) {
243243
"balance": 99.5,
244244
},
245245
}
246-
expectedTreatment(client.TreatmentWithEvaluationOptions("key", "feature", nil, opts), "TreatmentA", t)
246+
expectedTreatment(client.Treatment("key", "feature", nil, client.WithEvaluationOptions(&opts)), "TreatmentA", t)
247247
impressionsQueue := client.impressions.(storage.ImpressionStorage)
248248
impressions, _ := impressionsQueue.PopN(5000)
249249
impression := impressions[0]
@@ -311,7 +311,7 @@ func TestClientGetTreatmentByFlagSetWithEvaluationProperties(t *testing.T) {
311311
},
312312
}
313313

314-
res := client.TreatmentsByFlagSetWithEvaluationOptions("user1", "set1", nil, opts)
314+
res := client.TreatmentsByFlagSet("user1", "set1", nil, client.WithEvaluationOptions(&opts))
315315

316316
expectedTreatment(res["feature"], "TreatmentA", t)
317317
impressionsQueue := client.impressions.(storage.ImpressionStorage)
@@ -387,7 +387,7 @@ func TestClientGetTreatmentByFlagSetsWithEvaluationProperties(t *testing.T) {
387387
},
388388
}
389389

390-
res := client.TreatmentsByFlagSetsWithEvaluationOptions("user1", []string{"set1", "set2"}, nil, opts)
390+
res := client.TreatmentsByFlagSets("user1", []string{"set1", "set2"}, nil, client.WithEvaluationOptions(&opts))
391391

392392
expectedTreatment(res["feature"], "TreatmentA", t)
393393
expectedTreatment(res["feature2"], "TreatmentB", t)
@@ -451,7 +451,7 @@ func TestClientGetTreatmentWithConfigByFlagSetAndEvaluationProperties(t *testing
451451
},
452452
}
453453

454-
res := client.TreatmentsWithConfigByFlagSetAndEvaluationOptions("user1", "set1", nil, opts)
454+
res := client.TreatmentsWithConfigByFlagSet("user1", "set1", nil, client.WithEvaluationOptions(&opts))
455455

456456
expectedTreatment(res["feature"].Treatment, "TreatmentA", t)
457457
impressionsQueue := client.impressions.(storage.ImpressionStorage)
@@ -526,7 +526,7 @@ func TestClientGetTreatmentWithConfigByFlagSetsAndEvaluationOptions(t *testing.T
526526
},
527527
}
528528

529-
res := client.TreatmentsWithConfigByFlagSetsAndEvaluationOptions("user1", []string{"set1", "set2"}, nil, opts)
529+
res := client.TreatmentsWithConfigByFlagSets("user1", []string{"set1", "set2"}, nil, client.WithEvaluationOptions(&opts))
530530

531531
expectedTreatment(res["feature"].Treatment, "TreatmentA", t)
532532
expectedTreatment(res["feature2"].Treatment, "TreatmentB", t)
@@ -567,7 +567,7 @@ func TestTreatmentsWithEvaluationOptions(t *testing.T) {
567567
},
568568
}
569569

570-
res := client.TreatmentsWithEvaluationOptions("user1", []string{"feature", "notFeature"}, nil, opts)
570+
res := client.Treatments("user1", []string{"feature", "notFeature"}, nil, client.WithEvaluationOptions(&opts))
571571

572572
expectedTreatment(res["feature"], "TreatmentA", t)
573573
expectedTreatment(res["notFeature"], evaluator.Control, t)
@@ -941,7 +941,7 @@ func TestImpressionListenerForTreatmentsWithEvaluationOptions(t *testing.T) {
941941
},
942942
}
943943

944-
res := client.TreatmentsWithEvaluationOptions("user1", []string{"feature", "feature2"}, attributes, opts)
944+
res := client.Treatments("user1", []string{"feature", "feature2"}, attributes, client.WithEvaluationOptions(&opts))
945945

946946
expectedTreatment(res["feature"], "TreatmentA", t)
947947
expectedTreatment(res["feature2"], "TreatmentB", t)

0 commit comments

Comments
 (0)