forge/rep: work in progress: Record type

This commit is contained in:
Helmut Merz 2023-09-10 09:20:32 +02:00
parent 704ff5f2fd
commit 4e58729985
3 changed files with 35 additions and 5 deletions

View file

@ -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
}

View file

@ -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}
}

View file

@ -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")
}