func()

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
}