diff --git a/evaluator/flags/testkit-flags.json b/evaluator/flags/testkit-flags.json index 268e905..2d0256f 100644 --- a/evaluator/flags/testkit-flags.json +++ b/evaluator/flags/testkit-flags.json @@ -474,6 +474,18 @@ ["two", 50] ] } + }, + "nested-ref-targeted-flag": { + "state": "ENABLED", + "variants": { + "privileged": "privileged", + "standard": "standard", + "none": "none" + }, + "defaultVariant": "none", + "targeting": { + "if": [{"$ref": "is_privileged"}, "privileged", "standard"] + } } }, "$evaluators": { @@ -482,6 +494,12 @@ "ballmer@macrosoft.com", {"var": ["email"]} ] + }, + "is_privileged": { + "or": [ + {"==": ["ballmer@macrosoft.com", {"var": ["email"]}]}, + {"==": ["admin", {"var": ["role"]}]} + ] } } } diff --git a/evaluator/gherkin/evaluator-refs.feature b/evaluator/gherkin/evaluator-refs.feature index 0d8467d..fd404a3 100644 --- a/evaluator/gherkin/evaluator-refs.feature +++ b/evaluator/gherkin/evaluator-refs.feature @@ -13,3 +13,16 @@ Feature: Evaluator evaluator refs | key | value | | some-email-targeted-flag | hi | | some-other-email-targeted-flag | yes | + + @evaluator-ref-edge-cases + Scenario Outline: Nested evaluator ref resolution + Given an evaluator + And a String-flag with key "nested-ref-targeted-flag" and a fallback value "fallback" + And a context containing a key "", with type "String" and with value "" + When the flag was evaluated with details + Then the resolved details value should be "" + Examples: + | context_key | context_value | value | + | email | ballmer@macrosoft.com | privileged | + | role | admin | privileged | + | email | other@example.com | standard | diff --git a/flags/evaluator-refs.json b/flags/evaluator-refs.json index faad954..1b22a48 100644 --- a/flags/evaluator-refs.json +++ b/flags/evaluator-refs.json @@ -35,6 +35,24 @@ "no" ] } + }, + "nested-ref-targeted-flag": { + "state": "ENABLED", + "variants": { + "privileged": "privileged", + "standard": "standard", + "none": "none" + }, + "defaultVariant": "none", + "targeting": { + "if": [ + { + "$ref": "is_privileged" + }, + "privileged", + "standard" + ] + } } }, "$evaluators": { @@ -42,8 +60,22 @@ "==": [ "ballmer@macrosoft.com", { - "var": [ - "email" + "var": ["email"] + } + ] + }, + "is_privileged": { + "or": [ + { + "==": [ + "ballmer@macrosoft.com", + {"var": ["email"]} + ] + }, + { + "==": [ + "admin", + {"var": ["role"]} ] } ] diff --git a/gherkin/targeting.feature b/gherkin/targeting.feature index 5dd7ae2..e62b241 100644 --- a/gherkin/targeting.feature +++ b/gherkin/targeting.feature @@ -10,6 +10,7 @@ Feature: Targeting rules And a stable flagd provider # evaluator refs + @evaluator-refs Scenario Outline: Evaluator reuse Given a String-flag with key "" and a default value "fallback" And a context containing a key "email", with type "String" and with value "ballmer@macrosoft.com" @@ -20,6 +21,18 @@ Feature: Targeting rules | some-email-targeted-flag | hi | | some-other-email-targeted-flag | yes | + @evaluator-refs @evaluator-ref-edge-cases + Scenario Outline: Nested evaluator ref resolution + Given a String-flag with key "nested-ref-targeted-flag" and a default value "fallback" + And a context containing a key "", with type "String" and with value "" + When the flag was evaluated with details + Then the resolved details value should be "" + Examples: + | context_key | context_value | value | + | email | ballmer@macrosoft.com | privileged | + | role | admin | privileged | + | email | other@example.com | standard | + # custom operators # @fractional-v1: legacy float-based bucketing (abs(hash) / i32::MAX * 100) # @fractional-v2: high-precision integer bucketing ((hash * totalWeight) >> 32)