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 {
|
||||
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
|
||||
}
|
||||
|
|
|
@ -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}
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue