Package check provides request form checking.
Get package:
go get -u github.com/gowww/check
Import it in your code:
import"github.com/gowww/check"
Make a Checker with rules for keys:
userChecker:= check.Checker{ "email": {check.Required, check.Email, check.Unique(db, "users", "email", "?")}, "phone": {check.Phone}, "picture": {check.MaxFileSize(5000000), check.Image}, }
The rules order is significant so for example, it's smarter to check the format of a value before its uniqueness, avoiding some useless database requests.
Check data:
From a values map, with Checker.CheckValues:
errs:=userChecker.CheckValues(map[string][]string{ "name": {"foobar"}, "phone": {"0012345678901"}, })
From an http.Request, with Checker.CheckRequest:
errs:=userChecker.CheckRequest(r)
Handle errors:
iferrs.NotEmpty() { fmt.Println(errs) }
Use Errors.JSON to get errors in a map under errors key, ready to be JSON formatted (as an HTTP API response, for example):
iferrs.NotEmpty() {
errsjs, _:=json.Marshal(errs.JSON())
w.Write(errsjs)
}Internationalization is handled by gowww/i18n and there are built-in translations for all errors.
Use Errors.T with an i18n.Translator (usually stored in the request context) to get translated errors:
iferrs.NotEmpty() {
transErrs:=errs.T(i18n.RequestTranslator(r))
fmt.Println(transErrs)
}You can provide custom translations for each error type under keys like "error + RuleName":
varlocales= i18n.Locales{
language.English: {
"hello": "Hello!",
"errorMaxFileSize": "File too big (%v max.)",
"errorRequired": "Required field",
},
}If the i18n.Translator is nil or a custom translation is not found, the built-in translation of error is used.
| Function | Usage | Possible errors |
|---|---|---|
| Alpha | Alpha | notAlpha |
Email | notEmail | |
| FileType | FileType("text/plain") | badFileType:text/plain |
| Image | Image | notImage |
| Integer | Integer | notInteger |
| Latitude | Latitude | notLatitude, notNumber |
| Longitude | Longitude | notLongitude, notNumber |
| Max | Max(1) | max:1, notNumber |
| MaxFileSize | MaxFileSize(5000000) | maxFileSize:5000000 |
| MaxLen | MaxLen(1) | maxLen:1, notNumber |
| Min | Min(1) | min:1, notNumber |
| MinFileSize | MinFileSize(10) | minFileSize:10 |
| MinLen | MinLen(1) | minLen:1, notNumber |
| Number | Number | notNumber |
| Phone | Phone | notPhone |
| Range | Range(1, 5) | max:5, min:1, notNumber |
| RangeLen | RangeLen(1, 5) | maxLen:5, minLen:1 |
| Required | Required | required |
| Same | Same("key1", "key2") | notSame:key1,key2 |
| Unique | Unique(db, "users", "email", "?") | notUnique |
| URL | URL | notURL |