Skip to content

Commit 9fa3b6a

Browse files
LeonBkisielk
authored andcommitted
Make custom encoder take precedence before looping throught struct fields (#89)
1 parent 99b3433 commit 9fa3b6a

File tree

2 files changed

+48
-5
lines changed

2 files changed

+48
-5
lines changed

encoder.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,6 @@ func (e *Encoder) encode(v reflect.Value, dst map[string][]string) error {
8080
continue
8181
}
8282

83-
if v.Field(i).Type().Kind() == reflect.Struct {
84-
e.encode(v.Field(i), dst)
85-
continue
86-
}
87-
8883
encFunc := typeEncoder(v.Field(i).Type(), e.regenc)
8984

9085
// Encode non-slice types and custom implementations immediately.
@@ -98,6 +93,11 @@ func (e *Encoder) encode(v reflect.Value, dst map[string][]string) error {
9893
continue
9994
}
10095

96+
if v.Field(i).Type().Kind() == reflect.Struct {
97+
e.encode(v.Field(i), dst)
98+
continue
99+
}
100+
101101
if v.Field(i).Type().Kind() == reflect.Slice {
102102
encFunc = typeEncoder(v.Field(i).Type().Elem(), e.regenc)
103103
}

encoder_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,49 @@ func TestRegisterEncoder(t *testing.T) {
248248
valExists(t, "oneSliceAsWord", "one", v1)
249249
}
250250

251+
func TestEncoderOrder(t *testing.T) {
252+
type builtinEncoderSimple int
253+
type builtinEncoderSimpleOverridden int
254+
type builtinEncoderSlice []int
255+
type builtinEncoderSliceOverridden []int
256+
type builtinEncoderStruct struct{ nr int }
257+
type builtinEncoderStructOverridden struct{ nr int }
258+
259+
s1 := &struct {
260+
builtinEncoderSimple `schema:"simple"`
261+
builtinEncoderSimpleOverridden `schema:"simple_overridden"`
262+
builtinEncoderSlice `schema:"slice"`
263+
builtinEncoderSliceOverridden `schema:"slice_overridden"`
264+
builtinEncoderStruct `schema:"struct"`
265+
builtinEncoderStructOverridden `schema:"struct_overridden"`
266+
}{
267+
1,
268+
1,
269+
[]int{2},
270+
[]int{2},
271+
builtinEncoderStruct{3},
272+
builtinEncoderStructOverridden{3},
273+
}
274+
v1 := make(map[string][]string)
275+
276+
encoder := NewEncoder()
277+
encoder.RegisterEncoder(s1.builtinEncoderSimpleOverridden, func(v reflect.Value) string { return "one" })
278+
encoder.RegisterEncoder(s1.builtinEncoderSliceOverridden, func(v reflect.Value) string { return "two" })
279+
encoder.RegisterEncoder(s1.builtinEncoderStructOverridden, func(v reflect.Value) string { return "three" })
280+
281+
err := encoder.Encode(s1, v1)
282+
if err != nil {
283+
t.Errorf("Encoder has non-nil error: %v", err)
284+
}
285+
286+
valExists(t, "simple", "1", v1)
287+
valExists(t, "simple_overridden", "one", v1)
288+
valExists(t, "slice", "2", v1)
289+
valExists(t, "slice_overridden", "two", v1)
290+
valExists(t, "nr", "3", v1)
291+
valExists(t, "struct_overridden", "three", v1)
292+
}
293+
251294
func valExists(t *testing.T, key string, expect string, result map[string][]string) {
252295
valsExist(t, key, []string{expect}, result)
253296
}

0 commit comments

Comments
 (0)