diff --git a/pkg/core/validators/types.go b/pkg/core/validators/types.go index b0973503fa19..6ca3125da3a0 100644 --- a/pkg/core/validators/types.go +++ b/pkg/core/validators/types.go @@ -54,34 +54,32 @@ func (v *ValidationError) AddViolation(field string, message string) { v.Violations = append(v.Violations, violation) } -func (v *ValidationError) Add(err ValidationError) { - v.AddError("", err) -} - func (v *ValidationError) AddErrorAt(path PathBuilder, validationErr ValidationError) { - v.AddError(path.String(), validationErr) -} - -func (v *ValidationError) AddError(rootField string, validationErr ValidationError) { for _, violation := range validationErr.Violations { - field := "" - if violation.Field == "" { - field = rootField - } else { - sep := "" - if rootField != "" && !strings.HasPrefix(violation.Field, "[") { - sep = "." - } - field = fmt.Sprintf("%s%s%s", rootField, sep, violation.Field) + field := Root() + if violation.Field != "" { + field = PathBuilder{violation.Field} } newViolation := Violation{ - Field: field, + Field: path.concat(field).String(), Message: violation.Message, } v.Violations = append(v.Violations, newViolation) } } +func (v *ValidationError) Add(err ValidationError) { + v.AddErrorAt(Root(), err) +} + +func (v *ValidationError) AddError(rootField string, validationErr ValidationError) { + root := Root() + if rootField != "" { + root = RootedAt(rootField) + } + v.AddErrorAt(root, validationErr) +} + // Transform returns a new ValidationError with every violation // transformed by a given transformFunc. func (v *ValidationError) Transform(transformFunc func(Violation) Violation) *ValidationError { @@ -124,6 +122,10 @@ func RootedAt(name string) PathBuilder { return PathBuilder{name} } +func Root() PathBuilder { + return PathBuilder{} +} + func (p PathBuilder) Field(name string) PathBuilder { return append(p, fmt.Sprintf(".%s", name)) } @@ -139,3 +141,19 @@ func (p PathBuilder) Key(key string) PathBuilder { func (p PathBuilder) String() string { return strings.Join(p, "") } + +func (p PathBuilder) concat(other PathBuilder) PathBuilder { + if len(other) == 0 { + return p + } + if len(p) == 0 { + return other + } + + firstOther := other[0] + if !strings.HasPrefix(firstOther, "[") { + firstOther = "." + firstOther + } + + return append(append(p, firstOther), other[1:]...) +} diff --git a/pkg/core/validators/types_test.go b/pkg/core/validators/types_test.go index b19ed30d5395..3435b0725605 100644 --- a/pkg/core/validators/types_test.go +++ b/pkg/core/validators/types_test.go @@ -105,7 +105,7 @@ var _ = Describe("Validation Error", func() { path := validators.RootedAt("spec").Field("fields") err := validators.ValidationError{} subErr := validators.ValidationError{} - subErr.AddViolationAt(validators.PathBuilder{}.Index(2), "something bad") + subErr.AddViolationAt(validators.Root().Index(2), "something bad") // when err.AddErrorAt(path, subErr) @@ -193,7 +193,7 @@ var _ = Describe("Validation Error", func() { var _ = Describe("PathBuilder", func() { It("should produce empty path by default", func() { - Expect(validators.PathBuilder{}.String()).To(Equal("")) + Expect(validators.Root().String()).To(Equal("")) }) It("should produce valid root path", func() {