func checkPostAccess()

in pkg/cloud/api/check.go [26:71]


func checkPostAccess(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("checkPostAccess %v: %w", p, err)
		}
		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)
			fp := p.Field(ft.Name)

			switch fType {
			case FieldTypeSystem:
				if !fv.IsZero() {
					return false, fmt.Errorf("%s has a non-zero value (%v) but is a System field", fv.Interface(), fp)
				}
			case FieldTypeOutputOnly:
				if !fv.IsZero() {
					return false, fmt.Errorf("%s has a non-zero value (%v) but is an OutputOnly field", fv.Interface(), fp)
				}
			case FieldTypeNonZeroValue:
				switch {
				case fv.IsZero() && !acc.inNull(ft.Name) && !acc.inForceSend(ft.Name):
					return false, fmt.Errorf("%s is zero value but not in a NullFields or ForceSendFields %v %t", fp, fv.Interface(), fv.IsZero())
				case !fv.IsZero() && acc.inNull(ft.Name):
					return false, fmt.Errorf("%s is non-nil and also in NullFields", fp)
				}
			case FieldTypeOrdinary, FieldTypeAllowZeroValue:
				continue
			default:
				return false, fmt.Errorf("invalid FieldType: %q", fType)
			}
		}
		return true, nil
	}
	return visit(v, acc)
}