1
16
17 package schema
18
19 import (
20 "fmt"
21
22 "k8s.io/apimachinery/pkg/util/validation/field"
23 )
24
25
26
27 func validateStructuralCompleteness(s *Structural, fldPath *field.Path) field.ErrorList {
28 if s == nil {
29 return nil
30 }
31
32 return validateValueValidationCompleteness(s.ValueValidation, s, fldPath, fldPath)
33 }
34
35 func validateValueValidationCompleteness(v *ValueValidation, s *Structural, sPath, vPath *field.Path) field.ErrorList {
36 if v == nil {
37 return nil
38 }
39 if s == nil {
40 return field.ErrorList{field.Required(sPath, fmt.Sprintf("because it is defined in %s", vPath.String()))}
41 }
42
43 allErrs := field.ErrorList{}
44
45 allErrs = append(allErrs, validateNestedValueValidationCompleteness(v.Not, s, sPath, vPath.Child("not"))...)
46 for i := range v.AllOf {
47 allErrs = append(allErrs, validateNestedValueValidationCompleteness(&v.AllOf[i], s, sPath, vPath.Child("allOf").Index(i))...)
48 }
49 for i := range v.AnyOf {
50 allErrs = append(allErrs, validateNestedValueValidationCompleteness(&v.AnyOf[i], s, sPath, vPath.Child("anyOf").Index(i))...)
51 }
52 for i := range v.OneOf {
53 allErrs = append(allErrs, validateNestedValueValidationCompleteness(&v.OneOf[i], s, sPath, vPath.Child("oneOf").Index(i))...)
54 }
55
56 return allErrs
57 }
58
59 func validateNestedValueValidationCompleteness(v *NestedValueValidation, s *Structural, sPath, vPath *field.Path) field.ErrorList {
60 if v == nil {
61 return nil
62 }
63 if s == nil {
64 return field.ErrorList{field.Required(sPath, fmt.Sprintf("because it is defined in %s", vPath.String()))}
65 }
66
67 allErrs := field.ErrorList{}
68
69 allErrs = append(allErrs, validateValueValidationCompleteness(&v.ValueValidation, s, sPath, vPath)...)
70 allErrs = append(allErrs, validateNestedValueValidationCompleteness(v.Items, s.Items, sPath.Child("items"), vPath.Child("items"))...)
71 for k, vFld := range v.Properties {
72 if sFld, ok := s.Properties[k]; !ok {
73 allErrs = append(allErrs, field.Required(sPath.Child("properties").Key(k), fmt.Sprintf("because it is defined in %s", vPath.Child("properties").Key(k))))
74 } else {
75 allErrs = append(allErrs, validateNestedValueValidationCompleteness(&vFld, &sFld, sPath.Child("properties").Key(k), vPath.Child("properties").Key(k))...)
76 }
77 }
78
79
80
81 return allErrs
82 }
83
View as plain text