forge/rep: work in progress: Record type
This commit is contained in:
parent
704ff5f2fd
commit
4e58729985
3 changed files with 35 additions and 5 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}
|
||||||
|
}
|
||||||
|
|
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue