diff --git a/encode.go b/encode.go index dc8568d1..6fbe40a7 100644 --- a/encode.go +++ b/encode.go @@ -653,6 +653,11 @@ func isEmpty(rv reflect.Value) bool { case reflect.Array, reflect.Slice, reflect.Map, reflect.String: return rv.Len() == 0 case reflect.Struct: + // TODO: should probably return an error here, or do this check + // somewhere else. + if !rv.Type().Comparable() { + return false + } return reflect.Zero(rv.Type()).Interface() == rv.Interface() case reflect.Bool: return !rv.Bool() diff --git a/encode_test.go b/encode_test.go index 93fb7d27..cb5b4a36 100644 --- a/encode_test.go +++ b/encode_test.go @@ -212,6 +212,24 @@ time = 1985-06-18T15:16:17Z v, expected, nil) } +func TestEncodeWithOmitEmptyUncomparable(t *testing.T) { + type nest struct { + Field []string `toml:"Field,omitempty"` + } + s := struct { + Values nest `toml:"values,omitempty"` + Empty nest `toml:"empty,omitempty"` + }{Values: nest{[]string{"XXX"}}} + + buf := new(bytes.Buffer) + err := NewEncoder(buf).Encode(s) + // if !errorContains(err, "comparing uncomparable type struct") { + // t.Fatalf("wrong error: %v", err) + // } + fmt.Println(err) + fmt.Println(buf.String()) +} + func TestEncodeWithOmitZero(t *testing.T) { type simple struct { Number int `toml:"number,omitzero"`