diff --git a/pkg/apis/certificates/v1/zz_generated.validations.go b/pkg/apis/certificates/v1/zz_generated.validations.go index 8384e157fff..8bcdd5c6dd5 100644 --- a/pkg/apis/certificates/v1/zz_generated.validations.go +++ b/pkg/apis/certificates/v1/zz_generated.validations.go @@ -119,7 +119,11 @@ func Validate_CertificateSigningRequestStatus(ctx context.Context, op operation. return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.ZeroOrOneOfUnion(ctx, op, fldPath, obj, oldObj, zeroOrOneOfMembershipFor_k8s_io_api_certificates_v1_CertificateSigningRequestStatus_conditions_, func(list []certificatesv1.CertificateSigningRequestCondition) bool { diff --git a/pkg/apis/certificates/v1beta1/zz_generated.validations.go b/pkg/apis/certificates/v1beta1/zz_generated.validations.go index 8ee94e7cf9d..f4a8710bed1 100644 --- a/pkg/apis/certificates/v1beta1/zz_generated.validations.go +++ b/pkg/apis/certificates/v1beta1/zz_generated.validations.go @@ -119,7 +119,11 @@ func Validate_CertificateSigningRequestStatus(ctx context.Context, op operation. return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.ZeroOrOneOfUnion(ctx, op, fldPath, obj, oldObj, zeroOrOneOfMembershipFor_k8s_io_api_certificates_v1beta1_CertificateSigningRequestStatus_conditions_, func(list []certificatesv1beta1.CertificateSigningRequestCondition) bool { diff --git a/pkg/apis/core/v1/zz_generated.validations.go b/pkg/apis/core/v1/zz_generated.validations.go index eaeab7f8dc3..d3ccbc5e62c 100644 --- a/pkg/apis/core/v1/zz_generated.validations.go +++ b/pkg/apis/core/v1/zz_generated.validations.go @@ -73,7 +73,11 @@ func Validate_ReplicationController(ctx context.Context, op operation.Operation, } // call field-attached validations func() { // cohort name + earlyReturn := false if e := validate.Subfield(ctx, op, fldPath, obj, oldObj, "name", func(o *metav1.ObjectMeta) *string { return &o.Name }, validate.DirectEqualPtr, validate.OptionalValue); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.Subfield(ctx, op, fldPath, obj, oldObj, "name", func(o *metav1.ObjectMeta) *string { return &o.Name }, validate.DirectEqualPtr, validate.LongName)...) @@ -129,9 +133,13 @@ func Validate_ReplicationControllerSpec(ctx context.Context, op operation.Operat return nil } // call field-attached validations + earlyReturn := false // optional fields with default values are effectively required if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 0)...) diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/cohorts/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/cohorts/zz_generated.validations.go index 04c5b27a016..75abb8281fa 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/cohorts/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/cohorts/zz_generated.validations.go @@ -51,21 +51,33 @@ func RegisterValidations(scheme *testscheme.Scheme) error { // Validate_T validates an instance of T according // to declarative validation rules in the API schema. func Validate_T(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T) (errs field.ErrorList) { + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T Regular")...) func() { // cohort c2 + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T c2 ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T c2 Regular")...) }() func() { // cohort c1 + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T c1 ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T c1 Regular")...) @@ -81,21 +93,33 @@ func Validate_T(ctx context.Context, op operation.Operation, fldPath *field.Path return nil } // call field-attached validations + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T.S ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T.S Regular")...) func() { // cohort c2 + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T.S c2 ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T.S c2 Regular")...) }() func() { // cohort c1 + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T.S c1 ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T.S c1 Regular")...) diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/structs/testdata/validate-false.json b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/structs/testdata/validate-false.json index 6fe7d40337f..f1fd2b1edf2 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/structs/testdata/validate-false.json +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/structs/testdata/validate-false.json @@ -42,7 +42,8 @@ }, "*structs.TMultiple": { "": [ - "TMultiple, ShortCircuit 1" + "TMultiple, ShortCircuit 1", + "TMultiple, ShortCircuit 2" ] } } \ No newline at end of file diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/structs/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/structs/zz_generated.validations.go index 250b06144b4..7ae160e4c62 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/structs/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/structs/zz_generated.validations.go @@ -179,8 +179,12 @@ func Validate_T01(ctx context.Context, op operation.Operation, fldPath *field.Pa // Validate_T02 validates an instance of T02 according // to declarative validation rules in the API schema. func Validate_T02(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T02) (errs field.ErrorList) { + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T02, ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } @@ -194,8 +198,12 @@ func Validate_T02(ctx context.Context, op operation.Operation, fldPath *field.Pa return nil } // call field-attached validations + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T02.S, ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -209,8 +217,12 @@ func Validate_T02(ctx context.Context, op operation.Operation, fldPath *field.Pa return nil } // call field-attached validations + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T02.PS, ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -224,8 +236,12 @@ func Validate_T02(ctx context.Context, op operation.Operation, fldPath *field.Pa return nil } // call field-attached validations + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T02.T, ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } // call the type's validation function @@ -241,8 +257,12 @@ func Validate_T02(ctx context.Context, op operation.Operation, fldPath *field.Pa return nil } // call field-attached validations + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T02.PT, ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } // call the type's validation function @@ -256,8 +276,12 @@ func Validate_T02(ctx context.Context, op operation.Operation, fldPath *field.Pa // Validate_T03 validates an instance of T03 according // to declarative validation rules in the API schema. func Validate_T03(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T03) (errs field.ErrorList) { + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03, ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03, no flags")...) @@ -272,8 +296,12 @@ func Validate_T03(ctx context.Context, op operation.Operation, fldPath *field.Pa return nil } // call field-attached validations + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03.S, ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03.S, no flags")...) @@ -288,8 +316,12 @@ func Validate_T03(ctx context.Context, op operation.Operation, fldPath *field.Pa return nil } // call field-attached validations + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03.PS, ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03.PS, no flags")...) @@ -304,8 +336,12 @@ func Validate_T03(ctx context.Context, op operation.Operation, fldPath *field.Pa return nil } // call field-attached validations + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03.T, ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03.T, no flags")...) @@ -322,8 +358,12 @@ func Validate_T03(ctx context.Context, op operation.Operation, fldPath *field.Pa return nil } // call field-attached validations + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03.PT, ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03.PT, no flags")...) @@ -338,12 +378,16 @@ func Validate_T03(ctx context.Context, op operation.Operation, fldPath *field.Pa // Validate_TMultiple validates an instance of TMultiple according // to declarative validation rules in the API schema. func Validate_TMultiple(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *TMultiple) (errs field.ErrorList) { + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple, ShortCircuit 1"); len(e) != 0 { errs = append(errs, e...) - return // do not proceed + earlyReturn = true } if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple, ShortCircuit 2"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple, no flags 1")...) @@ -360,12 +404,16 @@ func Validate_TMultiple(ctx context.Context, op operation.Operation, fldPath *fi return nil } // call field-attached validations + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.S, ShortCircuit 1"); len(e) != 0 { errs = append(errs, e...) - return // do not proceed + earlyReturn = true } if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.S, ShortCircuit 2"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.S, no flags 1")...) @@ -382,12 +430,16 @@ func Validate_TMultiple(ctx context.Context, op operation.Operation, fldPath *fi return nil } // call field-attached validations + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.PS, ShortCircuit 1"); len(e) != 0 { errs = append(errs, e...) - return // do not proceed + earlyReturn = true } if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.PS, ShortCircuit 2"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.PS, no flags 1")...) @@ -404,12 +456,16 @@ func Validate_TMultiple(ctx context.Context, op operation.Operation, fldPath *fi return nil } // call field-attached validations + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.T, ShortCircuit 1"); len(e) != 0 { errs = append(errs, e...) - return // do not proceed + earlyReturn = true } if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.T, ShortCircuit 2"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.T, no flags 1")...) @@ -428,12 +484,16 @@ func Validate_TMultiple(ctx context.Context, op operation.Operation, fldPath *fi return nil } // call field-attached validations + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.PT, ShortCircuit 1"); len(e) != 0 { errs = append(errs, e...) - return // do not proceed + earlyReturn = true } if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.PT, ShortCircuit 2"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.PT, no flags 1")...) diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/typedefs/testdata/validate-false.json b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/typedefs/testdata/validate-false.json index f1a61e10fa8..eb000238a30 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/typedefs/testdata/validate-false.json +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/typedefs/testdata/validate-false.json @@ -16,7 +16,8 @@ }, "*typedefs.EMultiple": { "": [ - "EMultiple, ShortCircuit 1" + "EMultiple, ShortCircuit 1", + "EMultiple, ShortCircuit 2" ] } } \ No newline at end of file diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/typedefs/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/typedefs/zz_generated.validations.go index ebc53166688..a0df0df4593 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/typedefs/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ordering/typedefs/zz_generated.validations.go @@ -83,8 +83,12 @@ func Validate_E01(ctx context.Context, op operation.Operation, fldPath *field.Pa // Validate_E02 validates an instance of E02 according // to declarative validation rules in the API schema. func Validate_E02(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *E02) (errs field.ErrorList) { + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "E02, ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } @@ -94,8 +98,12 @@ func Validate_E02(ctx context.Context, op operation.Operation, fldPath *field.Pa // Validate_E03 validates an instance of E03 according // to declarative validation rules in the API schema. func Validate_E03(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *E03) (errs field.ErrorList) { + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "E03, ShortCircuit"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "E03, no flags")...) @@ -106,12 +114,16 @@ func Validate_E03(ctx context.Context, op operation.Operation, fldPath *field.Pa // Validate_EMultiple validates an instance of EMultiple according // to declarative validation rules in the API schema. func Validate_EMultiple(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *EMultiple) (errs field.ErrorList) { + earlyReturn := false if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "EMultiple, ShortCircuit 1"); len(e) != 0 { errs = append(errs, e...) - return // do not proceed + earlyReturn = true } if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "EMultiple, ShortCircuit 2"); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "EMultiple, no flags 1")...) diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ratcheting/default_behavior/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ratcheting/default_behavior/zz_generated.validations.go index 3c4040dc05c..9dff33bad34 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ratcheting/default_behavior/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/ratcheting/default_behavior/zz_generated.validations.go @@ -362,7 +362,11 @@ func Validate_StructPrimitive(ctx context.Context, op operation.Operation, fldPa return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field intPtrField")...) diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/recursive/pointers/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/recursive/pointers/zz_generated.validations.go index 926ad141534..11ae1f078ae 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/recursive/pointers/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/recursive/pointers/zz_generated.validations.go @@ -76,7 +76,11 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } // call the type's validation function @@ -104,7 +108,11 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } // call the type's validation function @@ -126,7 +134,11 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } // call the type's validation function @@ -142,7 +154,11 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } // call the type's validation function @@ -158,7 +174,11 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } // call the type's validation function diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/forbidden/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/forbidden/zz_generated.validations.go new file mode 100644 index 00000000000..9c3e87662dd --- /dev/null +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/forbidden/zz_generated.validations.go @@ -0,0 +1,411 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by validation-gen. DO NOT EDIT. + +package forbidden + +import ( + context "context" + fmt "fmt" + + equality "k8s.io/apimachinery/pkg/api/equality" + operation "k8s.io/apimachinery/pkg/api/operation" + safe "k8s.io/apimachinery/pkg/api/safe" + validate "k8s.io/apimachinery/pkg/api/validate" + field "k8s.io/apimachinery/pkg/util/validation/field" + testscheme "k8s.io/code-generator/cmd/validation-gen/testscheme" +) + +func init() { localSchemeBuilder.Register(RegisterValidations) } + +// RegisterValidations adds validation functions to the given scheme. +// Public to allow building arbitrary schemes. +func RegisterValidations(scheme *testscheme.Scheme) error { + // type Struct + scheme.AddValidationFunc((*Struct)(nil), func(ctx context.Context, op operation.Operation, obj, oldObj interface{}) field.ErrorList { + switch op.Request.SubresourcePath() { + case "/": + return Validate_Struct(ctx, op, nil /* fldPath */, obj.(*Struct), safe.Cast[*Struct](oldObj)) + } + return field.ErrorList{field.InternalError(nil, fmt.Errorf("no validation found for %T, subresource: %v", obj, op.Request.SubresourcePath()))} + }) + return nil +} + +// Validate_IntType validates an instance of IntType according +// to declarative validation rules in the API schema. +func Validate_IntType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *IntType) (errs field.ErrorList) { + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type IntType")...) + + return errs +} + +// Validate_MapType validates an instance of MapType according +// to declarative validation rules in the API schema. +func Validate_MapType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj MapType) (errs field.ErrorList) { + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type MapType")...) + + return errs +} + +// Validate_OtherStruct validates an instance of OtherStruct according +// to declarative validation rules in the API schema. +func Validate_OtherStruct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) { + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type OtherStruct")...) + + return errs +} + +// Validate_SliceType validates an instance of SliceType according +// to declarative validation rules in the API schema. +func Validate_SliceType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj SliceType) (errs field.ErrorList) { + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type SliceType")...) + + return errs +} + +// Validate_StringType validates an instance of StringType according +// to declarative validation rules in the API schema. +func Validate_StringType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) { + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type StringType")...) + + return errs +} + +// Validate_Struct validates an instance of Struct according +// to declarative validation rules in the API schema. +func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) { + // field Struct.TypeMeta has no validation + + // field Struct.StringField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.ForbiddenValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StringField")...) + return + }(fldPath.Child("stringField"), &obj.StringField, safe.Field(oldObj, func(oldObj *Struct) *string { return &oldObj.StringField }))...) + + // field Struct.StringPtrField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.ForbiddenPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StringPtrField")...) + return + }(fldPath.Child("stringPtrField"), obj.StringPtrField, safe.Field(oldObj, func(oldObj *Struct) *string { return oldObj.StringPtrField }))...) + + // field Struct.StringTypedefField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.ForbiddenValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StringTypedefField")...) + // call the type's validation function + errs = append(errs, Validate_StringType(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("stringTypedefField"), &obj.StringTypedefField, safe.Field(oldObj, func(oldObj *Struct) *StringType { return &oldObj.StringTypedefField }))...) + + // field Struct.StringTypedefPtrField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.ForbiddenPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StringTypedefPtrField")...) + // call the type's validation function + errs = append(errs, Validate_StringType(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("stringTypedefPtrField"), obj.StringTypedefPtrField, safe.Field(oldObj, func(oldObj *Struct) *StringType { return oldObj.StringTypedefPtrField }))...) + + // field Struct.IntField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.ForbiddenValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.IntField")...) + return + }(fldPath.Child("intField"), &obj.IntField, safe.Field(oldObj, func(oldObj *Struct) *int { return &oldObj.IntField }))...) + + // field Struct.IntPtrField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.ForbiddenPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.IntPtrField")...) + return + }(fldPath.Child("intPtrField"), obj.IntPtrField, safe.Field(oldObj, func(oldObj *Struct) *int { return oldObj.IntPtrField }))...) + + // field Struct.IntTypedefField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *IntType) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.ForbiddenValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.IntTypedefField")...) + // call the type's validation function + errs = append(errs, Validate_IntType(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("intTypedefField"), &obj.IntTypedefField, safe.Field(oldObj, func(oldObj *Struct) *IntType { return &oldObj.IntTypedefField }))...) + + // field Struct.IntTypedefPtrField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *IntType) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.ForbiddenPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.IntTypedefPtrField")...) + // call the type's validation function + errs = append(errs, Validate_IntType(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("intTypedefPtrField"), obj.IntTypedefPtrField, safe.Field(oldObj, func(oldObj *Struct) *IntType { return oldObj.IntTypedefPtrField }))...) + + // field Struct.OtherStructPtrField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.ForbiddenPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.OtherStructPtrField")...) + // call the type's validation function + errs = append(errs, Validate_OtherStruct(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("otherStructPtrField"), obj.OtherStructPtrField, safe.Field(oldObj, func(oldObj *Struct) *OtherStruct { return oldObj.OtherStructPtrField }))...) + + // field Struct.SliceField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj []string) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.ForbiddenSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if e := validate.OptionalSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.SliceField")...) + return + }(fldPath.Child("sliceField"), obj.SliceField, safe.Field(oldObj, func(oldObj *Struct) []string { return oldObj.SliceField }))...) + + // field Struct.SliceTypedefField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj SliceType) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.ForbiddenSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if e := validate.OptionalSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.SliceTypedefField")...) + // call the type's validation function + errs = append(errs, Validate_SliceType(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("sliceTypedefField"), obj.SliceTypedefField, safe.Field(oldObj, func(oldObj *Struct) SliceType { return oldObj.SliceTypedefField }))...) + + // field Struct.MapField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj map[string]string) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.ForbiddenMap(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if e := validate.OptionalMap(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField")...) + return + }(fldPath.Child("mapField"), obj.MapField, safe.Field(oldObj, func(oldObj *Struct) map[string]string { return oldObj.MapField }))...) + + // field Struct.MapTypedefField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj MapType) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.ForbiddenMap(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if e := validate.OptionalMap(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypedefField")...) + // call the type's validation function + errs = append(errs, Validate_MapType(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("mapTypedefField"), obj.MapTypedefField, safe.Field(oldObj, func(oldObj *Struct) MapType { return oldObj.MapTypedefField }))...) + + return errs +} diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/immutable/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/immutable/zz_generated.validations.go index 1acca1831f4..d2dab99baf7 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/immutable/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/immutable/zz_generated.validations.go @@ -52,8 +52,17 @@ func RegisterValidations(scheme *testscheme.Scheme) error { // Validate_ImmutableType validates an instance of ImmutableType according // to declarative validation rules in the API schema. func Validate_ImmutableType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *ImmutableType) (errs field.ErrorList) { +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } @@ -73,8 +82,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -88,8 +106,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -103,8 +130,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByReflect(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -118,8 +154,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByReflect(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -133,8 +178,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByReflect(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -148,8 +202,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByReflect(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -163,8 +226,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByReflect(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -178,8 +250,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByReflect(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/immutable_transitions/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/immutable_transitions/zz_generated.validations.go index c385d2efede..5aa56449093 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/immutable_transitions/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/immutable_transitions/zz_generated.validations.go @@ -65,16 +65,36 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field // lists with map semantics require unique keys errs = append(errs, validate.Unique(ctx, op, fldPath, obj, oldObj, func(a Item, b Item) bool { return a.Key1 == b.Key1 })...) func() { // cohort {"key1": "a"} +<<<<<<< HEAD if e := validate.SliceItem(ctx, op, fldPath, obj, oldObj, func(item *Item) bool { return item.Key1 == "a" }, validate.DirectEqual, validate.Immutable); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.SliceItem(ctx, op, fldPath, obj, oldObj, func(item *Item) bool { return item.Key1 == "a" }, validate.DirectEqual, validate.ImmutableByCompare); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } }() func() { // cohort {"key1": "b"} +<<<<<<< HEAD if e := validate.SliceItem(ctx, op, fldPath, obj, oldObj, func(item *Item) bool { return item.Key1 == "b" }, validate.DirectEqual, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Item) field.ErrorList { return validate.Subfield(ctx, op, fldPath, obj, oldObj, "stringField", func(o *Item) *string { return &o.StringField }, validate.DirectEqualPtr, validate.Immutable) }); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.SliceItem(ctx, op, fldPath, obj, oldObj, func(item *Item) bool { return item.Key1 == "b" }, validate.DirectEqual, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Item) field.ErrorList { + return validate.Subfield(ctx, op, fldPath, obj, oldObj, "stringField", func(o *Item) *string { return &o.StringField }, validate.DirectEqualPtr, validate.ImmutableByCompare) + }); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } }() diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/typedef/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/typedef/zz_generated.validations.go index 98b38b37558..ab7564da21c 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/typedef/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/typedef/zz_generated.validations.go @@ -83,8 +83,17 @@ func Validate_ItemList(ctx context.Context, op operation.Operation, fldPath *fie // lists with map semantics require unique keys errs = append(errs, validate.Unique(ctx, op, fldPath, obj, oldObj, func(a Item, b Item) bool { return a.Key == b.Key })...) func() { // cohort {"key": "immutable"} +<<<<<<< HEAD if e := validate.SliceItem(ctx, op, fldPath, obj, oldObj, func(item *Item) bool { return item.Key == "immutable" }, validate.DirectEqual, validate.Immutable); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.SliceItem(ctx, op, fldPath, obj, oldObj, func(item *Item) bool { return item.Key == "immutable" }, validate.DirectEqual, validate.ImmutableByCompare); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } }() diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/listmap/multiple_keys/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/listmap/multiple_keys/zz_generated.validations.go index 648aff61e06..37944357d4e 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/listmap/multiple_keys/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/listmap/multiple_keys/zz_generated.validations.go @@ -73,6 +73,7 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool { return a.Key1Field == b.Key1Field && a.Key2Field == b.Key2Field }, validate.DirectEqual, validate.Immutable); len(e) != 0 { @@ -83,6 +84,18 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field errs = append(errs, validate.Unique(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool { return a.Key1Field == b.Key1Field && a.Key2Field == b.Key2Field })...) +======= + earlyReturn := false + if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool { + return a.Key1Field == b.Key1Field && a.Key2Field == b.Key2Field + }, validate.DirectEqual, validate.ImmutableByCompare); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return }(fldPath.Child("listField"), obj.ListField, safe.Field(oldObj, func(oldObj *Struct) []OtherStruct { return oldObj.ListField }))...) @@ -94,6 +107,7 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherTypedefStruct, b OtherTypedefStruct) bool { return a.Key1Field == b.Key1Field && a.Key2Field == b.Key2Field }, validate.DirectEqual, validate.Immutable); len(e) != 0 { @@ -104,6 +118,18 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field errs = append(errs, validate.Unique(ctx, op, fldPath, obj, oldObj, func(a OtherTypedefStruct, b OtherTypedefStruct) bool { return a.Key1Field == b.Key1Field && a.Key2Field == b.Key2Field })...) +======= + earlyReturn := false + if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherTypedefStruct, b OtherTypedefStruct) bool { + return a.Key1Field == b.Key1Field && a.Key2Field == b.Key2Field + }, validate.DirectEqual, validate.ImmutableByCompare); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return }(fldPath.Child("listTypedefField"), obj.ListTypedefField, safe.Field(oldObj, func(oldObj *Struct) []OtherTypedefStruct { return oldObj.ListTypedefField }))...) @@ -115,6 +141,7 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool { return a.Key1Field == b.Key1Field && a.Key2Field == b.Key2Field }, validate.DirectEqual, validate.Immutable); len(e) != 0 { @@ -123,6 +150,18 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field } // call the type's validation function errs = append(errs, Validate_ListType(ctx, op, fldPath, obj, oldObj)...) +======= + earlyReturn := false + if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool { + return a.Key1Field == b.Key1Field && a.Key2Field == b.Key2Field + }, validate.DirectEqual, validate.ImmutableByCompare); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return }(fldPath.Child("typedefField"), obj.TypedefField, safe.Field(oldObj, func(oldObj *Struct) ListType { return oldObj.TypedefField }))...) diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/listmap/single_key/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/listmap/single_key/zz_generated.validations.go index 172c1667f5a..636a9ee3ffc 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/listmap/single_key/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/listmap/single_key/zz_generated.validations.go @@ -71,12 +71,23 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool { return a.KeyField == b.KeyField }, validate.DirectEqual, validate.Immutable); len(e) != 0 { errs = append(errs, e...) return // do not proceed } // lists with map semantics require unique keys errs = append(errs, validate.Unique(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool { return a.KeyField == b.KeyField })...) +======= + earlyReturn := false + if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool { return a.KeyField == b.KeyField }, validate.DirectEqual, validate.ImmutableByCompare); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return }(fldPath.Child("listField"), obj.ListField, safe.Field(oldObj, func(oldObj *Struct) []OtherStruct { return oldObj.ListField }))...) @@ -88,12 +99,23 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherTypedefStruct, b OtherTypedefStruct) bool { return a.KeyField == b.KeyField }, validate.DirectEqual, validate.Immutable); len(e) != 0 { errs = append(errs, e...) return // do not proceed } // lists with map semantics require unique keys errs = append(errs, validate.Unique(ctx, op, fldPath, obj, oldObj, func(a OtherTypedefStruct, b OtherTypedefStruct) bool { return a.KeyField == b.KeyField })...) +======= + earlyReturn := false + if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherTypedefStruct, b OtherTypedefStruct) bool { return a.KeyField == b.KeyField }, validate.DirectEqual, validate.ImmutableByCompare); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return }(fldPath.Child("listTypedefField"), obj.ListTypedefField, safe.Field(oldObj, func(oldObj *Struct) []OtherTypedefStruct { return oldObj.ListTypedefField }))...) @@ -105,12 +127,23 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool { return a.KeyField == b.KeyField }, validate.DirectEqual, validate.Immutable); len(e) != 0 { errs = append(errs, e...) return // do not proceed } // call the type's validation function errs = append(errs, Validate_ListType(ctx, op, fldPath, obj, oldObj)...) +======= + earlyReturn := false + if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool { return a.KeyField == b.KeyField }, validate.DirectEqual, validate.ImmutableByCompare); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return }(fldPath.Child("typedefField"), obj.TypedefField, safe.Field(oldObj, func(oldObj *Struct) ListType { return oldObj.TypedefField }))...) diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/listset/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/listset/zz_generated.validations.go index dc360fc7ce5..9f0aedfcadf 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/listset/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/listset/zz_generated.validations.go @@ -70,8 +70,17 @@ func Validate_ImmutableStruct(ctx context.Context, op operation.Operation, fldPa return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, nil, validate.Immutable); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, nil, validate.ImmutableByCompare); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -85,8 +94,17 @@ func Validate_ImmutableStruct(ctx context.Context, op operation.Operation, fldPa return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, validate.DirectEqual, nil, validate.Immutable); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, validate.DirectEqual, nil, validate.ImmutableByCompare); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } // lists with set semantics require unique values @@ -102,8 +120,17 @@ func Validate_ImmutableStruct(ctx context.Context, op operation.Operation, fldPa return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, nil, validate.Immutable); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, nil, validate.ImmutableByReflect); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -117,8 +144,17 @@ func Validate_ImmutableStruct(ctx context.Context, op operation.Operation, fldPa return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, validate.SemanticDeepEqual, nil, validate.Immutable); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, validate.SemanticDeepEqual, nil, validate.ImmutableByReflect); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } // lists with set semantics require unique values @@ -134,8 +170,17 @@ func Validate_ImmutableStruct(ctx context.Context, op operation.Operation, fldPa return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, nil, validate.Immutable); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, nil, validate.ImmutableByCompare); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -149,8 +194,17 @@ func Validate_ImmutableStruct(ctx context.Context, op operation.Operation, fldPa return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, validate.DirectEqual, nil, validate.Immutable); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, validate.DirectEqual, nil, validate.ImmutableByCompare); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } // lists with set semantics require unique values @@ -166,8 +220,17 @@ func Validate_ImmutableStruct(ctx context.Context, op operation.Operation, fldPa return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, validate.SemanticDeepEqual, nil, validate.Immutable); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, validate.SemanticDeepEqual, nil, validate.ImmutableByReflect); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } // lists with set semantics require unique values diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/maxitems/slice_of_primitive/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/maxitems/slice_of_primitive/zz_generated.validations.go index ce37adfcf9c..84c26a90c24 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/maxitems/slice_of_primitive/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/maxitems/slice_of_primitive/zz_generated.validations.go @@ -62,8 +62,12 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.MaxItems(ctx, op, fldPath, obj, oldObj, 0); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -77,8 +81,12 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.MaxItems(ctx, op, fldPath, obj, oldObj, 10); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -92,8 +100,12 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.MaxItems(ctx, op, fldPath, obj, oldObj, 0); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -107,8 +119,12 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.MaxItems(ctx, op, fldPath, obj, oldObj, 10); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/maxitems/slice_of_struct/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/maxitems/slice_of_struct/zz_generated.validations.go index 710523f9105..8e4fe3160a9 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/maxitems/slice_of_struct/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/maxitems/slice_of_struct/zz_generated.validations.go @@ -62,8 +62,12 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.MaxItems(ctx, op, fldPath, obj, oldObj, 0); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -77,8 +81,12 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.MaxItems(ctx, op, fldPath, obj, oldObj, 10); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -92,8 +100,12 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.MaxItems(ctx, op, fldPath, obj, oldObj, 0); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -107,8 +119,12 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.MaxItems(ctx, op, fldPath, obj, oldObj, 10); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/maxitems/typedef_to_slice/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/maxitems/typedef_to_slice/zz_generated.validations.go index 58e49c7d2db..3627bfccfca 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/maxitems/typedef_to_slice/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/maxitems/typedef_to_slice/zz_generated.validations.go @@ -52,8 +52,12 @@ func RegisterValidations(scheme *testscheme.Scheme) error { // Validate_Max0Type validates an instance of Max0Type according // to declarative validation rules in the API schema. func Validate_Max0Type(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj Max0Type) (errs field.ErrorList) { + earlyReturn := false if e := validate.MaxItems(ctx, op, fldPath, obj, oldObj, 0); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } @@ -63,8 +67,12 @@ func Validate_Max0Type(ctx context.Context, op operation.Operation, fldPath *fie // Validate_Max0TypedefType validates an instance of Max0TypedefType according // to declarative validation rules in the API schema. func Validate_Max0TypedefType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj Max0TypedefType) (errs field.ErrorList) { + earlyReturn := false if e := validate.MaxItems(ctx, op, fldPath, obj, oldObj, 0); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } @@ -74,8 +82,12 @@ func Validate_Max0TypedefType(ctx context.Context, op operation.Operation, fldPa // Validate_Max10Type validates an instance of Max10Type according // to declarative validation rules in the API schema. func Validate_Max10Type(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj Max10Type) (errs field.ErrorList) { + earlyReturn := false if e := validate.MaxItems(ctx, op, fldPath, obj, oldObj, 10); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } @@ -85,8 +97,12 @@ func Validate_Max10Type(ctx context.Context, op operation.Operation, fldPath *fi // Validate_Max10TypedefType validates an instance of Max10TypedefType according // to declarative validation rules in the API schema. func Validate_Max10TypedefType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj Max10TypedefType) (errs field.ErrorList) { + earlyReturn := false if e := validate.MaxItems(ctx, op, fldPath, obj, oldObj, 10); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/neq/neq/neqchained/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/neq/neq/neqchained/zz_generated.validations.go index 0ca7575be41..00233c54749 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/neq/neq/neqchained/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/neq/neq/neqchained/zz_generated.validations.go @@ -78,7 +78,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } func() { // cohort stringField diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/opaque/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/opaque/zz_generated.validations.go index 102652ad48a..61cb27de7a4 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/opaque/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/opaque/zz_generated.validations.go @@ -136,8 +136,12 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StructPtrField")...) @@ -166,8 +170,12 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.OpaqueStructPtrField")...) diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/optional/nonzero_defaults/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/optional/nonzero_defaults/zz_generated.validations.go index d92ff042136..2c4d96163e0 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/optional/nonzero_defaults/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/optional/nonzero_defaults/zz_generated.validations.go @@ -61,9 +61,13 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false // optional fields with default values are effectively required if e := validate.RequiredValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -77,9 +81,13 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false // optional fields with default values are effectively required if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -93,9 +101,13 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false // optional fields with default values are effectively required if e := validate.RequiredValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -109,9 +121,13 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false // optional fields with default values are effectively required if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -125,9 +141,13 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false // optional fields with default values are effectively required if e := validate.RequiredValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -141,9 +161,13 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false // optional fields with default values are effectively required if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/optional/zero_defaults/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/optional/zero_defaults/zz_generated.validations.go index 573e76369aa..a00efc2f28a 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/optional/zero_defaults/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/optional/zero_defaults/zz_generated.validations.go @@ -68,9 +68,13 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false // optional fields with default values are effectively required if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -91,9 +95,13 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false // optional fields with default values are effectively required if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -114,9 +122,13 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false // optional fields with default values are effectively required if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/optional/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/optional/zz_generated.validations.go index 678093949fb..07d63e0be5e 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/optional/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/optional/zz_generated.validations.go @@ -102,7 +102,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StringField")...) @@ -117,7 +121,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StringPtrField")...) @@ -132,7 +140,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StringTypedefField")...) @@ -149,7 +161,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StringTypedefPtrField")...) @@ -166,7 +182,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.IntField")...) @@ -181,7 +201,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.IntPtrField")...) @@ -196,7 +220,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.IntTypedefField")...) @@ -213,7 +241,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.IntTypedefPtrField")...) @@ -230,7 +262,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.OtherStructPtrField")...) @@ -247,7 +283,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.SliceField")...) @@ -262,7 +302,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.SliceTypedefField")...) @@ -279,7 +323,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalMap(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField")...) @@ -294,7 +342,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalMap(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypedefField")...) diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/required/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/required/zz_generated.validations.go new file mode 100644 index 00000000000..5d57d3e7278 --- /dev/null +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/required/zz_generated.validations.go @@ -0,0 +1,372 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by validation-gen. DO NOT EDIT. + +package required + +import ( + context "context" + fmt "fmt" + + equality "k8s.io/apimachinery/pkg/api/equality" + operation "k8s.io/apimachinery/pkg/api/operation" + safe "k8s.io/apimachinery/pkg/api/safe" + validate "k8s.io/apimachinery/pkg/api/validate" + field "k8s.io/apimachinery/pkg/util/validation/field" + testscheme "k8s.io/code-generator/cmd/validation-gen/testscheme" +) + +func init() { localSchemeBuilder.Register(RegisterValidations) } + +// RegisterValidations adds validation functions to the given scheme. +// Public to allow building arbitrary schemes. +func RegisterValidations(scheme *testscheme.Scheme) error { + // type Struct + scheme.AddValidationFunc((*Struct)(nil), func(ctx context.Context, op operation.Operation, obj, oldObj interface{}) field.ErrorList { + switch op.Request.SubresourcePath() { + case "/": + return Validate_Struct(ctx, op, nil /* fldPath */, obj.(*Struct), safe.Cast[*Struct](oldObj)) + } + return field.ErrorList{field.InternalError(nil, fmt.Errorf("no validation found for %T, subresource: %v", obj, op.Request.SubresourcePath()))} + }) + return nil +} + +// Validate_IntType validates an instance of IntType according +// to declarative validation rules in the API schema. +func Validate_IntType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *IntType) (errs field.ErrorList) { + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type IntType")...) + + return errs +} + +// Validate_MapType validates an instance of MapType according +// to declarative validation rules in the API schema. +func Validate_MapType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj MapType) (errs field.ErrorList) { + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type MapType")...) + + return errs +} + +// Validate_OtherStruct validates an instance of OtherStruct according +// to declarative validation rules in the API schema. +func Validate_OtherStruct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) { + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type OtherStruct")...) + + return errs +} + +// Validate_SliceType validates an instance of SliceType according +// to declarative validation rules in the API schema. +func Validate_SliceType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj SliceType) (errs field.ErrorList) { + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type SliceType")...) + + return errs +} + +// Validate_StringType validates an instance of StringType according +// to declarative validation rules in the API schema. +func Validate_StringType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) { + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type StringType")...) + + return errs +} + +// Validate_Struct validates an instance of Struct according +// to declarative validation rules in the API schema. +func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) { + // field Struct.TypeMeta has no validation + + // field Struct.StringField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.RequiredValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StringField")...) + return + }(fldPath.Child("stringField"), &obj.StringField, safe.Field(oldObj, func(oldObj *Struct) *string { return &oldObj.StringField }))...) + + // field Struct.StringPtrField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StringPtrField")...) + return + }(fldPath.Child("stringPtrField"), obj.StringPtrField, safe.Field(oldObj, func(oldObj *Struct) *string { return oldObj.StringPtrField }))...) + + // field Struct.StringTypedefField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.RequiredValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StringTypedefField")...) + // call the type's validation function + errs = append(errs, Validate_StringType(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("stringTypedefField"), &obj.StringTypedefField, safe.Field(oldObj, func(oldObj *Struct) *StringType { return &oldObj.StringTypedefField }))...) + + // field Struct.StringTypedefPtrField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StringTypedefPtrField")...) + // call the type's validation function + errs = append(errs, Validate_StringType(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("stringTypedefPtrField"), obj.StringTypedefPtrField, safe.Field(oldObj, func(oldObj *Struct) *StringType { return oldObj.StringTypedefPtrField }))...) + + // field Struct.IntField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.RequiredValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.IntField")...) + return + }(fldPath.Child("intField"), &obj.IntField, safe.Field(oldObj, func(oldObj *Struct) *int { return &oldObj.IntField }))...) + + // field Struct.IntPtrField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.IntPtrField")...) + return + }(fldPath.Child("intPtrField"), obj.IntPtrField, safe.Field(oldObj, func(oldObj *Struct) *int { return oldObj.IntPtrField }))...) + + // field Struct.IntTypedefField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *IntType) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.RequiredValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.IntTypedefField")...) + // call the type's validation function + errs = append(errs, Validate_IntType(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("intTypedefField"), &obj.IntTypedefField, safe.Field(oldObj, func(oldObj *Struct) *IntType { return &oldObj.IntTypedefField }))...) + + // field Struct.IntTypedefPtrField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *IntType) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.IntTypedefPtrField")...) + // call the type's validation function + errs = append(errs, Validate_IntType(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("intTypedefPtrField"), obj.IntTypedefPtrField, safe.Field(oldObj, func(oldObj *Struct) *IntType { return oldObj.IntTypedefPtrField }))...) + + // field Struct.OtherStructPtrField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.OtherStructPtrField")...) + // call the type's validation function + errs = append(errs, Validate_OtherStruct(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("otherStructPtrField"), obj.OtherStructPtrField, safe.Field(oldObj, func(oldObj *Struct) *OtherStruct { return oldObj.OtherStructPtrField }))...) + + // field Struct.SliceField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj []string) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.RequiredSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.SliceField")...) + return + }(fldPath.Child("sliceField"), obj.SliceField, safe.Field(oldObj, func(oldObj *Struct) []string { return oldObj.SliceField }))...) + + // field Struct.SliceTypedefField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj SliceType) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.RequiredSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.SliceTypedefField")...) + // call the type's validation function + errs = append(errs, Validate_SliceType(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("sliceTypedefField"), obj.SliceTypedefField, safe.Field(oldObj, func(oldObj *Struct) SliceType { return oldObj.SliceTypedefField }))...) + + // field Struct.MapField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj map[string]string) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.RequiredMap(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField")...) + return + }(fldPath.Child("mapField"), obj.MapField, safe.Field(oldObj, func(oldObj *Struct) map[string]string { return oldObj.MapField }))...) + + // field Struct.MapTypedefField + errs = append(errs, + func(fldPath *field.Path, obj, oldObj MapType) (errs field.ErrorList) { + // don't revalidate unchanged data + if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) { + return nil + } + // call field-attached validations + earlyReturn := false + if e := validate.RequiredMap(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { + return // do not proceed + } + errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypedefField")...) + // call the type's validation function + errs = append(errs, Validate_MapType(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("mapTypedefField"), obj.MapTypedefField, safe.Field(oldObj, func(oldObj *Struct) MapType { return oldObj.MapTypedefField }))...) + + return errs +} diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/custom_members/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/custom_members/zz_generated.validations.go index 006aa02ba9f..80fcc259e7c 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/custom_members/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/custom_members/zz_generated.validations.go @@ -81,7 +81,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -95,7 +99,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/multiple/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/multiple/zz_generated.validations.go index d37946a9aa6..d0f97c87e14 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/multiple/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/multiple/zz_generated.validations.go @@ -98,7 +98,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -112,7 +116,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -128,7 +136,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -142,7 +154,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/simple/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/simple/zz_generated.validations.go index b6f2564afd0..0ac6d21c5be 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/simple/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/simple/zz_generated.validations.go @@ -81,7 +81,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -95,7 +99,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/sparse/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/sparse/zz_generated.validations.go index 996f51c695d..feba6af707f 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/sparse/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/discriminated/sparse/zz_generated.validations.go @@ -76,7 +76,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/undiscriminated/custom_members/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/undiscriminated/custom_members/zz_generated.validations.go index de9594d7619..66fe6c162eb 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/undiscriminated/custom_members/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/undiscriminated/custom_members/zz_generated.validations.go @@ -76,7 +76,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -90,7 +94,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/undiscriminated/multiple/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/undiscriminated/multiple/zz_generated.validations.go index d6223bb01e1..325d81374d1 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/undiscriminated/multiple/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/undiscriminated/multiple/zz_generated.validations.go @@ -88,7 +88,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -102,7 +106,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -116,7 +124,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -130,7 +142,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/undiscriminated/simple/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/undiscriminated/simple/zz_generated.validations.go index 1b2ccf813ee..33e5604f893 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/undiscriminated/simple/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/union/union/undiscriminated/simple/zz_generated.validations.go @@ -87,7 +87,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -101,7 +105,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -115,7 +123,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -129,7 +141,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/zerooroneof/zerooroneof/custom_members/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/zerooroneof/zerooroneof/custom_members/zz_generated.validations.go index f0beae0ea72..3f54080a684 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/zerooroneof/zerooroneof/custom_members/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/zerooroneof/zerooroneof/custom_members/zz_generated.validations.go @@ -76,7 +76,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -90,7 +94,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/zerooroneof/zerooroneof/multiple/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/zerooroneof/zerooroneof/multiple/zz_generated.validations.go index aa5eec2466d..02c4cfc4ed6 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/zerooroneof/zerooroneof/multiple/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/zerooroneof/zerooroneof/multiple/zz_generated.validations.go @@ -88,7 +88,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -102,7 +106,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -116,7 +124,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -130,7 +142,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/zerooroneof/zerooroneof/simple/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/zerooroneof/zerooroneof/simple/zz_generated.validations.go index df982abb916..cf12726d75b 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/zerooroneof/zerooroneof/simple/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/zerooroneof/zerooroneof/simple/zz_generated.validations.go @@ -87,7 +87,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -101,7 +105,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -115,7 +123,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return @@ -129,7 +141,11 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations + earlyReturn := false if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + earlyReturn = true + } + if earlyReturn { return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/update_validations/primitive_pointers/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/update_validations/primitive_pointers/zz_generated.validations.go index 0466acb84fb..8e960cda10d 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/update_validations/primitive_pointers/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/update_validations/primitive_pointers/zz_generated.validations.go @@ -59,8 +59,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -74,8 +83,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -89,8 +107,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -104,8 +131,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/update_validations/primitives/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/update_validations/primitives/zz_generated.validations.go index 531fe8b9af2..c41fba02fae 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/update_validations/primitives/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/update_validations/primitives/zz_generated.validations.go @@ -59,8 +59,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -74,8 +83,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -89,8 +107,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return @@ -104,8 +131,17 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field return nil } // call field-attached validations +<<<<<<< HEAD if e := validate.Immutable(ctx, op, fldPath, obj, oldObj); len(e) != 0 { errs = append(errs, e...) +======= + earlyReturn := false + if e := validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } + if earlyReturn { +>>>>>>> 9178eebc0a2 (feat: make it so that all ShortCircuit validators are run for short circuiting check) return // do not proceed } return diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/validation.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/validation.go index 2d47bf2c2eb..ee3e3cda3b7 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/validation.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/validation.go @@ -1288,7 +1288,21 @@ func emitCallsToValidators(c *generator.Context, validations []validators.Functi if cohortName != "" { sw.Do("func() { // cohort $.$\n", cohortName) } - for _, v := range validations { + + hasShortCircuits := false + lastShortCircuitIdx := -1 + for i, v := range validations { + if v.Flags.IsSet(validators.ShortCircuit) { + hasShortCircuits = true + lastShortCircuitIdx = i + } + } + + if hasShortCircuits { + sw.Do("earlyReturn := false\n", nil) + } + + for i, v := range validations { isShortCircuit := v.Flags.IsSet(validators.ShortCircuit) isNonError := v.Flags.IsSet(validators.NonError) @@ -1353,10 +1367,17 @@ func emitCallsToValidators(c *generator.Context, validations []validators.Functi emitCall() sw.Do("; len(e) != 0 {\n", nil) if !isNonError { - sw.Do("errs = append(errs, e...)\n", nil) + sw.Do(" errs = append(errs, e...)\n", nil) } - sw.Do(" return // do not proceed\n", nil) + sw.Do(" earlyReturn = true\n", nil) sw.Do("}\n", nil) + + // Check for early return ONLY after the LAST short-circuit + if hasShortCircuits && i == lastShortCircuitIdx { + sw.Do("if earlyReturn {\n", nil) + sw.Do(" return // do not proceed\n", nil) + sw.Do("}\n", nil) + } } else { if isNonError { emitCall() diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/validators.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/validators.go index a9f488259cf..7737de49339 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/validators.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/validators/validators.go @@ -399,7 +399,9 @@ const ( DefaultFlags FunctionFlags = 0 // ShortCircuit indicates that further validations should be skipped if - // this validator fails. Most validators are not fatal. + // this validator fails. If there are multiple validators with this flag + // set, they will ALL run, and if any of them fail, any non-short-circuit + // validators will be skipped. Most validators are not fatal. ShortCircuit FunctionFlags = 1 << iota // NonError indicates that a failure of this validator should not be