func fillNullAndForceSend()

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)
}