fix: better handling of zero values; no panic for generic types

This commit is contained in:
Daniel G. Taylor 2022-03-22 09:33:47 -07:00
parent 78d423d0e4
commit d0e1f45708
No known key found for this signature in database
GPG key ID: 74AE195C5112E534
3 changed files with 10 additions and 4 deletions

View file

@ -239,13 +239,13 @@ func shallowStructToMap(v reflect.Value, result map[string]interface{}) {
if name == "-" {
continue
}
if len(parts) == 2 && parts[1] == "omitempty" && v.Field(i).IsZero() {
if len(parts) > 1 && parts[1] == "omitempty" {
vf := v.Field(i)
zero := vf.IsZero()
if vf.Kind() == reflect.Slice || vf.Kind() == reflect.Map {
// Special case: omit if they have no items in them to match the
// JSON encoder.
zero = vf.Len() > 0
zero = vf.Len() == 0
}
if zero {
continue

View file

@ -32,7 +32,9 @@ func getFields(typ reflect.Type) []reflect.StructField {
if newTyp.Kind() == reflect.Ptr {
newTyp = newTyp.Elem()
}
fields = append(fields, getFields(newTyp)...)
if newTyp.Kind() == reflect.Struct {
fields = append(fields, getFields(newTyp)...)
}
}
return fields

View file

@ -200,7 +200,9 @@ func getFields(typ reflect.Type) []reflect.StructField {
if newTyp.Kind() == reflect.Ptr {
newTyp = newTyp.Elem()
}
fields = append(fields, getFields(newTyp)...)
if newTyp.Kind() == reflect.Struct {
fields = append(fields, getFields(newTyp)...)
}
}
return fields
@ -542,6 +544,8 @@ func GenerateWithMode(t reflect.Type, mode Mode, schema *Schema) (*Schema, error
return GenerateWithMode(t.Elem(), mode, schema)
case reflect.Interface:
// Interfaces can be any type.
case reflect.Uintptr, reflect.UnsafePointer, reflect.Func:
// Ignored...
default:
return nil, fmt.Errorf("unsupported type %s from %s", t.Kind(), t)
}