in pkg/cloud/api/fill.go [160:208]
func fillNullAndForceSend(traits *FieldTraits, v reflect.Value) error {
acc := newAcceptorFuncs()
acc.onStructF = func(p Path, v reflect.Value) (bool, error) {
if p.Equal(Path{}.Pointer().Field("ServerResponse")) {
return false, nil
}
acc, err := newMetafieldAccessor(v)
if err != nil {
return false, fmt.Errorf("fillNullAndForceSend: %w", err)
}
nullFields := acc.null()
forceSendFields := acc.forceSend()
for i := 0; i < v.NumField(); i++ {
ft := v.Type().Field(i)
if ft.Name == "NullFields" || ft.Name == "ForceSendFields" {
continue
}
fType := traits.FieldType(p.Field(ft.Name))
fv := v.Field(i)
if fType == FieldTypeNonZeroValue {
switch {
case fv.IsZero() && fv.Type().Kind() == reflect.Pointer:
nullFields[ft.Name] = true
case fv.IsZero():
forceSendFields[ft.Name] = true
}
}
}
set := func(m map[string]bool, d reflect.Value) {
var sl []string
for k := range m {
sl = append(sl, k)
}
sort.Strings(sl)
d.Set(reflect.ValueOf(sl))
}
set(nullFields, v.FieldByName(nullFieldsName))
set(forceSendFields, v.FieldByName(forceSendFieldsName))
return true, nil
}
return visit(v, acc)
}