1 package growthbook
2
3
4 type FeatureRule struct {
5 ID string
6 Condition Condition
7 Force FeatureValue
8 Variations []FeatureValue
9 Weights []float64
10 Key string
11 HashAttribute string
12 HashVersion int
13 Range *Range
14 Coverage *float64
15 Namespace *Namespace
16 Ranges []Range
17 Meta []VariationMeta
18 Filters []Filter
19 Seed string
20 Name string
21 Phase string
22 }
23
24
25
26 func BuildFeatureRule(val interface{}) *FeatureRule {
27 rule := FeatureRule{}
28 dict, ok := val.(map[string]interface{})
29 if !ok {
30 logError("Invalid JSON data type", "FeatureRule")
31 return nil
32 }
33 for k, v := range dict {
34 switch k {
35 case "id":
36 id, ok := jsonString(v, "FeatureRule", "id")
37 if !ok {
38 return nil
39 }
40 rule.ID = id
41 case "condition":
42 condmap, ok := v.(map[string]interface{})
43 if !ok {
44 logError("Invalid JSON data type", "FeatureRule", "condition")
45 return nil
46 }
47 condition := BuildCondition(condmap)
48 if condition == nil {
49 return nil
50 }
51 rule.Condition = condition
52 case "force":
53 rule.Force = v
54 case "variations":
55 variations := BuildFeatureValues(v)
56 if variations == nil {
57 return nil
58 }
59 rule.Variations = variations
60 case "weights":
61 weights, ok := jsonFloatArray(v, "FeatureRule", "weights")
62 if !ok {
63 return nil
64 }
65 rule.Weights = weights
66 case "key":
67 key, ok := jsonString(v, "FeatureRule", "key")
68 if !ok {
69 return nil
70 }
71 rule.Key = key
72 case "hashAttribute":
73 hashAttribute, ok := jsonString(v, "FeatureRule", "hashAttribute")
74 if !ok {
75 return nil
76 }
77 rule.HashAttribute = hashAttribute
78 case "hashVersion":
79 hashVersion, ok := jsonInt(v, "FeatureRule", "hashVersion")
80 if !ok {
81 return nil
82 }
83 rule.HashVersion = hashVersion
84 case "range":
85 rng, ok := jsonRange(v, "FeatureRule", "range")
86 if !ok {
87 return nil
88 }
89 rule.Range = rng
90 case "coverage":
91 coverage, ok := jsonMaybeFloat(v, "FeatureRule", "coverage")
92 if !ok {
93 return nil
94 }
95 rule.Coverage = coverage
96 case "namespace":
97 namespace := BuildNamespace(v)
98 if namespace == nil {
99 return nil
100 }
101 rule.Namespace = namespace
102 case "ranges":
103 ranges, ok := jsonRangeArray(v, "FeatureRule", "ranges")
104 if !ok {
105 return nil
106 }
107 rule.Ranges = ranges
108 case "meta":
109 meta, ok := jsonVariationMetaArray(v, "Experiment", "meta")
110 if !ok {
111 return nil
112 }
113 rule.Meta = meta
114 case "filters":
115 filters, ok := jsonFilterArray(v, "Experiment", "filters")
116 if !ok {
117 return nil
118 }
119 rule.Filters = filters
120 case "seed":
121 seed, ok := jsonString(v, "FeatureRule", "seed")
122 if !ok {
123 return nil
124 }
125 rule.Seed = seed
126 case "name":
127 name, ok := jsonString(v, "FeatureRule", "name")
128 if !ok {
129 return nil
130 }
131 rule.Name = name
132 case "phase":
133 phase, ok := jsonString(v, "FeatureRule", "phase")
134 if !ok {
135 return nil
136 }
137 rule.Phase = phase
138 default:
139 logWarn("Unknown key in JSON data", "FeatureRule", k)
140 }
141 }
142 return &rule
143 }
144
View as plain text