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 { func ParseJson(inp string) coderep {
var raw interface{} return ParseJsonTo[interface{}](inp)
return ParseJsonToTarget(inp, &raw)
} }
func ParseJsonToTarget(inp string, target *interface{}) coderep { func ParseJsonTo[T any](inp string) coderep {
err := json.Unmarshal([]byte(inp), target) var data T
err := json.Unmarshal([]byte(inp), &data)
if err != nil { if err != nil {
log.Error(err).Msg("rep.ParseJson") log.Error(err).Msg("rep.ParseJson")
return nil return nil
} }
rep := prepare(*target) rep := prepare(data)
return rep return rep
} }
@ -27,6 +27,8 @@ func prepare(raw interface{}) coderep {
return makeCode(ri) return makeCode(ri)
case map[string]interface{}: case map[string]interface{}:
return makeModule(ri) return makeModule(ri)
default:
return makeRecord(&ri)
} }
return nil return nil
} }

View file

@ -88,3 +88,17 @@ func makeModule(ri map[string]interface{}) module {
} }
return m 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 fe = forge.NewFE()
var b = builtins.Get(fe) 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) { func TestForge(tb *tbase.T) {
t := testing.SetUp(tb) t := testing.SetUp(tb)
t.Run("exec", ExecTest) t.Run("exec", ExecTest)
@ -56,4 +65,9 @@ func JsonTest(t *testing.T) {
c := src.Compile(fe) c := src.Compile(fe)
fe.Call(c) fe.Call(c)
t.AssertEqual(fe.Pop(), 6) 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")
} }