forge/rep: record type improvements

This commit is contained in:
Helmut Merz 2023-09-10 09:47:52 +02:00
parent 4e58729985
commit 5626840630
3 changed files with 17 additions and 12 deletions

View file

@ -28,7 +28,7 @@ func prepare(raw interface{}) coderep {
case map[string]interface{}: case map[string]interface{}:
return makeModule(ri) return makeModule(ri)
default: default:
return makeRecord(&ri) return makeRecord(ri)
} }
return nil return nil
} }

View file

@ -49,6 +49,10 @@ func (ci code) Compile(f forge.FE) forge.FPtr {
c.Append(i.Compile(f)) c.Append(i.Compile(f))
case map[string]interface{}: case map[string]interface{}:
c.Append(makeModule(i).Compile(f)) c.Append(makeModule(i).Compile(f))
case record:
c.Append(i.Compile(f))
default:
c.Append(makeRecord(i).Compile(f))
} }
} }
return c.Reset() return c.Reset()
@ -91,14 +95,20 @@ func makeModule(ri map[string]interface{}) module {
// record - some data structure, typically represented as struct // record - some data structure, typically represented as struct
type Record struct { type Record = record
Data interface{}
type record struct {
data interface{}
} }
func (r *Record) Compile(f forge.FE) forge.FPtr { func (r *record) Compile(f forge.FE) forge.FPtr {
return nil return nil
} }
func makeRecord(ri interface{}) *Record { func (r *record) Data() interface{} {
return &Record{ri} return r.data
}
func makeRecord(ri interface{}) *record {
return &record{ri}
} }

View file

@ -17,10 +17,6 @@ type Person struct {
LastName string `json:"lastname"` 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)
@ -67,7 +63,6 @@ func JsonTest(t *testing.T) {
t.AssertEqual(fe.Pop(), 6) t.AssertEqual(fe.Pop(), 6)
j = `{"firstname": "John", "lastname": "Dow"}` j = `{"firstname": "John", "lastname": "Dow"}`
prep := rep.ParseJsonTo[Person](j) prep := rep.ParseJsonTo[Person](j)
data := prep.(*rep.Record).Data.(*interface{}) person := prep.(*rep.Record).Data().(Person)
person := (*data).(Person)
t.AssertEqual(person.FirstName, "John") t.AssertEqual(person.FirstName, "John")
} }