/check

Package for data validation in Go

Primary LanguageGoMIT LicenseMIT

check - Go package for data validation

Build Status GoDoc

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.