From 7679f94b132e251170b8c245d5d8b4bb87cd2438 Mon Sep 17 00:00:00 2001 From: Benjamin DENEUX Date: Wed, 26 Apr 2023 17:32:27 +0200 Subject: [PATCH] feat(logic): json_prolog/2 handle boolean --- x/logic/predicate/json.go | 2 ++ x/logic/predicate/json_test.go | 18 ++++++++++++++++++ x/logic/predicate/util.go | 10 ++++++++++ 3 files changed, 30 insertions(+) diff --git a/x/logic/predicate/json.go b/x/logic/predicate/json.go index 245f281f..194aaec4 100644 --- a/x/logic/predicate/json.go +++ b/x/logic/predicate/json.go @@ -64,6 +64,8 @@ func jsonToTerms(value any) (engine.Term, error) { return nil, fmt.Errorf("could not convert number '%s' into integer term, overflow", v) } return engine.Integer(r.Int64()), nil + case bool: + return AtomBool(v), nil case map[string]any: keys := lo.Keys(v) sort.Strings(keys) diff --git a/x/logic/predicate/json_test.go b/x/logic/predicate/json_test.go index 7e03cd84..c0633b1a 100644 --- a/x/logic/predicate/json_test.go +++ b/x/logic/predicate/json_test.go @@ -100,6 +100,24 @@ func TestJsonProlog(t *testing.T) { wantSuccess: false, wantError: fmt.Errorf("json_prolog/2: could not convert number '10.4' into integer term, decimal number is not handled yet"), }, + // ** JSON -> Prolog ** + // Bool + { + description: "convert json true boolean into prolog", + query: `json_prolog('true', Term).`, + wantResult: []types.TermResults{{ + "Term": "@(true)", + }}, + wantSuccess: true, + }, + { + description: "convert json false boolean into prolog", + query: `json_prolog('false', Term).`, + wantResult: []types.TermResults{{ + "Term": "@(false)", + }}, + wantSuccess: true, + }, } for nc, tc := range cases { Convey(fmt.Sprintf("Given the query #%d: %s", nc, tc.query), func() { diff --git a/x/logic/predicate/util.go b/x/logic/predicate/util.go index eaab5591..e8690926 100644 --- a/x/logic/predicate/util.go +++ b/x/logic/predicate/util.go @@ -75,3 +75,13 @@ func ListToBytes(terms engine.ListIterator, env *engine.Env) ([]byte, error) { } return bt, nil } + +func AtomBool(b bool) engine.Term { + var r engine.Atom + if b { + r = engine.NewAtom("true") + } else { + r = engine.NewAtom("false") + } + return engine.NewAtom("@").Apply(r) +}