in internal/mapstructure/encoder.go [99:146]
func (e *Encoder) encodeStruct(value reflect.Value) (any, error) {
if value.Kind() != reflect.Struct {
return nil, &reflect.ValueError{
Method: "encodeStruct",
Kind: value.Kind(),
}
}
out, err := e.encodeHook(value)
if err != nil {
return nil, err
}
value = reflect.ValueOf(out)
// if the output of encodeHook is no longer a struct,
// call encode against it.
if value.Kind() != reflect.Struct {
return e.encode(value)
}
result := make(map[string]any)
for i := 0; i < value.NumField(); i++ {
field := value.Field(i)
if field.CanInterface() {
info := getTagInfo(value.Type().Field(i))
if (info.omitEmpty && field.IsZero()) || info.name == optionSkip {
continue
}
encoded, err := e.encode(field)
if err != nil {
if errors.Is(err, errUnsupportedKind) {
continue
}
return nil, fmt.Errorf("error encoding field %q: %w", info.name, err)
}
if e.config.OmitNilFields && encoded == nil {
continue
}
if info.squash {
if m, ok := encoded.(map[string]any); ok {
for k, v := range m {
result[k] = v
}
}
} else {
result[info.name] = encoded
}
}
}
return result, nil
}