diff options
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/serializer/serializer.go | 23 | ||||
| -rw-r--r-- | pkg/serializer/serializer_test.go | 6 |
2 files changed, 22 insertions, 7 deletions
diff --git a/pkg/serializer/serializer.go b/pkg/serializer/serializer.go index 473b6fa74..4de4dc093 100644 --- a/pkg/serializer/serializer.go +++ b/pkg/serializer/serializer.go @@ -57,7 +57,10 @@ func (w *writer) do(v reflect.Value, sliceElem bool) { case reflect.String: fmt.Fprintf(w.w, "%q", v.String()) case reflect.Func: - // Skip, no way to serialize this. + if !v.IsNil() { + panic("no way to serialize funcs") + } + fmt.Fprintf(w.w, "nil") default: panic(fmt.Sprintf("unsupported type: %#v", v.Type().String())) } @@ -111,17 +114,27 @@ func (w *writer) doStruct(v reflect.Value, sliceElem bool) { w.string(v.Type().Name()) } w.byte('{') + fieldNames := false + for i := 0; i < v.NumField(); i++ { + f := v.Field(i) + if isDefaultValue(f) || !f.CanSet() { + fieldNames = true + break + } + } needComma := false for i := 0; i < v.NumField(); i++ { f := v.Field(i) - if isDefaultValue(f) { + if fieldNames && (isDefaultValue(f) || !f.CanSet()) { continue } if needComma { w.byte(',') } - w.string(v.Type().Field(i).Name) - w.byte(':') + if fieldNames { + w.string(v.Type().Field(i).Name) + w.byte(':') + } w.do(f, false) needComma = true } @@ -177,7 +190,7 @@ func isDefaultValue(v reflect.Value) bool { case reflect.String: return v.String() == "" case reflect.Func: - return true + return false default: return false } diff --git a/pkg/serializer/serializer_test.go b/pkg/serializer/serializer_test.go index 06dbaf304..c33b316a9 100644 --- a/pkg/serializer/serializer_test.go +++ b/pkg/serializer/serializer_test.go @@ -13,9 +13,10 @@ func TestSerializer(t *testing.T) { Y: Y{1}, P: &Y{2}, A: []Y{{3}, {4}}, - F: true, + B: true, S: "a\x09b", T: T1, + F: nil, } buf := new(bytes.Buffer) Write(buf, x) @@ -27,9 +28,10 @@ type X struct { Y Y P *Y A []Y - F bool + B bool S string T T + F func() } type Y struct { |
