From 4e5872998542fc704e9cad326081cae3c48209b0 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 10 Sep 2023 09:20:32 +0200 Subject: [PATCH] forge/rep: work in progress: Record type --- forge/rep/json.go | 12 +++++++----- forge/rep/rep.go | 14 ++++++++++++++ tests/forge_test.go | 14 ++++++++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/forge/rep/json.go b/forge/rep/json.go index 2c7e018..20e6285 100644 --- a/forge/rep/json.go +++ b/forge/rep/json.go @@ -7,17 +7,17 @@ import ( ) func ParseJson(inp string) coderep { - var raw interface{} - return ParseJsonToTarget(inp, &raw) + return ParseJsonTo[interface{}](inp) } -func ParseJsonToTarget(inp string, target *interface{}) coderep { - err := json.Unmarshal([]byte(inp), target) +func ParseJsonTo[T any](inp string) coderep { + var data T + err := json.Unmarshal([]byte(inp), &data) if err != nil { log.Error(err).Msg("rep.ParseJson") return nil } - rep := prepare(*target) + rep := prepare(data) return rep } @@ -27,6 +27,8 @@ func prepare(raw interface{}) coderep { return makeCode(ri) case map[string]interface{}: return makeModule(ri) + default: + return makeRecord(&ri) } return nil } diff --git a/forge/rep/rep.go b/forge/rep/rep.go index d25be33..0160091 100644 --- a/forge/rep/rep.go +++ b/forge/rep/rep.go @@ -88,3 +88,17 @@ func makeModule(ri map[string]interface{}) module { } return m } + +// record - some data structure, typically represented as struct + +type Record struct { + Data interface{} +} + +func (r *Record) Compile(f forge.FE) forge.FPtr { + return nil +} + +func makeRecord(ri interface{}) *Record { + return &Record{ri} +} diff --git a/tests/forge_test.go b/tests/forge_test.go index e69a96c..b210b39 100644 --- a/tests/forge_test.go +++ b/tests/forge_test.go @@ -12,6 +12,15 @@ import ( var fe = forge.NewFE() var b = builtins.Get(fe) +type Person struct { + FirstName string `json:"firstname"` + LastName string `json:"lastname"` +} + +func (p Person) Compile(f forge.FE) forge.FPtr { + return f.Code(p) +} + func TestForge(tb *tbase.T) { t := testing.SetUp(tb) t.Run("exec", ExecTest) @@ -56,4 +65,9 @@ func JsonTest(t *testing.T) { c := src.Compile(fe) fe.Call(c) t.AssertEqual(fe.Pop(), 6) + j = `{"firstname": "John", "lastname": "Dow"}` + prep := rep.ParseJsonTo[Person](j) + data := prep.(*rep.Record).Data.(*interface{}) + person := (*data).(Person) + t.AssertEqual(person.FirstName, "John") }