Skip to content

Commit

Permalink
chore: validation error path merging with index/keys (#5652)
Browse files Browse the repository at this point in the history
Signed-off-by: Mike Beaumont <mjboamail@gmail.com>
  • Loading branch information
michaelbeaumont authored Jan 11, 2023
1 parent 43ae351 commit e6552b6
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 19 deletions.
54 changes: 36 additions & 18 deletions pkg/core/validators/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
rootPrefix := ""
if rootField != "" {
rootPrefix += fmt.Sprintf("%s.", rootField)
}
for _, violation := range validationErr.Violations {
field := ""
if violation.Field == "" {
field = rootField
} else {
field = fmt.Sprintf("%s%s", rootPrefix, violation.Field)
field := Root()
if violation.Field != "" {
field = RootedAt(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 {
Expand Down Expand Up @@ -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))
}
Expand All @@ -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:]...)
}
21 changes: 20 additions & 1 deletion pkg/core/validators/types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,25 @@ var _ = Describe("Validation Error", func() {
})
})

Describe("AddErrorAt()", func() {
It("properly concatenates paths with index/keys", func() {
// given
path := validators.RootedAt("spec").Field("fields")
err := validators.ValidationError{}
subErr := validators.ValidationError{}
subErr.AddViolationAt(validators.Root().Index(2), "something bad")

// when
err.AddErrorAt(path, subErr)
// then
Expect(err).To(Equal(validators.ValidationError{
Violations: []validators.Violation{
{Field: "spec.fields[2]", Message: "something bad"},
},
}))
})
})

Describe("Transform()", func() {
type testCase struct {
input *validators.ValidationError
Expand Down Expand Up @@ -174,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() {
Expand Down

0 comments on commit e6552b6

Please sign in to comment.