Skip to content

Commit 5c939b3

Browse files
authored
support object returns in conditional checks (#59)
1 parent b177c64 commit 5c939b3

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

jsonlogic.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,6 @@ func all(values, data interface{}) interface{} {
350350
return false
351351
}
352352

353-
354-
355353
for _, value := range subject.([]interface{}) {
356354
conditions := solveVars(parsed[1], value)
357355
v := apply(conditions, value)
@@ -447,7 +445,15 @@ func parseValues(values, data interface{}) interface{} {
447445
}
448446

449447
func apply(rules, data interface{}) interface{} {
450-
for operator, values := range rules.(map[string]interface{}) {
448+
ruleMap := rules.(map[string]interface{})
449+
450+
// A map with more than 1 key counts as a primitive
451+
// end recursion
452+
if len(ruleMap) > 1 {
453+
return ruleMap
454+
}
455+
456+
for operator, values := range ruleMap {
451457
if operator == "filter" {
452458
return filter(values, data)
453459
}

jsonlogic_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,3 +724,20 @@ func TestIssue52_example2(t *testing.T) {
724724
expected := `"jsonlogic"`
725725
assert.JSONEq(t, expected, result.String())
726726
}
727+
728+
func TestIssue58_example(t *testing.T) {
729+
data := strings.NewReader(`{"foo": "bar"}`)
730+
logic := strings.NewReader(`{"if":[
731+
{"==":[{"var":"foo"},"bar"]},{"foo":"is_bar","path":"foo_is_bar"},
732+
{"foo":"not_bar","path":"default_object"}
733+
]}`)
734+
735+
var result bytes.Buffer
736+
err := Apply(logic, data, &result)
737+
if err != nil {
738+
t.Fatal(err)
739+
}
740+
741+
expected := `{"foo":"is_bar","path":"foo_is_bar"}`
742+
assert.JSONEq(t, expected, result.String())
743+
}

0 commit comments

Comments
 (0)