aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
Diffstat (limited to 'pkg')
-rw-r--r--pkg/serializer/serializer.go23
-rw-r--r--pkg/serializer/serializer_test.go6
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 {