Design goals
- Composite pattern
- Multiple constraints on the same value by applying multiple validators
- Easy to create custom validators
- Easy to customize error messages
Usage
go get github.com/pengux/check
To run tests:
cd $GOPATH/src/github.com/pengux/check && go test
To validate your data, create a new Struct and add validators to it:
type User struct { Username string } func main() { u := &User{ Username: "invalid*", } s := check.Struct{ "Username": check.Composite{ check.NonEmpty{}, check.Regex{`^[a-zA-Z0-9]+$`}, check.MinChar{10}, }, } e := s.Validate(u) if e.HasErrors() { err, ok := e.GetErrorsByKey("Username") if !ok { panic("key 'Username' does not exists") } fmt.Println(err) } }
To use your own custom validator, just implement the Validator interface:
type CustomStringContainValidator struct { Constraint string } func (validator CustomStringContainValidator) Validate(v interface{}) check.Error { if !strings.Contains(v.(string), validator.Constraint) { return check.NewValidationError("customStringContainValidator", v, validator.Constraint) } return nil } func main() { username := "invalid*" validator := CustomStringContainValidator{"admin"} e := validator.Validate(username) fmt.Println(check.ErrorMessages[e.Error()]) }
To use custom error messages, either overwrite the package variable ErrorMessages or create your own map[string]string:
check.ErrorMessages["minChar"] := "the string must be minimum %v characters long" errMessages := errs.ToMessages() fmt.Println(errMessages)
For more example code check the file e2e_test.go.