in document/cbor/encode.go [97:141]
func (e *encoder) encodeStruct(rv reflect.Value) (cbor.Value, error) {
if rv.CanInterface() && document.IsNoSerde(rv.Interface()) {
return nil, &document.UnmarshalTypeError{
Value: fmt.Sprintf("unsupported type"),
Type: rv.Type(),
}
}
switch {
case rv.Type().ConvertibleTo(serde.ReflectTypeOf.Time):
return nil, &document.InvalidMarshalError{
Message: fmt.Sprintf("unsupported type %s", rv.Type().String()),
}
case rv.Type().ConvertibleTo(serde.ReflectTypeOf.BigFloat):
fallthrough
case rv.Type().ConvertibleTo(serde.ReflectTypeOf.BigInt):
return e.encodeNumber(rv)
}
fields := serde.GetStructFields(rv.Type())
mv := cbor.Map{}
for _, f := range fields.All() {
if f.Name == "" {
return nil, &document.InvalidMarshalError{Message: "map key cannot be empty"}
}
fv, found := serde.EncoderFieldByIndex(rv, f.Index)
if !found {
continue
}
cv, err := e.encode(fv, f.Tag)
if err != nil {
return nil, err
}
if cv == nil { // from omitEmpty
continue
}
mv[f.Name] = cv
}
return mv, nil
}