Skip to content

Commit 9847a52

Browse files
authored
feat!: add evaluation details for finally hooks (#136)
Signed-off-by: christian.lutnik <[email protected]>
1 parent 706fcdc commit 9847a52

File tree

6 files changed

+44
-21
lines changed

6 files changed

+44
-21
lines changed

android/api/android.api

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,15 +173,15 @@ public abstract interface class dev/openfeature/sdk/Hook {
173173
public abstract fun after (Ldev/openfeature/sdk/HookContext;Ldev/openfeature/sdk/FlagEvaluationDetails;Ljava/util/Map;)V
174174
public abstract fun before (Ldev/openfeature/sdk/HookContext;Ljava/util/Map;)V
175175
public abstract fun error (Ldev/openfeature/sdk/HookContext;Ljava/lang/Exception;Ljava/util/Map;)V
176-
public abstract fun finallyAfter (Ldev/openfeature/sdk/HookContext;Ljava/util/Map;)V
176+
public abstract fun finallyAfter (Ldev/openfeature/sdk/HookContext;Ldev/openfeature/sdk/FlagEvaluationDetails;Ljava/util/Map;)V
177177
public abstract fun supportsFlagValueType (Ldev/openfeature/sdk/FlagValueType;)Z
178178
}
179179

180180
public final class dev/openfeature/sdk/Hook$DefaultImpls {
181181
public static fun after (Ldev/openfeature/sdk/Hook;Ldev/openfeature/sdk/HookContext;Ldev/openfeature/sdk/FlagEvaluationDetails;Ljava/util/Map;)V
182182
public static fun before (Ldev/openfeature/sdk/Hook;Ldev/openfeature/sdk/HookContext;Ljava/util/Map;)V
183183
public static fun error (Ldev/openfeature/sdk/Hook;Ldev/openfeature/sdk/HookContext;Ljava/lang/Exception;Ljava/util/Map;)V
184-
public static fun finallyAfter (Ldev/openfeature/sdk/Hook;Ldev/openfeature/sdk/HookContext;Ljava/util/Map;)V
184+
public static fun finallyAfter (Ldev/openfeature/sdk/Hook;Ldev/openfeature/sdk/HookContext;Ldev/openfeature/sdk/FlagEvaluationDetails;Ljava/util/Map;)V
185185
public static fun supportsFlagValueType (Ldev/openfeature/sdk/Hook;Ldev/openfeature/sdk/FlagValueType;)Z
186186
}
187187

@@ -208,7 +208,7 @@ public final class dev/openfeature/sdk/HookContext {
208208

209209
public final class dev/openfeature/sdk/HookSupport {
210210
public fun <init> ()V
211-
public final fun afterAllHooks (Ldev/openfeature/sdk/FlagValueType;Ldev/openfeature/sdk/HookContext;Ljava/util/List;Ljava/util/Map;)V
211+
public final fun afterAllHooks (Ldev/openfeature/sdk/FlagValueType;Ldev/openfeature/sdk/HookContext;Ldev/openfeature/sdk/FlagEvaluationDetails;Ljava/util/List;Ljava/util/Map;)V
212212
public final fun afterHooks (Ldev/openfeature/sdk/FlagValueType;Ldev/openfeature/sdk/HookContext;Ldev/openfeature/sdk/FlagEvaluationDetails;Ljava/util/List;Ljava/util/Map;)V
213213
public final fun beforeHooks (Ldev/openfeature/sdk/FlagValueType;Ldev/openfeature/sdk/HookContext;Ljava/util/List;Ljava/util/Map;)V
214214
public final fun errorHooks (Ldev/openfeature/sdk/FlagValueType;Ldev/openfeature/sdk/HookContext;Ljava/lang/Exception;Ljava/util/List;Ljava/util/Map;)V

android/src/main/java/dev/openfeature/sdk/Hook.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ interface Hook<T> {
44
fun before(ctx: HookContext<T>, hints: Map<String, Any>) = Unit
55
fun after(ctx: HookContext<T>, details: FlagEvaluationDetails<T>, hints: Map<String, Any>) = Unit
66
fun error(ctx: HookContext<T>, error: Exception, hints: Map<String, Any>) = Unit
7-
fun finallyAfter(ctx: HookContext<T>, hints: Map<String, Any>) = Unit
7+
fun finallyAfter(ctx: HookContext<T>, details: FlagEvaluationDetails<T>, hints: Map<String, Any>) = Unit
88
fun supportsFlagValueType(flagValueType: FlagValueType): Boolean = true
99
}

android/src/main/java/dev/openfeature/sdk/HookSupport.kt

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,25 @@ class HookSupport {
1818
booleanHook.before(booleanCtx, hints)
1919
}
2020
}
21+
2122
FlagValueType.STRING -> {
2223
safeLet(hook as? Hook<String>, hookCtx as? HookContext<String>) { stringHook, stringCtx ->
2324
stringHook.before(stringCtx, hints)
2425
}
2526
}
27+
2628
FlagValueType.INTEGER -> {
2729
safeLet(hook as? Hook<Int>, hookCtx as? HookContext<Int>) { integerHook, integerCtx ->
2830
integerHook.before(integerCtx, hints)
2931
}
3032
}
33+
3134
FlagValueType.DOUBLE -> {
3235
safeLet(hook as? Hook<Double>, hookCtx as? HookContext<Double>) { doubleHook, doubleCtx ->
3336
doubleHook.before(doubleCtx, hints)
3437
}
3538
}
39+
3640
FlagValueType.OBJECT -> {
3741
safeLet(hook as? Hook<Value>, hookCtx as? HookContext<Value>) { objectHook, objectCtx ->
3842
objectHook.before(objectCtx, hints)
@@ -63,6 +67,7 @@ class HookSupport {
6367
booleanHook.after(booleanCtx, booleanDetails, hints)
6468
}
6569
}
70+
6671
FlagValueType.STRING -> {
6772
safeLet(
6873
hook as? Hook<String>,
@@ -72,6 +77,7 @@ class HookSupport {
7277
stringHook.after(stringCtx, stringDetails, hints)
7378
}
7479
}
80+
7581
FlagValueType.INTEGER -> {
7682
safeLet(
7783
hook as? Hook<Int>,
@@ -81,6 +87,7 @@ class HookSupport {
8187
integerHook.after(integerCtx, integerDetails, hints)
8288
}
8389
}
90+
8491
FlagValueType.DOUBLE -> {
8592
safeLet(
8693
hook as? Hook<Double>,
@@ -90,6 +97,7 @@ class HookSupport {
9097
doubleHook.after(doubleCtx, doubleDetails, hints)
9198
}
9299
}
100+
93101
FlagValueType.OBJECT -> {
94102
safeLet(
95103
hook as? Hook<Value>,
@@ -107,6 +115,7 @@ class HookSupport {
107115
fun <T> afterAllHooks(
108116
flagValueType: FlagValueType,
109117
hookCtx: HookContext<T>,
118+
details: FlagEvaluationDetails<T>,
110119
hooks: List<Hook<*>>,
111120
hints: Map<String, Any>
112121
) {
@@ -118,41 +127,50 @@ class HookSupport {
118127
FlagValueType.BOOLEAN -> {
119128
safeLet(
120129
hook as? Hook<Boolean>,
121-
hookCtx as? HookContext<Boolean>
122-
) { booleanHook, booleanCtx ->
123-
booleanHook.finallyAfter(booleanCtx, hints)
130+
hookCtx as? HookContext<Boolean>,
131+
details as? FlagEvaluationDetails<Boolean>
132+
) { booleanHook, booleanCtx, booleanDetails ->
133+
booleanHook.finallyAfter(booleanCtx, booleanDetails, hints)
124134
}
125135
}
136+
126137
FlagValueType.STRING -> {
127138
safeLet(
128139
hook as? Hook<String>,
129-
hookCtx as? HookContext<String>
130-
) { stringHook, stringCtx ->
131-
stringHook.finallyAfter(stringCtx, hints)
140+
hookCtx as? HookContext<String>,
141+
details as? FlagEvaluationDetails<String>
142+
) { stringHook, stringCtx, stringDetails ->
143+
stringHook.finallyAfter(stringCtx, stringDetails, hints)
132144
}
133145
}
146+
134147
FlagValueType.INTEGER -> {
135148
safeLet(
136149
hook as? Hook<Int>,
137-
hookCtx as? HookContext<Int>
138-
) { integerHook, integerCtx ->
139-
integerHook.finallyAfter(integerCtx, hints)
150+
hookCtx as? HookContext<Int>,
151+
details as? FlagEvaluationDetails<Int>
152+
) { integerHook, integerCtx, integerDetails ->
153+
integerHook.finallyAfter(integerCtx, integerDetails, hints)
140154
}
141155
}
156+
142157
FlagValueType.DOUBLE -> {
143158
safeLet(
144159
hook as? Hook<Double>,
145-
hookCtx as? HookContext<Double>
146-
) { doubleHook, doubleCtx ->
147-
doubleHook.finallyAfter(doubleCtx, hints)
160+
hookCtx as? HookContext<Double>,
161+
details as? FlagEvaluationDetails<Double>
162+
) { doubleHook, doubleCtx, doubleDetails ->
163+
doubleHook.finallyAfter(doubleCtx, doubleDetails, hints)
148164
}
149165
}
166+
150167
FlagValueType.OBJECT -> {
151168
safeLet(
152169
hook as? Hook<Value>,
153-
hookCtx as? HookContext<Value>
154-
) { objectHook, objectCtx ->
155-
objectHook.finallyAfter(objectCtx, hints)
170+
hookCtx as? HookContext<Value>,
171+
details as? FlagEvaluationDetails<Value>
172+
) { objectHook, objectCtx, objectDetails ->
173+
objectHook.finallyAfter(objectCtx, objectDetails, hints)
156174
}
157175
}
158176
}
@@ -180,6 +198,7 @@ class HookSupport {
180198
booleanHook.error(booleanCtx, error, hints)
181199
}
182200
}
201+
183202
FlagValueType.STRING -> {
184203
safeLet(
185204
hook as? Hook<String>,
@@ -188,6 +207,7 @@ class HookSupport {
188207
stringHook.error(stringCtx, error, hints)
189208
}
190209
}
210+
191211
FlagValueType.INTEGER -> {
192212
safeLet(
193213
hook as? Hook<Int>,
@@ -196,6 +216,7 @@ class HookSupport {
196216
integerHook.error(integerCtx, error, hints)
197217
}
198218
}
219+
199220
FlagValueType.DOUBLE -> {
200221
safeLet(
201222
hook as? Hook<Double>,
@@ -204,6 +225,7 @@ class HookSupport {
204225
doubleHook.error(doubleCtx, error, hints)
205226
}
206227
}
228+
207229
FlagValueType.OBJECT -> {
208230
safeLet(
209231
hook as? Hook<Value>,

android/src/main/java/dev/openfeature/sdk/OpenFeatureClient.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ class OpenFeatureClient(
213213

214214
hookSupport.errorHooks(flagValueType, hookCtx, error, mergedHooks, hints)
215215
}
216-
hookSupport.afterAllHooks(flagValueType, hookCtx, mergedHooks, hints)
216+
hookSupport.afterAllHooks(flagValueType, hookCtx, details, mergedHooks, hints)
217217
return details
218218
}
219219

android/src/test/java/dev/openfeature/sdk/HookSupportTests.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class HookSupportTests {
4444
hookSupport.afterAllHooks(
4545
FlagValueType.BOOLEAN,
4646
hookContext,
47+
FlagEvaluationDetails("", false),
4748
listOf(hook),
4849
mapOf()
4950
)

android/src/test/java/dev/openfeature/sdk/helpers/GenericSpyHookMock.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class GenericSpyHookMock(private var prefix: String = "", var addEval: (String)
3636
addEval("$prefix error")
3737
}
3838

39-
override fun finallyAfter(ctx: HookContext<Any>, hints: Map<String, Any>) {
39+
override fun finallyAfter(ctx: HookContext<Any>, details: FlagEvaluationDetails<Any>, hints: Map<String, Any>) {
4040
finallyCalledAfter += 1
4141
addEval("$prefix finallyAfter")
4242
}

0 commit comments

Comments
 (0)