Skip to content

Commit

Permalink
Encode embedded structs
Browse files Browse the repository at this point in the history
  • Loading branch information
sqs committed Dec 20, 2013
1 parent 877a192 commit 95e94e5
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 12 deletions.
37 changes: 25 additions & 12 deletions encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -256,20 +256,27 @@ func (enc *encoder) eStruct(key Key, rv reflect.Value) error {
// a field that creates a new table, then all keys under it will be in that
// table (not the one we're writing here).
rt := rv.Type()
var fieldsDirect, fieldsSub []int
for i := 0; i < rt.NumField(); i++ {
frv := rv.Field(i)
if isStructOrMap(frv) {
fieldsSub = append(fieldsSub, i)
} else {
fieldsDirect = append(fieldsDirect, i)
var fieldsDirect, fieldsSub [][]int
var addFields func(rt reflect.Type, rv reflect.Value, startingIndex []int)
addFields = func(rt reflect.Type, rv reflect.Value, startingIndex []int) {
for i := 0; i < rt.NumField(); i++ {
f := rt.Field(i)
frv := rv.Field(i)
if f.Anonymous {
addFields(frv.Type(), frv, f.Index)
} else if isStructOrMap(frv) {
fieldsSub = append(fieldsSub, append(startingIndex, f.Index...))
} else {
fieldsDirect = append(fieldsDirect, append(startingIndex, f.Index...))
}
}
}
addFields(rt, rv, nil)

var writeFields = func(fields []int) error {
for _, fieldIndex := range fields {
sft := rt.Field(fieldIndex)
sf := rv.Field(fieldIndex)
var writeFields = func(fields [][]int) error {
for i, fieldIndex := range fields {
sft := rt.FieldByIndex(fieldIndex)
sf := rv.FieldByIndex(fieldIndex)
if isNil(sf) {
// Don't write anything for nil fields.
continue
Expand All @@ -284,7 +291,7 @@ func (enc *encoder) eStruct(key Key, rv reflect.Value) error {
return err
}

if fieldIndex != len(fields)-1 {
if i != len(fields)-1 {
if _, err := enc.w.Write([]byte{'\n'}); err != nil {
return err
}
Expand All @@ -298,6 +305,12 @@ func (enc *encoder) eStruct(key Key, rv reflect.Value) error {
if err != nil {
return err
}
if len(fieldsDirect) > 0 && len(fieldsSub) > 0 {
_, err = enc.w.Write([]byte{'\n'})
if err != nil {
return err
}
}
err = writeFields(fieldsSub)
if err != nil {
return err
Expand Down
14 changes: 14 additions & 0 deletions encode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,16 @@ ArrayOfMixedSlices = [[1, 2], ["a", "b"]]`,
},
wantOutput: "_bool = true\n\n[_struct]\n _int = 1",
},
"embedded struct": {
input: struct{ Embedded }{Embedded{1}},
wantOutput: "_int = 1",
},
"nested embedded struct": {
input: struct {
Struct struct{ Embedded } `toml:"_struct"`
}{struct{ Embedded }{Embedded{1}}},
wantOutput: "[_struct]\n _int = 1",
},
}
for label, test := range tests {
var buf bytes.Buffer
Expand All @@ -202,3 +212,7 @@ ArrayOfMixedSlices = [[1, 2], ["a", "b"]]`,
}
}
}

type Embedded struct {
Int int `toml:"_int"`
}

0 comments on commit 95e94e5

Please sign in to comment.