Skip to content

Commit

Permalink
refactor(pkg/core/validators): add Concat function, use in AddErrorAt
Browse files Browse the repository at this point in the history
Signed-off-by: Mike Beaumont <mjboamail@gmail.com>
  • Loading branch information
michaelbeaumont committed Jan 11, 2023
1 parent 7033990 commit 9117c19
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 20 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) {
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 {
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:]...)
}
4 changes: 2 additions & 2 deletions pkg/core/validators/types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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() {
Expand Down

0 comments on commit 9117c19

Please sign in to comment.