Update github.com/asaskevich/govalidator commit hash to 21a406d
Some checks failed
continuous-integration/drone/pr Build is failing
Some checks failed
continuous-integration/drone/pr Build is failing
This commit is contained in:
parent
d02d413c5e
commit
b8a56c1d8e
2
go.mod
2
go.mod
|
@ -22,7 +22,7 @@ require (
|
||||||
code.vikunja.io/web v0.0.0-20200618164749-a5f3d450d39a
|
code.vikunja.io/web v0.0.0-20200618164749-a5f3d450d39a
|
||||||
gitea.com/xorm/xorm-redis-cache v0.2.0
|
gitea.com/xorm/xorm-redis-cache v0.2.0
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
|
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
|
||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a
|
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535
|
||||||
github.com/beevik/etree v1.1.0 // indirect
|
github.com/beevik/etree v1.1.0 // indirect
|
||||||
github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee
|
github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee
|
||||||
github.com/client9/misspell v0.3.4
|
github.com/client9/misspell v0.3.4
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -65,6 +65,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV
|
||||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
|
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
|
||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
|
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
|
||||||
|
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY=
|
||||||
|
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
|
||||||
github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=
|
github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=
|
||||||
github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs=
|
github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs=
|
||||||
github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=
|
github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=
|
||||||
|
|
15
vendor/github.com/asaskevich/govalidator/.gitignore
generated
vendored
Normal file
15
vendor/github.com/asaskevich/govalidator/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
bin/
|
||||||
|
.idea/
|
||||||
|
# Binaries for programs and plugins
|
||||||
|
*.exe
|
||||||
|
*.exe~
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Test binary, built with `go test -c`
|
||||||
|
*.test
|
||||||
|
|
||||||
|
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||||
|
*.out
|
||||||
|
|
22
vendor/github.com/asaskevich/govalidator/.travis.yml
generated
vendored
22
vendor/github.com/asaskevich/govalidator/.travis.yml
generated
vendored
|
@ -1,14 +1,18 @@
|
||||||
|
dist: bionic
|
||||||
language: go
|
language: go
|
||||||
|
env: GO111MODULE=on GOFLAGS='-mod vendor'
|
||||||
|
install: true
|
||||||
|
email: false
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- 1.1
|
- 1.10
|
||||||
- 1.2
|
- 1.11
|
||||||
- 1.3
|
- 1.12
|
||||||
- 1.4
|
- 1.13
|
||||||
- 1.5
|
|
||||||
- 1.6
|
|
||||||
- tip
|
- tip
|
||||||
|
|
||||||
notifications:
|
before_script:
|
||||||
email:
|
- go install github.com/golangci/golangci-lint/cmd/golangci-lint
|
||||||
- bwatas@gmail.com
|
script:
|
||||||
|
- golangci-lint run # run a bunch of code checkers/linters in parallel
|
||||||
|
- go test -v -race ./... # Run all the tests with the race detector enabled
|
||||||
|
|
4
vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md
generated
vendored
4
vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md
generated
vendored
|
@ -11,7 +11,7 @@ If you don't know what to do, there are some features and functions that need to
|
||||||
- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions)
|
- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions)
|
||||||
- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new
|
- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new
|
||||||
- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc
|
- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc
|
||||||
- [ ] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224)
|
- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224)
|
||||||
- [ ] Implement fuzzing testing
|
- [ ] Implement fuzzing testing
|
||||||
- [ ] Implement some struct/map/array utilities
|
- [ ] Implement some struct/map/array utilities
|
||||||
- [ ] Implement map/array validation
|
- [ ] Implement map/array validation
|
||||||
|
@ -37,7 +37,7 @@ Anyone can file an expense. If the expense makes sense for the development of th
|
||||||
### Contributors
|
### Contributors
|
||||||
|
|
||||||
Thank you to all the people who have already contributed to govalidator!
|
Thank you to all the people who have already contributed to govalidator!
|
||||||
<a href="graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a>
|
<a href="https://github.com/asaskevich/govalidator/graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a>
|
||||||
|
|
||||||
|
|
||||||
### Backers
|
### Backers
|
||||||
|
|
137
vendor/github.com/asaskevich/govalidator/README.md
generated
vendored
137
vendor/github.com/asaskevich/govalidator/README.md
generated
vendored
|
@ -13,7 +13,7 @@ Type the following command in your terminal:
|
||||||
|
|
||||||
or you can get specified release of the package with `gopkg.in`:
|
or you can get specified release of the package with `gopkg.in`:
|
||||||
|
|
||||||
go get gopkg.in/asaskevich/govalidator.v4
|
go get gopkg.in/asaskevich/govalidator.v10
|
||||||
|
|
||||||
After it the package is ready to use.
|
After it the package is ready to use.
|
||||||
|
|
||||||
|
@ -83,14 +83,14 @@ This was changed to prevent data races when accessing custom validators.
|
||||||
import "github.com/asaskevich/govalidator"
|
import "github.com/asaskevich/govalidator"
|
||||||
|
|
||||||
// before
|
// before
|
||||||
govalidator.CustomTypeTagMap["customByteArrayValidator"] = CustomTypeValidator(func(i interface{}, o interface{}) bool {
|
govalidator.CustomTypeTagMap["customByteArrayValidator"] = func(i interface{}, o interface{}) bool {
|
||||||
// ...
|
// ...
|
||||||
})
|
}
|
||||||
|
|
||||||
// after
|
// after
|
||||||
govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator(func(i interface{}, o interface{}) bool {
|
govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, o interface{}) bool {
|
||||||
// ...
|
// ...
|
||||||
}))
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
#### List of functions:
|
#### List of functions:
|
||||||
|
@ -108,23 +108,34 @@ func Filter(array []interface{}, iterator ConditionIterator) []interface{}
|
||||||
func Find(array []interface{}, iterator ConditionIterator) interface{}
|
func Find(array []interface{}, iterator ConditionIterator) interface{}
|
||||||
func GetLine(s string, index int) (string, error)
|
func GetLine(s string, index int) (string, error)
|
||||||
func GetLines(s string) []string
|
func GetLines(s string) []string
|
||||||
func InRange(value, left, right float64) bool
|
func HasLowerCase(str string) bool
|
||||||
|
func HasUpperCase(str string) bool
|
||||||
|
func HasWhitespace(str string) bool
|
||||||
|
func HasWhitespaceOnly(str string) bool
|
||||||
|
func InRange(value interface{}, left interface{}, right interface{}) bool
|
||||||
|
func InRangeFloat32(value, left, right float32) bool
|
||||||
|
func InRangeFloat64(value, left, right float64) bool
|
||||||
|
func InRangeInt(value, left, right interface{}) bool
|
||||||
func IsASCII(str string) bool
|
func IsASCII(str string) bool
|
||||||
func IsAlpha(str string) bool
|
func IsAlpha(str string) bool
|
||||||
func IsAlphanumeric(str string) bool
|
func IsAlphanumeric(str string) bool
|
||||||
func IsBase64(str string) bool
|
func IsBase64(str string) bool
|
||||||
func IsByteLength(str string, min, max int) bool
|
func IsByteLength(str string, min, max int) bool
|
||||||
func IsCIDR(str string) bool
|
func IsCIDR(str string) bool
|
||||||
|
func IsCRC32(str string) bool
|
||||||
|
func IsCRC32b(str string) bool
|
||||||
func IsCreditCard(str string) bool
|
func IsCreditCard(str string) bool
|
||||||
func IsDNSName(str string) bool
|
func IsDNSName(str string) bool
|
||||||
func IsDataURI(str string) bool
|
func IsDataURI(str string) bool
|
||||||
func IsDialString(str string) bool
|
func IsDialString(str string) bool
|
||||||
func IsDivisibleBy(str, num string) bool
|
func IsDivisibleBy(str, num string) bool
|
||||||
func IsEmail(str string) bool
|
func IsEmail(str string) bool
|
||||||
|
func IsExistingEmail(email string) bool
|
||||||
func IsFilePath(str string) (bool, int)
|
func IsFilePath(str string) (bool, int)
|
||||||
func IsFloat(str string) bool
|
func IsFloat(str string) bool
|
||||||
func IsFullWidth(str string) bool
|
func IsFullWidth(str string) bool
|
||||||
func IsHalfWidth(str string) bool
|
func IsHalfWidth(str string) bool
|
||||||
|
func IsHash(str string, algorithm string) bool
|
||||||
func IsHexadecimal(str string) bool
|
func IsHexadecimal(str string) bool
|
||||||
func IsHexcolor(str string) bool
|
func IsHexcolor(str string) bool
|
||||||
func IsHost(str string) bool
|
func IsHost(str string) bool
|
||||||
|
@ -136,22 +147,27 @@ func IsISBN10(str string) bool
|
||||||
func IsISBN13(str string) bool
|
func IsISBN13(str string) bool
|
||||||
func IsISO3166Alpha2(str string) bool
|
func IsISO3166Alpha2(str string) bool
|
||||||
func IsISO3166Alpha3(str string) bool
|
func IsISO3166Alpha3(str string) bool
|
||||||
|
func IsISO4217(str string) bool
|
||||||
func IsISO693Alpha2(str string) bool
|
func IsISO693Alpha2(str string) bool
|
||||||
func IsISO693Alpha3b(str string) bool
|
func IsISO693Alpha3b(str string) bool
|
||||||
func IsISO4217(str string) bool
|
|
||||||
func IsIn(str string, params ...string) bool
|
func IsIn(str string, params ...string) bool
|
||||||
|
func IsInRaw(str string, params ...string) bool
|
||||||
func IsInt(str string) bool
|
func IsInt(str string) bool
|
||||||
func IsJSON(str string) bool
|
func IsJSON(str string) bool
|
||||||
func IsLatitude(str string) bool
|
func IsLatitude(str string) bool
|
||||||
func IsLongitude(str string) bool
|
func IsLongitude(str string) bool
|
||||||
func IsLowerCase(str string) bool
|
func IsLowerCase(str string) bool
|
||||||
func IsMAC(str string) bool
|
func IsMAC(str string) bool
|
||||||
|
func IsMD4(str string) bool
|
||||||
|
func IsMD5(str string) bool
|
||||||
|
func IsMagnetURI(str string) bool
|
||||||
func IsMongoID(str string) bool
|
func IsMongoID(str string) bool
|
||||||
func IsMultibyte(str string) bool
|
func IsMultibyte(str string) bool
|
||||||
func IsNatural(value float64) bool
|
func IsNatural(value float64) bool
|
||||||
func IsNegative(value float64) bool
|
func IsNegative(value float64) bool
|
||||||
func IsNonNegative(value float64) bool
|
func IsNonNegative(value float64) bool
|
||||||
func IsNonPositive(value float64) bool
|
func IsNonPositive(value float64) bool
|
||||||
|
func IsNotNull(str string) bool
|
||||||
func IsNull(str string) bool
|
func IsNull(str string) bool
|
||||||
func IsNumeric(str string) bool
|
func IsNumeric(str string) bool
|
||||||
func IsPort(str string) bool
|
func IsPort(str string) bool
|
||||||
|
@ -162,9 +178,21 @@ func IsRFC3339WithoutZone(str string) bool
|
||||||
func IsRGBcolor(str string) bool
|
func IsRGBcolor(str string) bool
|
||||||
func IsRequestURI(rawurl string) bool
|
func IsRequestURI(rawurl string) bool
|
||||||
func IsRequestURL(rawurl string) bool
|
func IsRequestURL(rawurl string) bool
|
||||||
|
func IsRipeMD128(str string) bool
|
||||||
|
func IsRipeMD160(str string) bool
|
||||||
|
func IsRsaPub(str string, params ...string) bool
|
||||||
|
func IsRsaPublicKey(str string, keylen int) bool
|
||||||
|
func IsSHA1(str string) bool
|
||||||
|
func IsSHA256(str string) bool
|
||||||
|
func IsSHA384(str string) bool
|
||||||
|
func IsSHA512(str string) bool
|
||||||
func IsSSN(str string) bool
|
func IsSSN(str string) bool
|
||||||
func IsSemver(str string) bool
|
func IsSemver(str string) bool
|
||||||
|
func IsTiger128(str string) bool
|
||||||
|
func IsTiger160(str string) bool
|
||||||
|
func IsTiger192(str string) bool
|
||||||
func IsTime(str string, format string) bool
|
func IsTime(str string, format string) bool
|
||||||
|
func IsType(v interface{}, params ...string) bool
|
||||||
func IsURL(str string) bool
|
func IsURL(str string) bool
|
||||||
func IsUTFDigit(str string) bool
|
func IsUTFDigit(str string) bool
|
||||||
func IsUTFLetter(str string) bool
|
func IsUTFLetter(str string) bool
|
||||||
|
@ -174,16 +202,20 @@ func IsUUID(str string) bool
|
||||||
func IsUUIDv3(str string) bool
|
func IsUUIDv3(str string) bool
|
||||||
func IsUUIDv4(str string) bool
|
func IsUUIDv4(str string) bool
|
||||||
func IsUUIDv5(str string) bool
|
func IsUUIDv5(str string) bool
|
||||||
|
func IsUnixTime(str string) bool
|
||||||
func IsUpperCase(str string) bool
|
func IsUpperCase(str string) bool
|
||||||
func IsVariableWidth(str string) bool
|
func IsVariableWidth(str string) bool
|
||||||
func IsWhole(value float64) bool
|
func IsWhole(value float64) bool
|
||||||
func LeftTrim(str, chars string) string
|
func LeftTrim(str, chars string) string
|
||||||
func Map(array []interface{}, iterator ResultIterator) []interface{}
|
func Map(array []interface{}, iterator ResultIterator) []interface{}
|
||||||
func Matches(str, pattern string) bool
|
func Matches(str, pattern string) bool
|
||||||
|
func MaxStringLength(str string, params ...string) bool
|
||||||
|
func MinStringLength(str string, params ...string) bool
|
||||||
func NormalizeEmail(str string) (string, error)
|
func NormalizeEmail(str string) (string, error)
|
||||||
func PadBoth(str string, padStr string, padLen int) string
|
func PadBoth(str string, padStr string, padLen int) string
|
||||||
func PadLeft(str string, padStr string, padLen int) string
|
func PadLeft(str string, padStr string, padLen int) string
|
||||||
func PadRight(str string, padStr string, padLen int) string
|
func PadRight(str string, padStr string, padLen int) string
|
||||||
|
func PrependPathToErrors(err error, path string) error
|
||||||
func Range(str string, params ...string) bool
|
func Range(str string, params ...string) bool
|
||||||
func RemoveTags(s string) string
|
func RemoveTags(s string) string
|
||||||
func ReplacePattern(str, pattern, replace string) string
|
func ReplacePattern(str, pattern, replace string) string
|
||||||
|
@ -192,18 +224,21 @@ func RightTrim(str, chars string) string
|
||||||
func RuneLength(str string, params ...string) bool
|
func RuneLength(str string, params ...string) bool
|
||||||
func SafeFileName(str string) string
|
func SafeFileName(str string) string
|
||||||
func SetFieldsRequiredByDefault(value bool)
|
func SetFieldsRequiredByDefault(value bool)
|
||||||
|
func SetNilPtrAllowedByRequired(value bool)
|
||||||
func Sign(value float64) float64
|
func Sign(value float64) float64
|
||||||
func StringLength(str string, params ...string) bool
|
func StringLength(str string, params ...string) bool
|
||||||
func StringMatches(s string, params ...string) bool
|
func StringMatches(s string, params ...string) bool
|
||||||
func StripLow(str string, keepNewLines bool) string
|
func StripLow(str string, keepNewLines bool) string
|
||||||
func ToBoolean(str string) (bool, error)
|
func ToBoolean(str string) (bool, error)
|
||||||
func ToFloat(str string) (float64, error)
|
func ToFloat(str string) (float64, error)
|
||||||
func ToInt(str string) (int64, error)
|
func ToInt(value interface{}) (res int64, err error)
|
||||||
func ToJSON(obj interface{}) (string, error)
|
func ToJSON(obj interface{}) (string, error)
|
||||||
func ToString(obj interface{}) string
|
func ToString(obj interface{}) string
|
||||||
func Trim(str, chars string) string
|
func Trim(str, chars string) string
|
||||||
func Truncate(str string, length int, ending string) string
|
func Truncate(str string, length int, ending string) string
|
||||||
|
func TruncatingErrorf(str string, args ...interface{}) error
|
||||||
func UnderscoreToCamelCase(s string) string
|
func UnderscoreToCamelCase(s string) string
|
||||||
|
func ValidateMap(inputMap map[string]interface{}, validationMap map[string]interface{}) (bool, error)
|
||||||
func ValidateStruct(s interface{}) (bool, error)
|
func ValidateStruct(s interface{}) (bool, error)
|
||||||
func WhiteList(str, chars string) string
|
func WhiteList(str, chars string) string
|
||||||
type ConditionIterator
|
type ConditionIterator
|
||||||
|
@ -214,6 +249,8 @@ type Errors
|
||||||
func (es Errors) Error() string
|
func (es Errors) Error() string
|
||||||
func (es Errors) Errors() []error
|
func (es Errors) Errors() []error
|
||||||
type ISO3166Entry
|
type ISO3166Entry
|
||||||
|
type ISO693Entry
|
||||||
|
type InterfaceParamValidator
|
||||||
type Iterator
|
type Iterator
|
||||||
type ParamValidator
|
type ParamValidator
|
||||||
type ResultIterator
|
type ResultIterator
|
||||||
|
@ -227,6 +264,27 @@ type Validator
|
||||||
```go
|
```go
|
||||||
println(govalidator.IsURL(`http://user@pass:domain.com/path/page`))
|
println(govalidator.IsURL(`http://user@pass:domain.com/path/page`))
|
||||||
```
|
```
|
||||||
|
###### IsType
|
||||||
|
```go
|
||||||
|
println(govalidator.IsType("Bob", "string"))
|
||||||
|
println(govalidator.IsType(1, "int"))
|
||||||
|
i := 1
|
||||||
|
println(govalidator.IsType(&i, "*int"))
|
||||||
|
```
|
||||||
|
|
||||||
|
IsType can be used through the tag `type` which is essential for map validation:
|
||||||
|
```go
|
||||||
|
type User struct {
|
||||||
|
Name string `valid:"type(string)"`
|
||||||
|
Age int `valid:"type(int)"`
|
||||||
|
Meta interface{} `valid:"type(string)"`
|
||||||
|
}
|
||||||
|
result, err := govalidator.ValidateStruct(user{"Bob", 20, "meta"})
|
||||||
|
if err != nil {
|
||||||
|
println("error: " + err.Error())
|
||||||
|
}
|
||||||
|
println(result)
|
||||||
|
```
|
||||||
###### ToString
|
###### ToString
|
||||||
```go
|
```go
|
||||||
type User struct {
|
type User struct {
|
||||||
|
@ -335,6 +393,11 @@ Validators with parameters
|
||||||
"in(string1|string2|...|stringN)": IsIn,
|
"in(string1|string2|...|stringN)": IsIn,
|
||||||
"rsapub(keylength)" : IsRsaPub,
|
"rsapub(keylength)" : IsRsaPub,
|
||||||
```
|
```
|
||||||
|
Validators with parameters for any type
|
||||||
|
|
||||||
|
```go
|
||||||
|
"type(type)": IsType,
|
||||||
|
```
|
||||||
|
|
||||||
And here is small example of usage:
|
And here is small example of usage:
|
||||||
```go
|
```go
|
||||||
|
@ -370,6 +433,41 @@ if err != nil {
|
||||||
}
|
}
|
||||||
println(result)
|
println(result)
|
||||||
```
|
```
|
||||||
|
###### ValidateMap [#2](https://github.com/asaskevich/govalidator/pull/338)
|
||||||
|
If you want to validate maps, you can use the map to be validated and a validation map that contain the same tags used in ValidateStruct, both maps have to be in the form `map[string]interface{}`
|
||||||
|
|
||||||
|
So here is small example of usage:
|
||||||
|
```go
|
||||||
|
var mapTemplate = map[string]interface{}{
|
||||||
|
"name":"required,alpha",
|
||||||
|
"family":"required,alpha",
|
||||||
|
"email":"required,email",
|
||||||
|
"cell-phone":"numeric",
|
||||||
|
"address":map[string]interface{}{
|
||||||
|
"line1":"required,alphanum",
|
||||||
|
"line2":"alphanum",
|
||||||
|
"postal-code":"numeric",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var inputMap = map[string]interface{}{
|
||||||
|
"name":"Bob",
|
||||||
|
"family":"Smith",
|
||||||
|
"email":"foo@bar.baz",
|
||||||
|
"address":map[string]interface{}{
|
||||||
|
"line1":"",
|
||||||
|
"line2":"",
|
||||||
|
"postal-code":"",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := govalidator.ValidateMap(inputMap, mapTemplate)
|
||||||
|
if err != nil {
|
||||||
|
println("error: " + err.Error())
|
||||||
|
}
|
||||||
|
println(result)
|
||||||
|
```
|
||||||
|
|
||||||
###### WhiteList
|
###### WhiteList
|
||||||
```go
|
```go
|
||||||
// Remove all characters from string ignoring characters between "a" and "z"
|
// Remove all characters from string ignoring characters between "a" and "z"
|
||||||
|
@ -389,7 +487,7 @@ type StructWithCustomByteArray struct {
|
||||||
CustomMinLength int `valid:"-"`
|
CustomMinLength int `valid:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator(func(i interface{}, context interface{}) bool {
|
govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, context interface{}) bool {
|
||||||
switch v := context.(type) { // you can type switch on the context interface being validated
|
switch v := context.(type) { // you can type switch on the context interface being validated
|
||||||
case StructWithCustomByteArray:
|
case StructWithCustomByteArray:
|
||||||
// you can check and validate against some other field in the context,
|
// you can check and validate against some other field in the context,
|
||||||
|
@ -409,14 +507,25 @@ govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}))
|
})
|
||||||
govalidator.CustomTypeTagMap.Set("customMinLengthValidator", CustomTypeValidator(func(i interface{}, context interface{}) bool {
|
govalidator.CustomTypeTagMap.Set("customMinLengthValidator", func(i interface{}, context interface{}) bool {
|
||||||
switch v := context.(type) { // this validates a field against the value in another field, i.e. dependent validation
|
switch v := context.(type) { // this validates a field against the value in another field, i.e. dependent validation
|
||||||
case StructWithCustomByteArray:
|
case StructWithCustomByteArray:
|
||||||
return len(v.ID) >= v.CustomMinLength
|
return len(v.ID) >= v.CustomMinLength
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}))
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
###### Loop over Error()
|
||||||
|
By default .Error() returns all errors in a single String. To access each error you can do this:
|
||||||
|
```go
|
||||||
|
if err != nil {
|
||||||
|
errs := err.(govalidator.Errors).Errors()
|
||||||
|
for _, e := range errs {
|
||||||
|
fmt.Println(e.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
###### Custom error messages
|
###### Custom error messages
|
||||||
|
@ -445,7 +554,7 @@ If you don't know what to do, there are some features and functions that need to
|
||||||
- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions)
|
- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions)
|
||||||
- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new
|
- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new
|
||||||
- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc
|
- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc
|
||||||
- [ ] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224)
|
- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224)
|
||||||
- [ ] Implement fuzzing testing
|
- [ ] Implement fuzzing testing
|
||||||
- [ ] Implement some struct/map/array utilities
|
- [ ] Implement some struct/map/array utilities
|
||||||
- [ ] Implement map/array validation
|
- [ ] Implement map/array validation
|
||||||
|
@ -475,7 +584,7 @@ This project exists thanks to all the people who contribute. [[Contribute](CONTR
|
||||||
* [Matt Sanford](https://github.com/mzsanford)
|
* [Matt Sanford](https://github.com/mzsanford)
|
||||||
* [Simon ccl1115](https://github.com/ccl1115)
|
* [Simon ccl1115](https://github.com/ccl1115)
|
||||||
|
|
||||||
<a href="graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a>
|
<a href="https://github.com/asaskevich/govalidator/graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a>
|
||||||
|
|
||||||
|
|
||||||
### Backers
|
### Backers
|
||||||
|
|
3
vendor/github.com/asaskevich/govalidator/doc.go
generated
vendored
Normal file
3
vendor/github.com/asaskevich/govalidator/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
package govalidator
|
||||||
|
|
||||||
|
// A package of validators and sanitizers for strings, structures and collections.
|
6
vendor/github.com/asaskevich/govalidator/error.go
generated
vendored
6
vendor/github.com/asaskevich/govalidator/error.go
generated
vendored
|
@ -1,6 +1,9 @@
|
||||||
package govalidator
|
package govalidator
|
||||||
|
|
||||||
import "strings"
|
import (
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
// Errors is an array of multiple errors and conforms to the error interface.
|
// Errors is an array of multiple errors and conforms to the error interface.
|
||||||
type Errors []error
|
type Errors []error
|
||||||
|
@ -15,6 +18,7 @@ func (es Errors) Error() string {
|
||||||
for _, e := range es {
|
for _, e := range es {
|
||||||
errs = append(errs, e.Error())
|
errs = append(errs, e.Error())
|
||||||
}
|
}
|
||||||
|
sort.Strings(errs)
|
||||||
return strings.Join(errs, ";")
|
return strings.Join(errs, ";")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
3
vendor/github.com/asaskevich/govalidator/go.mod
generated
vendored
Normal file
3
vendor/github.com/asaskevich/govalidator/go.mod
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
module github.com/asaskevich/govalidator
|
||||||
|
|
||||||
|
go 1.12
|
166
vendor/github.com/asaskevich/govalidator/patterns.go
generated
vendored
166
vendor/github.com/asaskevich/govalidator/patterns.go
generated
vendored
|
@ -4,49 +4,51 @@ import "regexp"
|
||||||
|
|
||||||
// Basic regular expressions for validating strings
|
// Basic regular expressions for validating strings
|
||||||
const (
|
const (
|
||||||
Email string = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$"
|
Email string = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$"
|
||||||
CreditCard string = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$"
|
CreditCard string = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11}|6[27][0-9]{14})$"
|
||||||
ISBN10 string = "^(?:[0-9]{9}X|[0-9]{10})$"
|
ISBN10 string = "^(?:[0-9]{9}X|[0-9]{10})$"
|
||||||
ISBN13 string = "^(?:[0-9]{13})$"
|
ISBN13 string = "^(?:[0-9]{13})$"
|
||||||
UUID3 string = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$"
|
UUID3 string = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$"
|
||||||
UUID4 string = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
|
UUID4 string = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
|
||||||
UUID5 string = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
|
UUID5 string = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
|
||||||
UUID string = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
|
UUID string = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
|
||||||
Alpha string = "^[a-zA-Z]+$"
|
Alpha string = "^[a-zA-Z]+$"
|
||||||
Alphanumeric string = "^[a-zA-Z0-9]+$"
|
Alphanumeric string = "^[a-zA-Z0-9]+$"
|
||||||
Numeric string = "^[0-9]+$"
|
Numeric string = "^[0-9]+$"
|
||||||
Int string = "^(?:[-+]?(?:0|[1-9][0-9]*))$"
|
Int string = "^(?:[-+]?(?:0|[1-9][0-9]*))$"
|
||||||
Float string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"
|
Float string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"
|
||||||
Hexadecimal string = "^[0-9a-fA-F]+$"
|
Hexadecimal string = "^[0-9a-fA-F]+$"
|
||||||
Hexcolor string = "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
|
Hexcolor string = "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
|
||||||
RGBcolor string = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$"
|
RGBcolor string = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$"
|
||||||
ASCII string = "^[\x00-\x7F]+$"
|
ASCII string = "^[\x00-\x7F]+$"
|
||||||
Multibyte string = "[^\x00-\x7F]"
|
Multibyte string = "[^\x00-\x7F]"
|
||||||
FullWidth string = "[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]"
|
FullWidth string = "[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]"
|
||||||
HalfWidth string = "[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]"
|
HalfWidth string = "[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]"
|
||||||
Base64 string = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$"
|
Base64 string = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$"
|
||||||
PrintableASCII string = "^[\x20-\x7E]+$"
|
PrintableASCII string = "^[\x20-\x7E]+$"
|
||||||
DataURI string = "^data:.+\\/(.+);base64$"
|
DataURI string = "^data:.+\\/(.+);base64$"
|
||||||
Latitude string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$"
|
MagnetURI string = "^magnet:\\?xt=urn:[a-zA-Z0-9]+:[a-zA-Z0-9]{32,40}&dn=.+&tr=.+$"
|
||||||
Longitude string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$"
|
Latitude string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$"
|
||||||
DNSName string = `^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$`
|
Longitude string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$"
|
||||||
IP string = `(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))`
|
DNSName string = `^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$`
|
||||||
URLSchema string = `((ftp|tcp|udp|wss?|https?):\/\/)`
|
IP string = `(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))`
|
||||||
URLUsername string = `(\S+(:\S*)?@)`
|
URLSchema string = `((ftp|tcp|udp|wss?|https?):\/\/)`
|
||||||
URLPath string = `((\/|\?|#)[^\s]*)`
|
URLUsername string = `(\S+(:\S*)?@)`
|
||||||
URLPort string = `(:(\d{1,5}))`
|
URLPath string = `((\/|\?|#)[^\s]*)`
|
||||||
URLIP string = `([1-9]\d?|1\d\d|2[01]\d|22[0-3])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))`
|
URLPort string = `(:(\d{1,5}))`
|
||||||
URLSubdomain string = `((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))`
|
URLIP string = `([1-9]\d?|1\d\d|2[01]\d|22[0-3]|24\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-5]))`
|
||||||
URL string = `^` + URLSchema + `?` + URLUsername + `?` + `((` + URLIP + `|(\[` + IP + `\])|(([a-zA-Z0-9]([a-zA-Z0-9-_]+)?[a-zA-Z0-9]([-\.][a-zA-Z0-9]+)*)|(` + URLSubdomain + `?))?(([a-zA-Z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-zA-Z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-zA-Z\x{00a1}-\x{ffff}]{1,}))?))\.?` + URLPort + `?` + URLPath + `?$`
|
URLSubdomain string = `((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))`
|
||||||
SSN string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$`
|
URL string = `^` + URLSchema + `?` + URLUsername + `?` + `((` + URLIP + `|(\[` + IP + `\])|(([a-zA-Z0-9]([a-zA-Z0-9-_]+)?[a-zA-Z0-9]([-\.][a-zA-Z0-9]+)*)|(` + URLSubdomain + `?))?(([a-zA-Z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-zA-Z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-zA-Z\x{00a1}-\x{ffff}]{1,}))?))\.?` + URLPort + `?` + URLPath + `?$`
|
||||||
WinPath string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$`
|
SSN string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$`
|
||||||
UnixPath string = `^(/[^/\x00]*)+/?$`
|
WinPath string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$`
|
||||||
Semver string = "^v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$"
|
UnixPath string = `^(/[^/\x00]*)+/?$`
|
||||||
tagName string = "valid"
|
Semver string = "^v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$"
|
||||||
hasLowerCase string = ".*[[:lower:]]"
|
tagName string = "valid"
|
||||||
hasUpperCase string = ".*[[:upper:]]"
|
hasLowerCase string = ".*[[:lower:]]"
|
||||||
hasWhitespace string = ".*[[:space:]]"
|
hasUpperCase string = ".*[[:upper:]]"
|
||||||
hasWhitespaceOnly string = "^[[:space:]]+$"
|
hasWhitespace string = ".*[[:space:]]"
|
||||||
|
hasWhitespaceOnly string = "^[[:space:]]+$"
|
||||||
|
IMEI string = "^[0-9a-f]{14}$|^\\d{15}$|^\\d{18}$"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Used by IsFilePath func
|
// Used by IsFilePath func
|
||||||
|
@ -60,42 +62,44 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
userRegexp = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$")
|
userRegexp = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$")
|
||||||
hostRegexp = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$")
|
hostRegexp = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$")
|
||||||
userDotRegexp = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})")
|
userDotRegexp = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})")
|
||||||
rxEmail = regexp.MustCompile(Email)
|
rxEmail = regexp.MustCompile(Email)
|
||||||
rxCreditCard = regexp.MustCompile(CreditCard)
|
rxCreditCard = regexp.MustCompile(CreditCard)
|
||||||
rxISBN10 = regexp.MustCompile(ISBN10)
|
rxISBN10 = regexp.MustCompile(ISBN10)
|
||||||
rxISBN13 = regexp.MustCompile(ISBN13)
|
rxISBN13 = regexp.MustCompile(ISBN13)
|
||||||
rxUUID3 = regexp.MustCompile(UUID3)
|
rxUUID3 = regexp.MustCompile(UUID3)
|
||||||
rxUUID4 = regexp.MustCompile(UUID4)
|
rxUUID4 = regexp.MustCompile(UUID4)
|
||||||
rxUUID5 = regexp.MustCompile(UUID5)
|
rxUUID5 = regexp.MustCompile(UUID5)
|
||||||
rxUUID = regexp.MustCompile(UUID)
|
rxUUID = regexp.MustCompile(UUID)
|
||||||
rxAlpha = regexp.MustCompile(Alpha)
|
rxAlpha = regexp.MustCompile(Alpha)
|
||||||
rxAlphanumeric = regexp.MustCompile(Alphanumeric)
|
rxAlphanumeric = regexp.MustCompile(Alphanumeric)
|
||||||
rxNumeric = regexp.MustCompile(Numeric)
|
rxNumeric = regexp.MustCompile(Numeric)
|
||||||
rxInt = regexp.MustCompile(Int)
|
rxInt = regexp.MustCompile(Int)
|
||||||
rxFloat = regexp.MustCompile(Float)
|
rxFloat = regexp.MustCompile(Float)
|
||||||
rxHexadecimal = regexp.MustCompile(Hexadecimal)
|
rxHexadecimal = regexp.MustCompile(Hexadecimal)
|
||||||
rxHexcolor = regexp.MustCompile(Hexcolor)
|
rxHexcolor = regexp.MustCompile(Hexcolor)
|
||||||
rxRGBcolor = regexp.MustCompile(RGBcolor)
|
rxRGBcolor = regexp.MustCompile(RGBcolor)
|
||||||
rxASCII = regexp.MustCompile(ASCII)
|
rxASCII = regexp.MustCompile(ASCII)
|
||||||
rxPrintableASCII = regexp.MustCompile(PrintableASCII)
|
rxPrintableASCII = regexp.MustCompile(PrintableASCII)
|
||||||
rxMultibyte = regexp.MustCompile(Multibyte)
|
rxMultibyte = regexp.MustCompile(Multibyte)
|
||||||
rxFullWidth = regexp.MustCompile(FullWidth)
|
rxFullWidth = regexp.MustCompile(FullWidth)
|
||||||
rxHalfWidth = regexp.MustCompile(HalfWidth)
|
rxHalfWidth = regexp.MustCompile(HalfWidth)
|
||||||
rxBase64 = regexp.MustCompile(Base64)
|
rxBase64 = regexp.MustCompile(Base64)
|
||||||
rxDataURI = regexp.MustCompile(DataURI)
|
rxDataURI = regexp.MustCompile(DataURI)
|
||||||
rxLatitude = regexp.MustCompile(Latitude)
|
rxMagnetURI = regexp.MustCompile(MagnetURI)
|
||||||
rxLongitude = regexp.MustCompile(Longitude)
|
rxLatitude = regexp.MustCompile(Latitude)
|
||||||
rxDNSName = regexp.MustCompile(DNSName)
|
rxLongitude = regexp.MustCompile(Longitude)
|
||||||
rxURL = regexp.MustCompile(URL)
|
rxDNSName = regexp.MustCompile(DNSName)
|
||||||
rxSSN = regexp.MustCompile(SSN)
|
rxURL = regexp.MustCompile(URL)
|
||||||
rxWinPath = regexp.MustCompile(WinPath)
|
rxSSN = regexp.MustCompile(SSN)
|
||||||
rxUnixPath = regexp.MustCompile(UnixPath)
|
rxWinPath = regexp.MustCompile(WinPath)
|
||||||
rxSemver = regexp.MustCompile(Semver)
|
rxUnixPath = regexp.MustCompile(UnixPath)
|
||||||
rxHasLowerCase = regexp.MustCompile(hasLowerCase)
|
rxSemver = regexp.MustCompile(Semver)
|
||||||
rxHasUpperCase = regexp.MustCompile(hasUpperCase)
|
rxHasLowerCase = regexp.MustCompile(hasLowerCase)
|
||||||
rxHasWhitespace = regexp.MustCompile(hasWhitespace)
|
rxHasUpperCase = regexp.MustCompile(hasUpperCase)
|
||||||
rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly)
|
rxHasWhitespace = regexp.MustCompile(hasWhitespace)
|
||||||
|
rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly)
|
||||||
|
rxIMEI = regexp.MustCompile(IMEI)
|
||||||
)
|
)
|
||||||
|
|
31
vendor/github.com/asaskevich/govalidator/types.go
generated
vendored
31
vendor/github.com/asaskevich/govalidator/types.go
generated
vendored
|
@ -16,6 +16,7 @@ type CustomTypeValidator func(i interface{}, o interface{}) bool
|
||||||
|
|
||||||
// ParamValidator is a wrapper for validator functions that accepts additional parameters.
|
// ParamValidator is a wrapper for validator functions that accepts additional parameters.
|
||||||
type ParamValidator func(str string, params ...string) bool
|
type ParamValidator func(str string, params ...string) bool
|
||||||
|
type InterfaceParamValidator func(in interface{}, params ...string) bool
|
||||||
type tagOptionsMap map[string]tagOption
|
type tagOptionsMap map[string]tagOption
|
||||||
|
|
||||||
func (t tagOptionsMap) orderedKeys() []string {
|
func (t tagOptionsMap) orderedKeys() []string {
|
||||||
|
@ -46,15 +47,27 @@ type UnsupportedTypeError struct {
|
||||||
// It implements the methods to sort by string.
|
// It implements the methods to sort by string.
|
||||||
type stringValues []reflect.Value
|
type stringValues []reflect.Value
|
||||||
|
|
||||||
|
// InterfaceParamTagMap is a map of functions accept variants parameters for an interface value
|
||||||
|
var InterfaceParamTagMap = map[string]InterfaceParamValidator{
|
||||||
|
"type": IsType,
|
||||||
|
}
|
||||||
|
|
||||||
|
// InterfaceParamTagRegexMap maps interface param tags to their respective regexes.
|
||||||
|
var InterfaceParamTagRegexMap = map[string]*regexp.Regexp{
|
||||||
|
"type": regexp.MustCompile(`^type\((.*)\)$`),
|
||||||
|
}
|
||||||
|
|
||||||
// ParamTagMap is a map of functions accept variants parameters
|
// ParamTagMap is a map of functions accept variants parameters
|
||||||
var ParamTagMap = map[string]ParamValidator{
|
var ParamTagMap = map[string]ParamValidator{
|
||||||
"length": ByteLength,
|
"length": ByteLength,
|
||||||
"range": Range,
|
"range": Range,
|
||||||
"runelength": RuneLength,
|
"runelength": RuneLength,
|
||||||
"stringlength": StringLength,
|
"stringlength": StringLength,
|
||||||
"matches": StringMatches,
|
"matches": StringMatches,
|
||||||
"in": isInRaw,
|
"in": IsInRaw,
|
||||||
"rsapub": IsRsaPub,
|
"rsapub": IsRsaPub,
|
||||||
|
"minstringlength": MinStringLength,
|
||||||
|
"maxstringlength": MaxStringLength,
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParamTagRegexMap maps param tags to their respective regexes.
|
// ParamTagRegexMap maps param tags to their respective regexes.
|
||||||
|
@ -66,6 +79,8 @@ var ParamTagRegexMap = map[string]*regexp.Regexp{
|
||||||
"in": regexp.MustCompile(`^in\((.*)\)`),
|
"in": regexp.MustCompile(`^in\((.*)\)`),
|
||||||
"matches": regexp.MustCompile(`^matches\((.+)\)$`),
|
"matches": regexp.MustCompile(`^matches\((.+)\)$`),
|
||||||
"rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"),
|
"rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"),
|
||||||
|
"minstringlength": regexp.MustCompile("^minstringlength\\((\\d+)\\)$"),
|
||||||
|
"maxstringlength": regexp.MustCompile("^maxstringlength\\((\\d+)\\)$"),
|
||||||
}
|
}
|
||||||
|
|
||||||
type customTypeTagMap struct {
|
type customTypeTagMap struct {
|
||||||
|
@ -114,6 +129,7 @@ var TagMap = map[string]Validator{
|
||||||
"int": IsInt,
|
"int": IsInt,
|
||||||
"float": IsFloat,
|
"float": IsFloat,
|
||||||
"null": IsNull,
|
"null": IsNull,
|
||||||
|
"notnull": IsNotNull,
|
||||||
"uuid": IsUUID,
|
"uuid": IsUUID,
|
||||||
"uuidv3": IsUUIDv3,
|
"uuidv3": IsUUIDv3,
|
||||||
"uuidv4": IsUUIDv4,
|
"uuidv4": IsUUIDv4,
|
||||||
|
@ -146,6 +162,7 @@ var TagMap = map[string]Validator{
|
||||||
"ISO3166Alpha2": IsISO3166Alpha2,
|
"ISO3166Alpha2": IsISO3166Alpha2,
|
||||||
"ISO3166Alpha3": IsISO3166Alpha3,
|
"ISO3166Alpha3": IsISO3166Alpha3,
|
||||||
"ISO4217": IsISO4217,
|
"ISO4217": IsISO4217,
|
||||||
|
"IMEI": IsIMEI,
|
||||||
}
|
}
|
||||||
|
|
||||||
// ISO3166Entry stores country codes
|
// ISO3166Entry stores country codes
|
||||||
|
|
46
vendor/github.com/asaskevich/govalidator/utils.go
generated
vendored
46
vendor/github.com/asaskevich/govalidator/utils.go
generated
vendored
|
@ -12,20 +12,20 @@ import (
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Contains check if the string contains the substring.
|
// Contains checks if the string contains the substring.
|
||||||
func Contains(str, substring string) bool {
|
func Contains(str, substring string) bool {
|
||||||
return strings.Contains(str, substring)
|
return strings.Contains(str, substring)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Matches check if string matches the pattern (pattern is regular expression)
|
// Matches checks if string matches the pattern (pattern is regular expression)
|
||||||
// In case of error return false
|
// In case of error return false
|
||||||
func Matches(str, pattern string) bool {
|
func Matches(str, pattern string) bool {
|
||||||
match, _ := regexp.MatchString(pattern, str)
|
match, _ := regexp.MatchString(pattern, str)
|
||||||
return match
|
return match
|
||||||
}
|
}
|
||||||
|
|
||||||
// LeftTrim trim characters from the left-side of the input.
|
// LeftTrim trims characters from the left side of the input.
|
||||||
// If second argument is empty, it's will be remove leading spaces.
|
// If second argument is empty, it will remove leading spaces.
|
||||||
func LeftTrim(str, chars string) string {
|
func LeftTrim(str, chars string) string {
|
||||||
if chars == "" {
|
if chars == "" {
|
||||||
return strings.TrimLeftFunc(str, unicode.IsSpace)
|
return strings.TrimLeftFunc(str, unicode.IsSpace)
|
||||||
|
@ -34,8 +34,8 @@ func LeftTrim(str, chars string) string {
|
||||||
return r.ReplaceAllString(str, "")
|
return r.ReplaceAllString(str, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// RightTrim trim characters from the right-side of the input.
|
// RightTrim trims characters from the right side of the input.
|
||||||
// If second argument is empty, it's will be remove spaces.
|
// If second argument is empty, it will remove trailing spaces.
|
||||||
func RightTrim(str, chars string) string {
|
func RightTrim(str, chars string) string {
|
||||||
if chars == "" {
|
if chars == "" {
|
||||||
return strings.TrimRightFunc(str, unicode.IsSpace)
|
return strings.TrimRightFunc(str, unicode.IsSpace)
|
||||||
|
@ -44,27 +44,27 @@ func RightTrim(str, chars string) string {
|
||||||
return r.ReplaceAllString(str, "")
|
return r.ReplaceAllString(str, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Trim trim characters from both sides of the input.
|
// Trim trims characters from both sides of the input.
|
||||||
// If second argument is empty, it's will be remove spaces.
|
// If second argument is empty, it will remove spaces.
|
||||||
func Trim(str, chars string) string {
|
func Trim(str, chars string) string {
|
||||||
return LeftTrim(RightTrim(str, chars), chars)
|
return LeftTrim(RightTrim(str, chars), chars)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WhiteList remove characters that do not appear in the whitelist.
|
// WhiteList removes characters that do not appear in the whitelist.
|
||||||
func WhiteList(str, chars string) string {
|
func WhiteList(str, chars string) string {
|
||||||
pattern := "[^" + chars + "]+"
|
pattern := "[^" + chars + "]+"
|
||||||
r, _ := regexp.Compile(pattern)
|
r, _ := regexp.Compile(pattern)
|
||||||
return r.ReplaceAllString(str, "")
|
return r.ReplaceAllString(str, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// BlackList remove characters that appear in the blacklist.
|
// BlackList removes characters that appear in the blacklist.
|
||||||
func BlackList(str, chars string) string {
|
func BlackList(str, chars string) string {
|
||||||
pattern := "[" + chars + "]+"
|
pattern := "[" + chars + "]+"
|
||||||
r, _ := regexp.Compile(pattern)
|
r, _ := regexp.Compile(pattern)
|
||||||
return r.ReplaceAllString(str, "")
|
return r.ReplaceAllString(str, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// StripLow remove characters with a numerical value < 32 and 127, mostly control characters.
|
// StripLow removes characters with a numerical value < 32 and 127, mostly control characters.
|
||||||
// If keep_new_lines is true, newline characters are preserved (\n and \r, hex 0xA and 0xD).
|
// If keep_new_lines is true, newline characters are preserved (\n and \r, hex 0xA and 0xD).
|
||||||
func StripLow(str string, keepNewLines bool) string {
|
func StripLow(str string, keepNewLines bool) string {
|
||||||
chars := ""
|
chars := ""
|
||||||
|
@ -76,13 +76,13 @@ func StripLow(str string, keepNewLines bool) string {
|
||||||
return BlackList(str, chars)
|
return BlackList(str, chars)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReplacePattern replace regular expression pattern in string
|
// ReplacePattern replaces regular expression pattern in string
|
||||||
func ReplacePattern(str, pattern, replace string) string {
|
func ReplacePattern(str, pattern, replace string) string {
|
||||||
r, _ := regexp.Compile(pattern)
|
r, _ := regexp.Compile(pattern)
|
||||||
return r.ReplaceAllString(str, replace)
|
return r.ReplaceAllString(str, replace)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Escape replace <, >, & and " with HTML entities.
|
// Escape replaces <, >, & and " with HTML entities.
|
||||||
var Escape = html.EscapeString
|
var Escape = html.EscapeString
|
||||||
|
|
||||||
func addSegment(inrune, segment []rune) []rune {
|
func addSegment(inrune, segment []rune) []rune {
|
||||||
|
@ -120,7 +120,7 @@ func CamelCaseToUnderscore(str string) string {
|
||||||
return string(output)
|
return string(output)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reverse return reversed string
|
// Reverse returns reversed string
|
||||||
func Reverse(s string) string {
|
func Reverse(s string) string {
|
||||||
r := []rune(s)
|
r := []rune(s)
|
||||||
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
|
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
|
||||||
|
@ -129,12 +129,12 @@ func Reverse(s string) string {
|
||||||
return string(r)
|
return string(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetLines split string by "\n" and return array of lines
|
// GetLines splits string by "\n" and return array of lines
|
||||||
func GetLines(s string) []string {
|
func GetLines(s string) []string {
|
||||||
return strings.Split(s, "\n")
|
return strings.Split(s, "\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetLine return specified line of multiline string
|
// GetLine returns specified line of multiline string
|
||||||
func GetLine(s string, index int) (string, error) {
|
func GetLine(s string, index int) (string, error) {
|
||||||
lines := GetLines(s)
|
lines := GetLines(s)
|
||||||
if index < 0 || index >= len(lines) {
|
if index < 0 || index >= len(lines) {
|
||||||
|
@ -143,12 +143,12 @@ func GetLine(s string, index int) (string, error) {
|
||||||
return lines[index], nil
|
return lines[index], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveTags remove all tags from HTML string
|
// RemoveTags removes all tags from HTML string
|
||||||
func RemoveTags(s string) string {
|
func RemoveTags(s string) string {
|
||||||
return ReplacePattern(s, "<[^>]*>", "")
|
return ReplacePattern(s, "<[^>]*>", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// SafeFileName return safe string that can be used in file names
|
// SafeFileName returns safe string that can be used in file names
|
||||||
func SafeFileName(str string) string {
|
func SafeFileName(str string) string {
|
||||||
name := strings.ToLower(str)
|
name := strings.ToLower(str)
|
||||||
name = path.Clean(path.Base(name))
|
name = path.Clean(path.Base(name))
|
||||||
|
@ -210,23 +210,23 @@ func Truncate(str string, length int, ending string) string {
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
// PadLeft pad left side of string if size of string is less then indicated pad length
|
// PadLeft pads left side of a string if size of string is less then indicated pad length
|
||||||
func PadLeft(str string, padStr string, padLen int) string {
|
func PadLeft(str string, padStr string, padLen int) string {
|
||||||
return buildPadStr(str, padStr, padLen, true, false)
|
return buildPadStr(str, padStr, padLen, true, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PadRight pad right side of string if size of string is less then indicated pad length
|
// PadRight pads right side of a string if size of string is less then indicated pad length
|
||||||
func PadRight(str string, padStr string, padLen int) string {
|
func PadRight(str string, padStr string, padLen int) string {
|
||||||
return buildPadStr(str, padStr, padLen, false, true)
|
return buildPadStr(str, padStr, padLen, false, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PadBoth pad sides of string if size of string is less then indicated pad length
|
// PadBoth pads both sides of a string if size of string is less then indicated pad length
|
||||||
func PadBoth(str string, padStr string, padLen int) string {
|
func PadBoth(str string, padStr string, padLen int) string {
|
||||||
return buildPadStr(str, padStr, padLen, true, true)
|
return buildPadStr(str, padStr, padLen, true, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PadString either left, right or both sides, not the padding string can be unicode and more then one
|
// PadString either left, right or both sides.
|
||||||
// character
|
// Note that padding string can be unicode and more then one character
|
||||||
func buildPadStr(str string, padStr string, padLen int, padLeft bool, padRight bool) string {
|
func buildPadStr(str string, padStr string, padLen int, padLeft bool, padRight bool) string {
|
||||||
|
|
||||||
// When padded length is less then the current string size
|
// When padded length is less then the current string size
|
||||||
|
|
318
vendor/github.com/asaskevich/govalidator/validator.go
generated
vendored
318
vendor/github.com/asaskevich/govalidator/validator.go
generated
vendored
|
@ -282,7 +282,7 @@ func HasLowerCase(str string) bool {
|
||||||
return rxHasLowerCase.MatchString(str)
|
return rxHasLowerCase.MatchString(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasUpperCase check if the string contians as least 1 uppercase. Empty string is valid.
|
// HasUpperCase check if the string contains as least 1 uppercase. Empty string is valid.
|
||||||
func HasUpperCase(str string) bool {
|
func HasUpperCase(str string) bool {
|
||||||
if IsNull(str) {
|
if IsNull(str) {
|
||||||
return true
|
return true
|
||||||
|
@ -321,14 +321,19 @@ func IsNull(str string) bool {
|
||||||
return len(str) == 0
|
return len(str) == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsNotNull check if the string is not null.
|
||||||
|
func IsNotNull(str string) bool {
|
||||||
|
return !IsNull(str)
|
||||||
|
}
|
||||||
|
|
||||||
// HasWhitespaceOnly checks the string only contains whitespace
|
// HasWhitespaceOnly checks the string only contains whitespace
|
||||||
func HasWhitespaceOnly(str string) bool {
|
func HasWhitespaceOnly(str string) bool {
|
||||||
return len(str) > 0 && rxHasWhitespaceOnly.MatchString(str)
|
return len(str) > 0 && rxHasWhitespaceOnly.MatchString(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasWhitespace checks if the string contains any whitespace
|
// HasWhitespace checks if the string contains any whitespace
|
||||||
func HasWhitespace(str string) bool {
|
func HasWhitespace(str string) bool {
|
||||||
return len(str) > 0 && rxHasWhitespace.MatchString(str)
|
return len(str) > 0 && rxHasWhitespace.MatchString(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsByteLength check if the string's length (in bytes) falls in a range.
|
// IsByteLength check if the string's length (in bytes) falls in a range.
|
||||||
|
@ -513,6 +518,11 @@ func IsDataURI(str string) bool {
|
||||||
return IsBase64(dataURI[1])
|
return IsBase64(dataURI[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsMagnetURI checks if a string is valid magnet URI
|
||||||
|
func IsMagnetURI(str string) bool {
|
||||||
|
return rxMagnetURI.MatchString(str)
|
||||||
|
}
|
||||||
|
|
||||||
// IsISO3166Alpha2 checks if a string is valid two-letter country code
|
// IsISO3166Alpha2 checks if a string is valid two-letter country code
|
||||||
func IsISO3166Alpha2(str string) bool {
|
func IsISO3166Alpha2(str string) bool {
|
||||||
for _, entry := range ISO3166List {
|
for _, entry := range ISO3166List {
|
||||||
|
@ -565,7 +575,7 @@ func IsDNSName(str string) bool {
|
||||||
// IsHash checks if a string is a hash of type algorithm.
|
// IsHash checks if a string is a hash of type algorithm.
|
||||||
// Algorithm is one of ['md4', 'md5', 'sha1', 'sha256', 'sha384', 'sha512', 'ripemd128', 'ripemd160', 'tiger128', 'tiger160', 'tiger192', 'crc32', 'crc32b']
|
// Algorithm is one of ['md4', 'md5', 'sha1', 'sha256', 'sha384', 'sha512', 'ripemd128', 'ripemd160', 'tiger128', 'tiger160', 'tiger192', 'crc32', 'crc32b']
|
||||||
func IsHash(str string, algorithm string) bool {
|
func IsHash(str string, algorithm string) bool {
|
||||||
len := "0"
|
var len string
|
||||||
algo := strings.ToLower(algorithm)
|
algo := strings.ToLower(algorithm)
|
||||||
|
|
||||||
if algo == "crc32" || algo == "crc32b" {
|
if algo == "crc32" || algo == "crc32b" {
|
||||||
|
@ -589,9 +599,73 @@ func IsHash(str string, algorithm string) bool {
|
||||||
return Matches(str, "^[a-f0-9]{"+len+"}$")
|
return Matches(str, "^[a-f0-9]{"+len+"}$")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsSHA512 checks is a string is a SHA512 hash. Alias for `IsHash(str, "sha512")`
|
||||||
|
func IsSHA512(str string) bool {
|
||||||
|
return IsHash(str, "sha512")
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSHA384 checks is a string is a SHA384 hash. Alias for `IsHash(str, "sha384")`
|
||||||
|
func IsSHA384(str string) bool {
|
||||||
|
return IsHash(str, "sha384")
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSHA256 checks is a string is a SHA256 hash. Alias for `IsHash(str, "sha256")`
|
||||||
|
func IsSHA256(str string) bool {
|
||||||
|
return IsHash(str, "sha256")
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsTiger192 checks is a string is a Tiger192 hash. Alias for `IsHash(str, "tiger192")`
|
||||||
|
func IsTiger192(str string) bool {
|
||||||
|
return IsHash(str, "tiger192")
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsTiger160 checks is a string is a Tiger160 hash. Alias for `IsHash(str, "tiger160")`
|
||||||
|
func IsTiger160(str string) bool {
|
||||||
|
return IsHash(str, "tiger160")
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsRipeMD160 checks is a string is a RipeMD160 hash. Alias for `IsHash(str, "ripemd160")`
|
||||||
|
func IsRipeMD160(str string) bool {
|
||||||
|
return IsHash(str, "ripemd160")
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSHA1 checks is a string is a SHA-1 hash. Alias for `IsHash(str, "sha1")`
|
||||||
|
func IsSHA1(str string) bool {
|
||||||
|
return IsHash(str, "sha1")
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsTiger128 checks is a string is a Tiger128 hash. Alias for `IsHash(str, "tiger128")`
|
||||||
|
func IsTiger128(str string) bool {
|
||||||
|
return IsHash(str, "tiger128")
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsRipeMD128 checks is a string is a RipeMD128 hash. Alias for `IsHash(str, "ripemd128")`
|
||||||
|
func IsRipeMD128(str string) bool {
|
||||||
|
return IsHash(str, "ripemd128")
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsCRC32 checks is a string is a CRC32 hash. Alias for `IsHash(str, "crc32")`
|
||||||
|
func IsCRC32(str string) bool {
|
||||||
|
return IsHash(str, "crc32")
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsCRC32b checks is a string is a CRC32b hash. Alias for `IsHash(str, "crc32b")`
|
||||||
|
func IsCRC32b(str string) bool {
|
||||||
|
return IsHash(str, "crc32b")
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsMD5 checks is a string is a MD5 hash. Alias for `IsHash(str, "md5")`
|
||||||
|
func IsMD5(str string) bool {
|
||||||
|
return IsHash(str, "md5")
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsMD4 checks is a string is a MD4 hash. Alias for `IsHash(str, "md4")`
|
||||||
|
func IsMD4(str string) bool {
|
||||||
|
return IsHash(str, "md4")
|
||||||
|
}
|
||||||
|
|
||||||
// IsDialString validates the given string for usage with the various Dial() functions
|
// IsDialString validates the given string for usage with the various Dial() functions
|
||||||
func IsDialString(str string) bool {
|
func IsDialString(str string) bool {
|
||||||
|
|
||||||
if h, p, err := net.SplitHostPort(str); err == nil && h != "" && p != "" && (IsDNSName(h) || IsIP(h)) && IsPort(p) {
|
if h, p, err := net.SplitHostPort(str); err == nil && h != "" && p != "" && (IsDNSName(h) || IsIP(h)) && IsPort(p) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -599,7 +673,7 @@ func IsDialString(str string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsIP checks if a string is either IP version 4 or 6.
|
// IsIP checks if a string is either IP version 4 or 6. Alias for `net.ParseIP`
|
||||||
func IsIP(str string) bool {
|
func IsIP(str string) bool {
|
||||||
return net.ParseIP(str) != nil
|
return net.ParseIP(str) != nil
|
||||||
}
|
}
|
||||||
|
@ -663,6 +737,11 @@ func IsLongitude(str string) bool {
|
||||||
return rxLongitude.MatchString(str)
|
return rxLongitude.MatchString(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsIMEI check if a string is valid IMEI
|
||||||
|
func IsIMEI(str string) bool {
|
||||||
|
return rxIMEI.MatchString(str)
|
||||||
|
}
|
||||||
|
|
||||||
// IsRsaPublicKey check if a string is valid public key with provided length
|
// IsRsaPublicKey check if a string is valid public key with provided length
|
||||||
func IsRsaPublicKey(str string, keylen int) bool {
|
func IsRsaPublicKey(str string, keylen int) bool {
|
||||||
bb := bytes.NewBufferString(str)
|
bb := bytes.NewBufferString(str)
|
||||||
|
@ -729,12 +808,116 @@ func PrependPathToErrors(err error, path string) error {
|
||||||
}
|
}
|
||||||
return err2
|
return err2
|
||||||
}
|
}
|
||||||
fmt.Println(err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ValidateMap use validation map for fields.
|
||||||
|
// result will be equal to `false` if there are any errors.
|
||||||
|
// s is the map containing the data to be validated.
|
||||||
|
// m is the validation map in the form:
|
||||||
|
// map[string]interface{}{"name":"required,alpha","address":map[string]interface{}{"line1":"required,alphanum"}}
|
||||||
|
func ValidateMap(s map[string]interface{}, m map[string]interface{}) (bool, error) {
|
||||||
|
if s == nil {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
result := true
|
||||||
|
var err error
|
||||||
|
var errs Errors
|
||||||
|
var index int
|
||||||
|
val := reflect.ValueOf(s)
|
||||||
|
for key, value := range s {
|
||||||
|
presentResult := true
|
||||||
|
validator, ok := m[key]
|
||||||
|
if !ok {
|
||||||
|
presentResult = false
|
||||||
|
var err error
|
||||||
|
err = fmt.Errorf("all map keys has to be present in the validation map; got %s", key)
|
||||||
|
err = PrependPathToErrors(err, key)
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
valueField := reflect.ValueOf(value)
|
||||||
|
mapResult := true
|
||||||
|
typeResult := true
|
||||||
|
structResult := true
|
||||||
|
resultField := true
|
||||||
|
switch subValidator := validator.(type) {
|
||||||
|
case map[string]interface{}:
|
||||||
|
var err error
|
||||||
|
if v, ok := value.(map[string]interface{}); !ok {
|
||||||
|
mapResult = false
|
||||||
|
err = fmt.Errorf("map validator has to be for the map type only; got %s", valueField.Type().String())
|
||||||
|
err = PrependPathToErrors(err, key)
|
||||||
|
errs = append(errs, err)
|
||||||
|
} else {
|
||||||
|
mapResult, err = ValidateMap(v, subValidator)
|
||||||
|
if err != nil {
|
||||||
|
mapResult = false
|
||||||
|
err = PrependPathToErrors(err, key)
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case string:
|
||||||
|
if (valueField.Kind() == reflect.Struct ||
|
||||||
|
(valueField.Kind() == reflect.Ptr && valueField.Elem().Kind() == reflect.Struct)) &&
|
||||||
|
subValidator != "-" {
|
||||||
|
var err error
|
||||||
|
structResult, err = ValidateStruct(valueField.Interface())
|
||||||
|
if err != nil {
|
||||||
|
err = PrependPathToErrors(err, key)
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resultField, err = typeCheck(valueField, reflect.StructField{
|
||||||
|
Name: key,
|
||||||
|
PkgPath: "",
|
||||||
|
Type: val.Type(),
|
||||||
|
Tag: reflect.StructTag(fmt.Sprintf("%s:%q", tagName, subValidator)),
|
||||||
|
Offset: 0,
|
||||||
|
Index: []int{index},
|
||||||
|
Anonymous: false,
|
||||||
|
}, val, nil)
|
||||||
|
if err != nil {
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
case nil:
|
||||||
|
// already handlerd when checked before
|
||||||
|
default:
|
||||||
|
typeResult = false
|
||||||
|
err = fmt.Errorf("map validator has to be either map[string]interface{} or string; got %s", valueField.Type().String())
|
||||||
|
err = PrependPathToErrors(err, key)
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
result = result && presentResult && typeResult && resultField && structResult && mapResult
|
||||||
|
index++
|
||||||
|
}
|
||||||
|
// check required keys
|
||||||
|
requiredResult := true
|
||||||
|
for key, value := range m {
|
||||||
|
if schema, ok := value.(string); ok {
|
||||||
|
tags := parseTagIntoMap(schema)
|
||||||
|
if required, ok := tags["required"]; ok {
|
||||||
|
if _, ok := s[key]; !ok {
|
||||||
|
requiredResult = false
|
||||||
|
if required.customErrorMessage != "" {
|
||||||
|
err = Error{key, fmt.Errorf(required.customErrorMessage), true, "required", []string{}}
|
||||||
|
} else {
|
||||||
|
err = Error{key, fmt.Errorf("required field missing"), false, "required", []string{}}
|
||||||
|
}
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(errs) > 0 {
|
||||||
|
err = errs
|
||||||
|
}
|
||||||
|
return result && requiredResult, err
|
||||||
|
}
|
||||||
|
|
||||||
// ValidateStruct use tags for fields.
|
// ValidateStruct use tags for fields.
|
||||||
// result will be equal to `false` if there are any errors.
|
// result will be equal to `false` if there are any errors.
|
||||||
|
// todo currently there is no guarantee that errors will be returned in predictable order (tests may to fail)
|
||||||
func ValidateStruct(s interface{}) (bool, error) {
|
func ValidateStruct(s interface{}) (bool, error) {
|
||||||
if s == nil {
|
if s == nil {
|
||||||
return true, nil
|
return true, nil
|
||||||
|
@ -856,12 +1039,29 @@ func IsSemver(str string) bool {
|
||||||
return rxSemver.MatchString(str)
|
return rxSemver.MatchString(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsType check if interface is of some type
|
||||||
|
func IsType(v interface{}, params ...string) bool {
|
||||||
|
if len(params) == 1 {
|
||||||
|
typ := params[0]
|
||||||
|
return strings.Replace(reflect.TypeOf(v).String(), " ", "", -1) == strings.Replace(typ, " ", "", -1)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// IsTime check if string is valid according to given format
|
// IsTime check if string is valid according to given format
|
||||||
func IsTime(str string, format string) bool {
|
func IsTime(str string, format string) bool {
|
||||||
_, err := time.Parse(format, str)
|
_, err := time.Parse(format, str)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsUnixTime check if string is valid unix timestamp value
|
||||||
|
func IsUnixTime(str string) bool {
|
||||||
|
if _, err := strconv.Atoi(str); err == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// IsRFC3339 check if string is valid timestamp value according to RFC3339
|
// IsRFC3339 check if string is valid timestamp value according to RFC3339
|
||||||
func IsRFC3339(str string) bool {
|
func IsRFC3339(str string) bool {
|
||||||
return IsTime(str, time.RFC3339)
|
return IsTime(str, time.RFC3339)
|
||||||
|
@ -933,6 +1133,30 @@ func StringLength(str string, params ...string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MinStringLength check string's minimum length (including multi byte strings)
|
||||||
|
func MinStringLength(str string, params ...string) bool {
|
||||||
|
|
||||||
|
if len(params) == 1 {
|
||||||
|
strLength := utf8.RuneCountInString(str)
|
||||||
|
min, _ := ToInt(params[0])
|
||||||
|
return strLength >= int(min)
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// MaxStringLength check string's maximum length (including multi byte strings)
|
||||||
|
func MaxStringLength(str string, params ...string) bool {
|
||||||
|
|
||||||
|
if len(params) == 1 {
|
||||||
|
strLength := utf8.RuneCountInString(str)
|
||||||
|
max, _ := ToInt(params[0])
|
||||||
|
return strLength <= int(max)
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// Range check string's length
|
// Range check string's length
|
||||||
func Range(str string, params ...string) bool {
|
func Range(str string, params ...string) bool {
|
||||||
if len(params) == 2 {
|
if len(params) == 2 {
|
||||||
|
@ -945,7 +1169,7 @@ func Range(str string, params ...string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func isInRaw(str string, params ...string) bool {
|
func IsInRaw(str string, params ...string) bool {
|
||||||
if len(params) == 1 {
|
if len(params) == 1 {
|
||||||
rawParams := params[0]
|
rawParams := params[0]
|
||||||
|
|
||||||
|
@ -1014,7 +1238,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options
|
||||||
options = parseTagIntoMap(tag)
|
options = parseTagIntoMap(tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
if isEmptyValue(v) {
|
if !isFieldSet(v) {
|
||||||
// an empty value is not validated, check only required
|
// an empty value is not validated, check only required
|
||||||
isValid, resultErr = checkRequired(v, t, options)
|
isValid, resultErr = checkRequired(v, t, options)
|
||||||
for key := range options {
|
for key := range options {
|
||||||
|
@ -1062,6 +1286,45 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, validatorSpec := range optionsOrder {
|
||||||
|
validatorStruct := options[validatorSpec]
|
||||||
|
var negate bool
|
||||||
|
validator := validatorSpec
|
||||||
|
customMsgExists := len(validatorStruct.customErrorMessage) > 0
|
||||||
|
|
||||||
|
// Check whether the tag looks like '!something' or 'something'
|
||||||
|
if validator[0] == '!' {
|
||||||
|
validator = validator[1:]
|
||||||
|
negate = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for interface param validators
|
||||||
|
for key, value := range InterfaceParamTagRegexMap {
|
||||||
|
ps := value.FindStringSubmatch(validator)
|
||||||
|
if len(ps) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
validatefunc, ok := InterfaceParamTagMap[key]
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
delete(options, validatorSpec)
|
||||||
|
|
||||||
|
field := fmt.Sprint(v)
|
||||||
|
if result := validatefunc(v.Interface(), ps[1:]...); (!result && !negate) || (result && negate) {
|
||||||
|
if customMsgExists {
|
||||||
|
return false, Error{t.Name, TruncatingErrorf(validatorStruct.customErrorMessage, field, validator), customMsgExists, stripParams(validatorSpec), []string{}}
|
||||||
|
}
|
||||||
|
if negate {
|
||||||
|
return false, Error{t.Name, fmt.Errorf("%s does validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}}
|
||||||
|
}
|
||||||
|
return false, Error{t.Name, fmt.Errorf("%s does not validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch v.Kind() {
|
switch v.Kind() {
|
||||||
case reflect.Bool,
|
case reflect.Bool,
|
||||||
reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
|
reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
|
||||||
|
@ -1121,10 +1384,10 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options
|
||||||
delete(options, validatorSpec)
|
delete(options, validatorSpec)
|
||||||
|
|
||||||
switch v.Kind() {
|
switch v.Kind() {
|
||||||
case reflect.String,
|
case reflect.String,
|
||||||
reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
|
reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
|
||||||
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
|
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
|
||||||
reflect.Float32, reflect.Float64:
|
reflect.Float32, reflect.Float64:
|
||||||
field := fmt.Sprint(v) // make value into string, then validate with regex
|
field := fmt.Sprint(v) // make value into string, then validate with regex
|
||||||
if result := validatefunc(field); !result && !negate || result && negate {
|
if result := validatefunc(field); !result && !negate || result && negate {
|
||||||
if customMsgExists {
|
if customMsgExists {
|
||||||
|
@ -1202,7 +1465,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options
|
||||||
}
|
}
|
||||||
return typeCheck(v.Elem(), t, o, options)
|
return typeCheck(v.Elem(), t, o, options)
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
return ValidateStruct(v.Interface())
|
return true, nil
|
||||||
default:
|
default:
|
||||||
return false, &UnsupportedTypeError{v.Type()}
|
return false, &UnsupportedTypeError{v.Type()}
|
||||||
}
|
}
|
||||||
|
@ -1212,25 +1475,14 @@ func stripParams(validatorString string) string {
|
||||||
return paramsRegexp.ReplaceAllString(validatorString, "")
|
return paramsRegexp.ReplaceAllString(validatorString, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
func isEmptyValue(v reflect.Value) bool {
|
// isFieldSet returns false for nil pointers, interfaces, maps, and slices. For all other values, it returns true.
|
||||||
|
func isFieldSet(v reflect.Value) bool {
|
||||||
switch v.Kind() {
|
switch v.Kind() {
|
||||||
case reflect.String, reflect.Array:
|
case reflect.Map, reflect.Slice, reflect.Interface, reflect.Ptr:
|
||||||
return v.Len() == 0
|
return !v.IsNil()
|
||||||
case reflect.Map, reflect.Slice:
|
|
||||||
return v.Len() == 0 || v.IsNil()
|
|
||||||
case reflect.Bool:
|
|
||||||
return !v.Bool()
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
return v.Int() == 0
|
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
|
||||||
return v.Uint() == 0
|
|
||||||
case reflect.Float32, reflect.Float64:
|
|
||||||
return v.Float() == 0
|
|
||||||
case reflect.Interface, reflect.Ptr:
|
|
||||||
return v.IsNil()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface())
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// ErrorByField returns error for specified field of the struct
|
// ErrorByField returns error for specified field of the struct
|
||||||
|
@ -1252,11 +1504,11 @@ func ErrorsByField(e error) map[string]string {
|
||||||
}
|
}
|
||||||
// prototype for ValidateStruct
|
// prototype for ValidateStruct
|
||||||
|
|
||||||
switch e.(type) {
|
switch e := e.(type) {
|
||||||
case Error:
|
case Error:
|
||||||
m[e.(Error).Name] = e.(Error).Err.Error()
|
m[e.Name] = e.Err.Error()
|
||||||
case Errors:
|
case Errors:
|
||||||
for _, item := range e.(Errors).Errors() {
|
for _, item := range e.Errors() {
|
||||||
n := ErrorsByField(item)
|
n := ErrorsByField(item)
|
||||||
for k, v := range n {
|
for k, v := range n {
|
||||||
m[k] = v
|
m[k] = v
|
||||||
|
|
2
vendor/github.com/asaskevich/govalidator/wercker.yml
generated
vendored
2
vendor/github.com/asaskevich/govalidator/wercker.yml
generated
vendored
|
@ -12,4 +12,4 @@ build:
|
||||||
- script:
|
- script:
|
||||||
name: go test
|
name: go test
|
||||||
code: |
|
code: |
|
||||||
go test -race ./...
|
go test -race -v ./...
|
||||||
|
|
2
vendor/modules.txt
vendored
2
vendor/modules.txt
vendored
|
@ -18,7 +18,7 @@ github.com/PuerkitoBio/urlesc
|
||||||
# github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
|
# github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
|
||||||
github.com/alecthomas/template
|
github.com/alecthomas/template
|
||||||
github.com/alecthomas/template/parse
|
github.com/alecthomas/template/parse
|
||||||
# github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a
|
# github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535
|
||||||
github.com/asaskevich/govalidator
|
github.com/asaskevich/govalidator
|
||||||
# github.com/beevik/etree v1.1.0
|
# github.com/beevik/etree v1.1.0
|
||||||
github.com/beevik/etree
|
github.com/beevik/etree
|
||||||
|
|
Loading…
Reference in New Issue
Block a user