@@ -57,53 +57,53 @@ class ParameterStore(
57
57
public val options : ParameterStoreEvaluationOptions ? ,
58
58
) {
59
59
fun getBoolean (paramName : String , fallback : Boolean ): Boolean {
60
- return getValue (paramName, fallback)
60
+ return getValueFromRef (paramName, fallback, Layer ::getBoolean, DynamicConfig ::getBoolean )
61
61
}
62
62
63
63
fun getString (paramName : String , fallback : String? ): String? {
64
- return getValue (paramName, fallback)
64
+ return getValueFromRef (paramName, fallback, Layer ::getString, DynamicConfig ::getString )
65
65
}
66
66
67
67
fun getDouble (paramName : String , fallback : Double ): Double {
68
- return getValue (paramName, fallback)
68
+ return getValueFromRef (paramName, fallback, Layer ::getDouble, DynamicConfig ::getDouble )
69
69
}
70
70
71
71
fun getDictionary (paramName : String , fallback : Map <String , Any >? ): Map <String , Any >? {
72
- return getValue (paramName, fallback)
72
+ return getValueFromRef (paramName, fallback, Layer ::getDictionary, DynamicConfig ::getDictionary )
73
73
}
74
74
75
75
fun getArray (paramName : String , fallback : Array <* >? ): Array <* >? {
76
- return getValue (paramName, fallback)
76
+ return getValueFromRef (paramName, fallback, Layer ::getArray, DynamicConfig ::getArray )
77
77
}
78
78
79
79
// --------evaluation--------
80
- private inline fun <reified T > getValue (topLevelParamName : String , fallback : T ): T {
81
- try {
82
- val param = paramStore[topLevelParamName] ? : return fallback
83
- val referenceTypeString = param[" ref_type" ] as ? String ? : return fallback
84
- val paramTypeString = param[" param_type" ] as ? String ? : return fallback
85
- val refType = RefType .fromString(referenceTypeString)
86
- val paramType = ParamType .fromString(paramTypeString)
87
80
88
- when (paramType) {
89
- ParamType .BOOLEAN -> if (fallback != null && fallback !is Boolean ) return fallback
90
- ParamType .STRING -> if (fallback != null && fallback !is String ) return fallback
91
- ParamType .NUMBER -> if (fallback != null && fallback !is Number ) return fallback
92
- ParamType .OBJECT -> if (fallback != null && fallback !is Map <* , * >) return fallback
93
- ParamType .ARRAY -> if (fallback != null && fallback !is Array <* > && fallback !is List <* >) return fallback
94
- else -> return fallback
81
+ private inline fun <reified T > getValueFromRef (
82
+ topLevelParamName : String ,
83
+ fallback : T ,
84
+ getLayerValue : Layer .(String , T ) -> T ,
85
+ getDynamicConfigValue : DynamicConfig .(String , T ) -> T ,
86
+ ): T {
87
+ val param = paramStore[topLevelParamName] ? : return fallback
88
+ val referenceTypeString = param[" ref_type" ] as ? String ? : return fallback
89
+ val paramTypeString = param[" param_type" ] as ? String ? : return fallback
90
+ val refType = RefType .fromString(referenceTypeString)
91
+ val paramType = ParamType .fromString(paramTypeString)
92
+
93
+ return when (refType) {
94
+ RefType .GATE -> evaluateFeatureGate(paramType, param, fallback)
95
+ RefType .STATIC -> evaluateStaticValue(paramType, param, fallback)
96
+ RefType .LAYER -> evaluateLayerParameter(param, fallback) { layer, paramName ->
97
+ var v = layer.getLayerValue(paramName, fallback)
98
+ return v
95
99
}
96
-
97
- return when (refType) {
98
- RefType .GATE -> evaluateFeatureGate(paramType, param, fallback)
99
- RefType .STATIC -> evaluateStaticValue(paramType, param, fallback)
100
- RefType .LAYER -> evaluateLayerParameter(paramType, param, fallback)
101
- RefType .DYNAMIC_CONFIG -> evaluateDynamicConfigParameter(paramType, param, fallback)
102
- RefType .EXPERIMENT -> evaluateExperimentParameter(paramType, param, fallback)
103
- else -> fallback
100
+ RefType .DYNAMIC_CONFIG -> evaluateDynamicConfigParameter(param, fallback) { config, paramName ->
101
+ config.getDynamicConfigValue(paramName, fallback)
104
102
}
105
- } catch (e: Exception ) {
106
- return fallback
103
+ RefType .EXPERIMENT -> evaluateExperimentParameter(param, fallback) { experiment, paramName ->
104
+ experiment.getDynamicConfigValue(paramName, fallback)
105
+ }
106
+ else -> fallback
107
107
}
108
108
}
109
109
@@ -125,15 +125,15 @@ class ParameterStore(
125
125
}
126
126
val retVal = if (passes) passValue else failValue
127
127
if (paramType == ParamType .NUMBER ) {
128
- return (retVal as Number ).toDouble() as T
128
+ return (retVal as ? Number )? .toDouble() as ? T ? : fallback
129
129
} else if (paramType == ParamType .ARRAY ) {
130
130
return when (retVal) {
131
- is Array <* > -> return retVal as T
132
- is ArrayList <* > -> return retVal.toTypedArray() as T
131
+ is Array <* > -> return retVal as ? T ? : fallback
132
+ is ArrayList <* > -> return retVal.toTypedArray() as ? T ? : fallback
133
133
else -> fallback
134
134
}
135
135
}
136
- return retVal as T
136
+ return retVal as ? T ? : fallback
137
137
}
138
138
139
139
private inline fun <reified T > evaluateStaticValue (
@@ -144,12 +144,12 @@ class ParameterStore(
144
144
return when (paramType) {
145
145
ParamType .BOOLEAN -> param[" value" ] as ? T ? : fallback
146
146
ParamType .STRING -> param[" value" ] as ? T ? : fallback
147
- ParamType .NUMBER -> (param[" value" ] as Number ).toDouble() as ? T ? : fallback
147
+ ParamType .NUMBER -> (param[" value" ] as ? Number )? .toDouble() as ? T ? : fallback
148
148
ParamType .OBJECT -> param[" value" ] as ? T ? : fallback
149
149
ParamType .ARRAY -> {
150
150
when (val returnValue = param[" value" ]) {
151
- is Array <* > -> returnValue as T
152
- is ArrayList <* > -> (returnValue.toTypedArray()) as T
151
+ is Array <* > -> returnValue as ? T ? : fallback
152
+ is ArrayList <* > -> (returnValue.toTypedArray()) as ? T ? : fallback
153
153
else -> fallback
154
154
}
155
155
}
@@ -158,9 +158,9 @@ class ParameterStore(
158
158
}
159
159
160
160
private inline fun <reified T > evaluateLayerParameter (
161
- paramType : ParamType ,
162
161
param : Map <String , Any >,
163
162
fallback : T ,
163
+ getValue : (Layer , String ) -> T ,
164
164
): T {
165
165
val layerName = param[" layer_name" ] as ? String
166
166
val paramName = param[" param_name" ] as ? String
@@ -172,35 +172,13 @@ class ParameterStore(
172
172
} else {
173
173
statsigClient.getLayer(layerName)
174
174
}
175
- return when (paramType) {
176
- ParamType .BOOLEAN -> layer.getBoolean(
177
- paramName,
178
- fallback as ? Boolean ? : return fallback,
179
- ) as T
180
- ParamType .STRING -> layer.getString(
181
- paramName,
182
- fallback as ? String ? : return fallback,
183
- ) as T
184
- ParamType .NUMBER -> layer.getDouble(
185
- paramName,
186
- fallback as ? Double ? : return fallback,
187
- ) as T
188
- ParamType .OBJECT -> layer.getDictionary(
189
- paramName,
190
- fallback as ? Map <String , Any > ? : return fallback,
191
- ) as T
192
- ParamType .ARRAY -> layer.getArray(
193
- paramName,
194
- fallback as ? Array <* > ? : return fallback,
195
- ) as T
196
- else -> fallback
197
- }
175
+ return getValue(layer, paramName)
198
176
}
199
177
200
178
private inline fun <reified T > evaluateDynamicConfigParameter (
201
- paramType : ParamType ,
202
179
param : Map <String , Any >,
203
180
fallback : T ,
181
+ getValue : (DynamicConfig , String ) -> T ,
204
182
): T {
205
183
val configName = param[" config_name" ] as ? String
206
184
val paramName = param[" param_name" ] as ? String
@@ -212,35 +190,13 @@ class ParameterStore(
212
190
} else {
213
191
statsigClient.getConfig(configName)
214
192
}
215
- return when (paramType) {
216
- ParamType .BOOLEAN -> config.getBoolean(
217
- paramName,
218
- fallback as ? Boolean ? : return fallback,
219
- ) as T
220
- ParamType .STRING -> config.getString(
221
- paramName,
222
- fallback as ? String ? : return fallback,
223
- ) as T
224
- ParamType .NUMBER -> config.getDouble(
225
- paramName,
226
- fallback as ? Double ? : return fallback,
227
- ) as T
228
- ParamType .OBJECT -> config.getDictionary(
229
- paramName,
230
- fallback as ? Map <String , Any > ? : return fallback,
231
- ) as T
232
- ParamType .ARRAY -> config.getArray(
233
- paramName,
234
- fallback as ? Array <* > ? : return fallback,
235
- ) as T
236
- else -> fallback
237
- }
193
+ return getValue(config, paramName)
238
194
}
239
195
240
196
private inline fun <reified T > evaluateExperimentParameter (
241
- paramType : ParamType ,
242
197
param : Map <String , Any >,
243
198
fallback : T ,
199
+ getValue : (DynamicConfig , String ) -> T ,
244
200
): T {
245
201
val experimentName = param[" experiment_name" ] as ? String
246
202
val paramName = param[" param_name" ] as ? String
@@ -252,28 +208,6 @@ class ParameterStore(
252
208
} else {
253
209
statsigClient.getExperiment(experimentName)
254
210
}
255
- return when (paramType) {
256
- ParamType .BOOLEAN -> experiment.getBoolean(
257
- paramName,
258
- fallback as ? Boolean ? : return fallback,
259
- ) as T
260
- ParamType .STRING -> experiment.getString(
261
- paramName,
262
- fallback as ? String ? : return fallback,
263
- ) as T
264
- ParamType .NUMBER -> experiment.getDouble(
265
- paramName,
266
- fallback as ? Double ? : return fallback,
267
- ) as T
268
- ParamType .OBJECT -> experiment.getDictionary(
269
- paramName,
270
- fallback as ? Map <String , Any > ? : return fallback,
271
- ) as T
272
- ParamType .ARRAY -> experiment.getArray(
273
- paramName,
274
- fallback as ? Array <* > ? : return fallback,
275
- ) as T
276
- else -> fallback
277
- }
211
+ return getValue(experiment, paramName)
278
212
}
279
213
}
0 commit comments