Skip to content

Commit

Permalink
fix(binding): dereference pointer to struct (#3199)
Browse files Browse the repository at this point in the history
  • Loading branch information
echovl authored Feb 7, 2024
1 parent 86ff4a6 commit 82bcd6d
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
5 changes: 4 additions & 1 deletion binding/default_validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,10 @@ func (v *defaultValidator) ValidateStruct(obj any) error {
value := reflect.ValueOf(obj)
switch value.Kind() {
case reflect.Ptr:
return v.ValidateStruct(value.Elem().Interface())
if value.Elem().Kind() != reflect.Struct {
return v.ValidateStruct(value.Elem().Interface())
}
return v.validateStruct(obj)
case reflect.Struct:
return v.validateStruct(obj)
case reflect.Slice, reflect.Array:
Expand Down
24 changes: 24 additions & 0 deletions binding/validate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,30 @@ func TestValidatePrimitives(t *testing.T) {
assert.Equal(t, "value", str)
}

type structModifyValidation struct {
Integer int
}

func toZero(sl validator.StructLevel) {
var s *structModifyValidation = sl.Top().Interface().(*structModifyValidation)
s.Integer = 0
}

func TestValidateAndModifyStruct(t *testing.T) {
// This validates that pointers to structs are passed to the validator
// giving us the ability to modify the struct being validated.
engine, ok := Validator.Engine().(*validator.Validate)
assert.True(t, ok)

engine.RegisterStructValidation(toZero, structModifyValidation{})

s := structModifyValidation{Integer: 1}
errs := validate(&s)

assert.Nil(t, errs)
assert.Equal(t, s, structModifyValidation{Integer: 0})
}

// structCustomValidation is a helper struct we use to check that
// custom validation can be registered on it.
// The `notone` binding directive is for custom validation and registered later.
Expand Down

0 comments on commit 82bcd6d

Please sign in to comment.