mirror of
https://github.com/datarhei/core.git
synced 2025-10-06 08:27:08 +08:00
Update dependencies
This commit is contained in:
4
vendor/github.com/go-playground/locales/README.md
generated
vendored
4
vendor/github.com/go-playground/locales/README.md
generated
vendored
@@ -1,10 +1,8 @@
|
||||
## locales
|
||||
<img align="right" src="https://raw.githubusercontent.com/go-playground/locales/master/logo.png">
|
||||
<img align="right" src="https://raw.githubusercontent.com/go-playground/locales/master/logo.png">
|
||||
[](https://travis-ci.org/go-playground/locales)
|
||||
[](https://goreportcard.com/report/github.com/go-playground/locales)
|
||||
[](https://godoc.org/github.com/go-playground/locales)
|
||||

|
||||
[](https://gitter.im/go-playground/locales?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
||||
|
||||
Locales is a set of locales generated from the [Unicode CLDR Project](http://cldr.unicode.org/) which can be used independently or within
|
||||
an i18n package; these were built for use with, but not exclusive to, [Universal Translator](https://github.com/go-playground/universal-translator).
|
||||
|
4
vendor/github.com/go-playground/universal-translator/README.md
generated
vendored
4
vendor/github.com/go-playground/universal-translator/README.md
generated
vendored
@@ -1,11 +1,9 @@
|
||||
## universal-translator
|
||||
<img align="right" src="https://raw.githubusercontent.com/go-playground/universal-translator/master/logo.png">
|
||||
[](https://travis-ci.org/go-playground/universal-translator)
|
||||
<img align="right" src="https://raw.githubusercontent.com/go-playground/universal-translator/master/logo.png">
|
||||
[](https://coveralls.io/github/go-playground/universal-translator)
|
||||
[](https://goreportcard.com/report/github.com/go-playground/universal-translator)
|
||||
[](https://godoc.org/github.com/go-playground/universal-translator)
|
||||

|
||||
[](https://gitter.im/go-playground/universal-translator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
||||
|
||||
Universal Translator is an i18n Translator for Go/Golang using CLDR data + pluralization rules
|
||||
|
||||
|
6
vendor/github.com/go-playground/universal-translator/import_export.go
generated
vendored
6
vendor/github.com/go-playground/universal-translator/import_export.go
generated
vendored
@@ -3,7 +3,6 @@ package ut
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
@@ -41,7 +40,6 @@ const (
|
||||
func (t *UniversalTranslator) Export(format ImportExportFormat, dirname string) error {
|
||||
|
||||
_, err := os.Stat(dirname)
|
||||
fmt.Println(dirname, err, os.IsNotExist(err))
|
||||
if err != nil {
|
||||
|
||||
if !os.IsNotExist(err) {
|
||||
@@ -138,7 +136,7 @@ func (t *UniversalTranslator) Export(format ImportExportFormat, dirname string)
|
||||
return err
|
||||
}
|
||||
|
||||
err = ioutil.WriteFile(filepath.Join(dirname, fmt.Sprintf("%s%s", locale.Locale(), ext)), b, 0644)
|
||||
err = os.WriteFile(filepath.Join(dirname, fmt.Sprintf("%s%s", locale.Locale(), ext)), b, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -200,7 +198,7 @@ func (t *UniversalTranslator) Import(format ImportExportFormat, dirnameOrFilenam
|
||||
// NOTE: generally used when assets have been embedded into the binary and are already in memory.
|
||||
func (t *UniversalTranslator) ImportByReader(format ImportExportFormat, reader io.Reader) error {
|
||||
|
||||
b, err := ioutil.ReadAll(reader)
|
||||
b, err := io.ReadAll(reader)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
2
vendor/github.com/go-playground/validator/v10/.gitignore
generated
vendored
2
vendor/github.com/go-playground/validator/v10/.gitignore
generated
vendored
@@ -26,5 +26,7 @@ _testmain.go
|
||||
*.test
|
||||
*.out
|
||||
*.txt
|
||||
/**/*.DS_Store
|
||||
cover.html
|
||||
README.html
|
||||
.idea
|
||||
|
2
vendor/github.com/go-playground/validator/v10/Makefile
generated
vendored
2
vendor/github.com/go-playground/validator/v10/Makefile
generated
vendored
@@ -13,6 +13,6 @@ test:
|
||||
$(GOCMD) test -cover -race ./...
|
||||
|
||||
bench:
|
||||
$(GOCMD) test -bench=. -benchmem ./...
|
||||
$(GOCMD) test -run=NONE -bench=. -benchmem ./...
|
||||
|
||||
.PHONY: test lint linters-install
|
161
vendor/github.com/go-playground/validator/v10/README.md
generated
vendored
161
vendor/github.com/go-playground/validator/v10/README.md
generated
vendored
@@ -1,7 +1,7 @@
|
||||
Package validator
|
||||
=================
|
||||
<img align="right" src="https://raw.githubusercontent.com/go-playground/validator/v9/logo.png">[](https://gitter.im/go-playground/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||

|
||||
<img align="right" src="logo.png">[](https://gitter.im/go-playground/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||

|
||||
[](https://travis-ci.org/go-playground/validator)
|
||||
[](https://coveralls.io/github/go-playground/validator?branch=master)
|
||||
[](https://goreportcard.com/report/github.com/go-playground/validator)
|
||||
@@ -67,14 +67,20 @@ Please see https://pkg.go.dev/github.com/go-playground/validator/v10 for detaile
|
||||
Baked-in Validations
|
||||
------
|
||||
|
||||
### Special Notes:
|
||||
- If new to using validator it is highly recommended to initialize it using the `WithRequiredStructEnabled` option which is opt-in to new behaviour that will become the default behaviour in v11+. See documentation for more details.
|
||||
```go
|
||||
validate := validator.New(validator.WithRequiredStructEnabled())
|
||||
```
|
||||
|
||||
### Fields:
|
||||
|
||||
| Tag | Description |
|
||||
| - | - |
|
||||
| eqcsfield | Field Equals Another Field (relative)|
|
||||
| eqfield | Field Equals Another Field |
|
||||
| fieldcontains | NOT DOCUMENTED IN doc.go |
|
||||
| fieldexcludes | NOT DOCUMENTED IN doc.go |
|
||||
| fieldcontains | Check the indicated characters are present in the Field |
|
||||
| fieldexcludes | Check the indicated characters are not present in the field |
|
||||
| gtcsfield | Field Greater Than Another Relative Field |
|
||||
| gtecsfield | Field Greater Than or Equal To Another Relative Field |
|
||||
| gtefield | Field Greater Than or Equal To Another Field |
|
||||
@@ -114,6 +120,7 @@ Baked-in Validations
|
||||
| unix_addr | Unix domain socket end point Address |
|
||||
| uri | URI String |
|
||||
| url | URL String |
|
||||
| http_url | HTTP URL String |
|
||||
| url_encoded | URL Encoded |
|
||||
| urn_rfc2141 | Urn RFC 2141 String |
|
||||
|
||||
@@ -137,7 +144,7 @@ Baked-in Validations
|
||||
| excludesrune | Excludes Rune |
|
||||
| lowercase | Lowercase |
|
||||
| multibyte | Multi-Byte Characters |
|
||||
| number | NOT DOCUMENTED IN doc.go |
|
||||
| number | Number |
|
||||
| numeric | Numeric |
|
||||
| printascii | Printable ASCII |
|
||||
| startsnotwith | Starts Not With |
|
||||
@@ -149,11 +156,15 @@ Baked-in Validations
|
||||
| - | - |
|
||||
| base64 | Base64 String |
|
||||
| base64url | Base64URL String |
|
||||
| base64rawurl | Base64RawURL String |
|
||||
| bic | Business Identifier Code (ISO 9362) |
|
||||
| bcp47_language_tag | Language tag (BCP 47) |
|
||||
| btc_addr | Bitcoin Address |
|
||||
| btc_addr_bech32 | Bitcoin Bech32 Address (segwit) |
|
||||
| credit_card | Credit Card Number |
|
||||
| mongodb | MongoDB ObjectID |
|
||||
| cron | Cron |
|
||||
| spicedb | SpiceDb ObjectID/Permission/Type |
|
||||
| datetime | Datetime |
|
||||
| e164 | e164 formatted phone number |
|
||||
| email | E-mail String
|
||||
@@ -176,6 +187,7 @@ Baked-in Validations
|
||||
| jwt | JSON Web Token (JWT) |
|
||||
| latitude | Latitude |
|
||||
| longitude | Longitude |
|
||||
| luhn_checksum | Luhn Algorithm Checksum (for strings and (u)int) |
|
||||
| postcode_iso3166_alpha2 | Postcode |
|
||||
| postcode_iso3166_alpha2_field | Postcode |
|
||||
| rgb | RGB String |
|
||||
@@ -202,22 +214,28 @@ Baked-in Validations
|
||||
| tiger192 | TIGER192 hash |
|
||||
| semver | Semantic Versioning 2.0.0 |
|
||||
| ulid | Universally Unique Lexicographically Sortable Identifier ULID |
|
||||
| cve | Common Vulnerabilities and Exposures Identifier (CVE id) |
|
||||
|
||||
### Comparisons:
|
||||
| Tag | Description |
|
||||
| - | - |
|
||||
| eq | Equals |
|
||||
| eq_ignore_case | Equals ignoring case |
|
||||
| gt | Greater than|
|
||||
| gte | Greater than or equal |
|
||||
| lt | Less Than |
|
||||
| lte | Less Than or Equal |
|
||||
| ne | Not Equal |
|
||||
| ne_ignore_case | Not Equal ignoring case |
|
||||
|
||||
### Other:
|
||||
| Tag | Description |
|
||||
| - | - |
|
||||
| dir | Directory |
|
||||
| file | File path |
|
||||
| dir | Existing Directory |
|
||||
| dirpath | Directory Path |
|
||||
| file | Existing File |
|
||||
| filepath | File Path |
|
||||
| image | Image |
|
||||
| isdefault | Is Default |
|
||||
| len | Length |
|
||||
| max | Maximum |
|
||||
@@ -248,71 +266,72 @@ Benchmarks
|
||||
------
|
||||
###### Run on MacBook Pro (15-inch, 2017) go version go1.10.2 darwin/amd64
|
||||
```go
|
||||
go version go1.21.0 darwin/arm64
|
||||
goos: darwin
|
||||
goarch: amd64
|
||||
pkg: github.com/go-playground/validator
|
||||
BenchmarkFieldSuccess-8 20000000 83.6 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkFieldSuccessParallel-8 50000000 26.8 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkFieldFailure-8 5000000 291 ns/op 208 B/op 4 allocs/op
|
||||
BenchmarkFieldFailureParallel-8 20000000 107 ns/op 208 B/op 4 allocs/op
|
||||
BenchmarkFieldArrayDiveSuccess-8 2000000 623 ns/op 201 B/op 11 allocs/op
|
||||
BenchmarkFieldArrayDiveSuccessParallel-8 10000000 237 ns/op 201 B/op 11 allocs/op
|
||||
BenchmarkFieldArrayDiveFailure-8 2000000 859 ns/op 412 B/op 16 allocs/op
|
||||
BenchmarkFieldArrayDiveFailureParallel-8 5000000 335 ns/op 413 B/op 16 allocs/op
|
||||
BenchmarkFieldMapDiveSuccess-8 1000000 1292 ns/op 432 B/op 18 allocs/op
|
||||
BenchmarkFieldMapDiveSuccessParallel-8 3000000 467 ns/op 432 B/op 18 allocs/op
|
||||
BenchmarkFieldMapDiveFailure-8 1000000 1082 ns/op 512 B/op 16 allocs/op
|
||||
BenchmarkFieldMapDiveFailureParallel-8 5000000 425 ns/op 512 B/op 16 allocs/op
|
||||
BenchmarkFieldMapDiveWithKeysSuccess-8 1000000 1539 ns/op 480 B/op 21 allocs/op
|
||||
BenchmarkFieldMapDiveWithKeysSuccessParallel-8 3000000 613 ns/op 480 B/op 21 allocs/op
|
||||
BenchmarkFieldMapDiveWithKeysFailure-8 1000000 1413 ns/op 721 B/op 21 allocs/op
|
||||
BenchmarkFieldMapDiveWithKeysFailureParallel-8 3000000 575 ns/op 721 B/op 21 allocs/op
|
||||
BenchmarkFieldCustomTypeSuccess-8 10000000 216 ns/op 32 B/op 2 allocs/op
|
||||
BenchmarkFieldCustomTypeSuccessParallel-8 20000000 82.2 ns/op 32 B/op 2 allocs/op
|
||||
BenchmarkFieldCustomTypeFailure-8 5000000 274 ns/op 208 B/op 4 allocs/op
|
||||
BenchmarkFieldCustomTypeFailureParallel-8 20000000 116 ns/op 208 B/op 4 allocs/op
|
||||
BenchmarkFieldOrTagSuccess-8 2000000 740 ns/op 16 B/op 1 allocs/op
|
||||
BenchmarkFieldOrTagSuccessParallel-8 3000000 474 ns/op 16 B/op 1 allocs/op
|
||||
BenchmarkFieldOrTagFailure-8 3000000 471 ns/op 224 B/op 5 allocs/op
|
||||
BenchmarkFieldOrTagFailureParallel-8 3000000 414 ns/op 224 B/op 5 allocs/op
|
||||
BenchmarkStructLevelValidationSuccess-8 10000000 213 ns/op 32 B/op 2 allocs/op
|
||||
BenchmarkStructLevelValidationSuccessParallel-8 20000000 91.8 ns/op 32 B/op 2 allocs/op
|
||||
BenchmarkStructLevelValidationFailure-8 3000000 473 ns/op 304 B/op 8 allocs/op
|
||||
BenchmarkStructLevelValidationFailureParallel-8 10000000 234 ns/op 304 B/op 8 allocs/op
|
||||
BenchmarkStructSimpleCustomTypeSuccess-8 5000000 385 ns/op 32 B/op 2 allocs/op
|
||||
BenchmarkStructSimpleCustomTypeSuccessParallel-8 10000000 161 ns/op 32 B/op 2 allocs/op
|
||||
BenchmarkStructSimpleCustomTypeFailure-8 2000000 640 ns/op 424 B/op 9 allocs/op
|
||||
BenchmarkStructSimpleCustomTypeFailureParallel-8 5000000 318 ns/op 440 B/op 10 allocs/op
|
||||
BenchmarkStructFilteredSuccess-8 2000000 597 ns/op 288 B/op 9 allocs/op
|
||||
BenchmarkStructFilteredSuccessParallel-8 10000000 266 ns/op 288 B/op 9 allocs/op
|
||||
BenchmarkStructFilteredFailure-8 3000000 454 ns/op 256 B/op 7 allocs/op
|
||||
BenchmarkStructFilteredFailureParallel-8 10000000 214 ns/op 256 B/op 7 allocs/op
|
||||
BenchmarkStructPartialSuccess-8 3000000 502 ns/op 256 B/op 6 allocs/op
|
||||
BenchmarkStructPartialSuccessParallel-8 10000000 225 ns/op 256 B/op 6 allocs/op
|
||||
BenchmarkStructPartialFailure-8 2000000 702 ns/op 480 B/op 11 allocs/op
|
||||
BenchmarkStructPartialFailureParallel-8 5000000 329 ns/op 480 B/op 11 allocs/op
|
||||
BenchmarkStructExceptSuccess-8 2000000 793 ns/op 496 B/op 12 allocs/op
|
||||
BenchmarkStructExceptSuccessParallel-8 10000000 193 ns/op 240 B/op 5 allocs/op
|
||||
BenchmarkStructExceptFailure-8 2000000 639 ns/op 464 B/op 10 allocs/op
|
||||
BenchmarkStructExceptFailureParallel-8 5000000 300 ns/op 464 B/op 10 allocs/op
|
||||
BenchmarkStructSimpleCrossFieldSuccess-8 3000000 417 ns/op 72 B/op 3 allocs/op
|
||||
BenchmarkStructSimpleCrossFieldSuccessParallel-8 10000000 163 ns/op 72 B/op 3 allocs/op
|
||||
BenchmarkStructSimpleCrossFieldFailure-8 2000000 645 ns/op 304 B/op 8 allocs/op
|
||||
BenchmarkStructSimpleCrossFieldFailureParallel-8 5000000 285 ns/op 304 B/op 8 allocs/op
|
||||
BenchmarkStructSimpleCrossStructCrossFieldSuccess-8 3000000 588 ns/op 80 B/op 4 allocs/op
|
||||
BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-8 10000000 221 ns/op 80 B/op 4 allocs/op
|
||||
BenchmarkStructSimpleCrossStructCrossFieldFailure-8 2000000 868 ns/op 320 B/op 9 allocs/op
|
||||
BenchmarkStructSimpleCrossStructCrossFieldFailureParallel-8 5000000 337 ns/op 320 B/op 9 allocs/op
|
||||
BenchmarkStructSimpleSuccess-8 5000000 260 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkStructSimpleSuccessParallel-8 20000000 90.6 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkStructSimpleFailure-8 2000000 619 ns/op 424 B/op 9 allocs/op
|
||||
BenchmarkStructSimpleFailureParallel-8 5000000 296 ns/op 424 B/op 9 allocs/op
|
||||
BenchmarkStructComplexSuccess-8 1000000 1454 ns/op 128 B/op 8 allocs/op
|
||||
BenchmarkStructComplexSuccessParallel-8 3000000 579 ns/op 128 B/op 8 allocs/op
|
||||
BenchmarkStructComplexFailure-8 300000 4140 ns/op 3041 B/op 53 allocs/op
|
||||
BenchmarkStructComplexFailureParallel-8 1000000 2127 ns/op 3041 B/op 53 allocs/op
|
||||
BenchmarkOneof-8 10000000 140 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkOneofParallel-8 20000000 70.1 ns/op 0 B/op 0 allocs/op
|
||||
goarch: arm64
|
||||
pkg: github.com/go-playground/validator/v10
|
||||
BenchmarkFieldSuccess-8 33142266 35.94 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkFieldSuccessParallel-8 200816191 6.568 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkFieldFailure-8 6779707 175.1 ns/op 200 B/op 4 allocs/op
|
||||
BenchmarkFieldFailureParallel-8 11044147 108.4 ns/op 200 B/op 4 allocs/op
|
||||
BenchmarkFieldArrayDiveSuccess-8 6054232 194.4 ns/op 97 B/op 5 allocs/op
|
||||
BenchmarkFieldArrayDiveSuccessParallel-8 12523388 94.07 ns/op 97 B/op 5 allocs/op
|
||||
BenchmarkFieldArrayDiveFailure-8 3587043 334.3 ns/op 300 B/op 10 allocs/op
|
||||
BenchmarkFieldArrayDiveFailureParallel-8 5816665 200.8 ns/op 300 B/op 10 allocs/op
|
||||
BenchmarkFieldMapDiveSuccess-8 2217910 540.1 ns/op 288 B/op 14 allocs/op
|
||||
BenchmarkFieldMapDiveSuccessParallel-8 4446698 258.7 ns/op 288 B/op 14 allocs/op
|
||||
BenchmarkFieldMapDiveFailure-8 2392759 504.6 ns/op 376 B/op 13 allocs/op
|
||||
BenchmarkFieldMapDiveFailureParallel-8 4244199 286.9 ns/op 376 B/op 13 allocs/op
|
||||
BenchmarkFieldMapDiveWithKeysSuccess-8 2005857 592.1 ns/op 288 B/op 14 allocs/op
|
||||
BenchmarkFieldMapDiveWithKeysSuccessParallel-8 4400850 296.9 ns/op 288 B/op 14 allocs/op
|
||||
BenchmarkFieldMapDiveWithKeysFailure-8 1850227 643.8 ns/op 553 B/op 16 allocs/op
|
||||
BenchmarkFieldMapDiveWithKeysFailureParallel-8 3293233 375.1 ns/op 553 B/op 16 allocs/op
|
||||
BenchmarkFieldCustomTypeSuccess-8 12174412 98.25 ns/op 32 B/op 2 allocs/op
|
||||
BenchmarkFieldCustomTypeSuccessParallel-8 34389907 35.49 ns/op 32 B/op 2 allocs/op
|
||||
BenchmarkFieldCustomTypeFailure-8 7582524 156.6 ns/op 184 B/op 3 allocs/op
|
||||
BenchmarkFieldCustomTypeFailureParallel-8 13019902 92.79 ns/op 184 B/op 3 allocs/op
|
||||
BenchmarkFieldOrTagSuccess-8 3427260 349.4 ns/op 16 B/op 1 allocs/op
|
||||
BenchmarkFieldOrTagSuccessParallel-8 15144128 81.25 ns/op 16 B/op 1 allocs/op
|
||||
BenchmarkFieldOrTagFailure-8 5913546 201.9 ns/op 216 B/op 5 allocs/op
|
||||
BenchmarkFieldOrTagFailureParallel-8 9810212 113.7 ns/op 216 B/op 5 allocs/op
|
||||
BenchmarkStructLevelValidationSuccess-8 13456327 87.66 ns/op 16 B/op 1 allocs/op
|
||||
BenchmarkStructLevelValidationSuccessParallel-8 41818888 27.77 ns/op 16 B/op 1 allocs/op
|
||||
BenchmarkStructLevelValidationFailure-8 4166284 272.6 ns/op 264 B/op 7 allocs/op
|
||||
BenchmarkStructLevelValidationFailureParallel-8 7594581 152.1 ns/op 264 B/op 7 allocs/op
|
||||
BenchmarkStructSimpleCustomTypeSuccess-8 6508082 182.6 ns/op 32 B/op 2 allocs/op
|
||||
BenchmarkStructSimpleCustomTypeSuccessParallel-8 23078605 54.78 ns/op 32 B/op 2 allocs/op
|
||||
BenchmarkStructSimpleCustomTypeFailure-8 3118352 381.0 ns/op 416 B/op 9 allocs/op
|
||||
BenchmarkStructSimpleCustomTypeFailureParallel-8 5300738 224.1 ns/op 432 B/op 10 allocs/op
|
||||
BenchmarkStructFilteredSuccess-8 4761807 251.1 ns/op 216 B/op 5 allocs/op
|
||||
BenchmarkStructFilteredSuccessParallel-8 8792598 128.6 ns/op 216 B/op 5 allocs/op
|
||||
BenchmarkStructFilteredFailure-8 5202573 232.1 ns/op 216 B/op 5 allocs/op
|
||||
BenchmarkStructFilteredFailureParallel-8 9591267 121.4 ns/op 216 B/op 5 allocs/op
|
||||
BenchmarkStructPartialSuccess-8 5188512 231.6 ns/op 224 B/op 4 allocs/op
|
||||
BenchmarkStructPartialSuccessParallel-8 9179776 123.1 ns/op 224 B/op 4 allocs/op
|
||||
BenchmarkStructPartialFailure-8 3071212 392.5 ns/op 440 B/op 9 allocs/op
|
||||
BenchmarkStructPartialFailureParallel-8 5344261 223.7 ns/op 440 B/op 9 allocs/op
|
||||
BenchmarkStructExceptSuccess-8 3184230 375.0 ns/op 424 B/op 8 allocs/op
|
||||
BenchmarkStructExceptSuccessParallel-8 10090130 108.9 ns/op 208 B/op 3 allocs/op
|
||||
BenchmarkStructExceptFailure-8 3347226 357.7 ns/op 424 B/op 8 allocs/op
|
||||
BenchmarkStructExceptFailureParallel-8 5654923 209.5 ns/op 424 B/op 8 allocs/op
|
||||
BenchmarkStructSimpleCrossFieldSuccess-8 5232265 229.1 ns/op 56 B/op 3 allocs/op
|
||||
BenchmarkStructSimpleCrossFieldSuccessParallel-8 17436674 64.75 ns/op 56 B/op 3 allocs/op
|
||||
BenchmarkStructSimpleCrossFieldFailure-8 3128613 383.6 ns/op 272 B/op 8 allocs/op
|
||||
BenchmarkStructSimpleCrossFieldFailureParallel-8 6994113 168.8 ns/op 272 B/op 8 allocs/op
|
||||
BenchmarkStructSimpleCrossStructCrossFieldSuccess-8 3506487 340.9 ns/op 64 B/op 4 allocs/op
|
||||
BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-8 13431300 91.77 ns/op 64 B/op 4 allocs/op
|
||||
BenchmarkStructSimpleCrossStructCrossFieldFailure-8 2410566 500.9 ns/op 288 B/op 9 allocs/op
|
||||
BenchmarkStructSimpleCrossStructCrossFieldFailureParallel-8 6344510 188.2 ns/op 288 B/op 9 allocs/op
|
||||
BenchmarkStructSimpleSuccess-8 8922726 133.8 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkStructSimpleSuccessParallel-8 55291153 23.63 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkStructSimpleFailure-8 3171553 378.4 ns/op 416 B/op 9 allocs/op
|
||||
BenchmarkStructSimpleFailureParallel-8 5571692 212.0 ns/op 416 B/op 9 allocs/op
|
||||
BenchmarkStructComplexSuccess-8 1683750 714.5 ns/op 224 B/op 5 allocs/op
|
||||
BenchmarkStructComplexSuccessParallel-8 4578046 257.0 ns/op 224 B/op 5 allocs/op
|
||||
BenchmarkStructComplexFailure-8 481585 2547 ns/op 3041 B/op 48 allocs/op
|
||||
BenchmarkStructComplexFailureParallel-8 965764 1577 ns/op 3040 B/op 48 allocs/op
|
||||
BenchmarkOneof-8 17380881 68.50 ns/op 0 B/op 0 allocs/op
|
||||
BenchmarkOneofParallel-8 8084733 153.5 ns/op 0 B/op 0 allocs/op
|
||||
```
|
||||
|
||||
Complementary Software
|
||||
|
518
vendor/github.com/go-playground/validator/v10/baked_in.go
generated
vendored
518
vendor/github.com/go-playground/validator/v10/baked_in.go
generated
vendored
@@ -7,6 +7,7 @@ import (
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"net"
|
||||
"net/url"
|
||||
"os"
|
||||
@@ -14,12 +15,14 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"syscall"
|
||||
"time"
|
||||
"unicode/utf8"
|
||||
|
||||
"golang.org/x/crypto/sha3"
|
||||
"golang.org/x/text/language"
|
||||
|
||||
"github.com/gabriel-vasile/mimetype"
|
||||
urn "github.com/leodido/go-urn"
|
||||
)
|
||||
|
||||
@@ -31,7 +34,7 @@ type Func func(fl FieldLevel) bool
|
||||
// validation needs. The return value should be true when validation succeeds.
|
||||
type FuncCtx func(ctx context.Context, fl FieldLevel) bool
|
||||
|
||||
// wrapFunc wraps noramal Func makes it compatible with FuncCtx
|
||||
// wrapFunc wraps normal Func makes it compatible with FuncCtx
|
||||
func wrapFunc(fn Func) FuncCtx {
|
||||
if fn == nil {
|
||||
return nil // be sure not to wrap a bad function.
|
||||
@@ -71,6 +74,7 @@ var (
|
||||
"required": hasValue,
|
||||
"required_if": requiredIf,
|
||||
"required_unless": requiredUnless,
|
||||
"skip_unless": skipUnless,
|
||||
"required_with": requiredWith,
|
||||
"required_with_all": requiredWithAll,
|
||||
"required_without": requiredWithout,
|
||||
@@ -86,7 +90,9 @@ var (
|
||||
"min": hasMinOf,
|
||||
"max": hasMaxOf,
|
||||
"eq": isEq,
|
||||
"eq_ignore_case": isEqIgnoreCase,
|
||||
"ne": isNe,
|
||||
"ne_ignore_case": isNeIgnoreCase,
|
||||
"lt": isLt,
|
||||
"lte": isLte,
|
||||
"gt": isGt,
|
||||
@@ -121,11 +127,14 @@ var (
|
||||
"e164": isE164,
|
||||
"email": isEmail,
|
||||
"url": isURL,
|
||||
"http_url": isHttpURL,
|
||||
"uri": isURI,
|
||||
"urn_rfc2141": isUrnRFC2141, // RFC 2141
|
||||
"file": isFile,
|
||||
"filepath": isFilePath,
|
||||
"base64": isBase64,
|
||||
"base64url": isBase64URL,
|
||||
"base64rawurl": isBase64RawURL,
|
||||
"contains": contains,
|
||||
"containsany": containsAny,
|
||||
"containsrune": containsRune,
|
||||
@@ -136,10 +145,12 @@ var (
|
||||
"endswith": endsWith,
|
||||
"startsnotwith": startsNotWith,
|
||||
"endsnotwith": endsNotWith,
|
||||
"image": isImage,
|
||||
"isbn": isISBN,
|
||||
"isbn10": isISBN10,
|
||||
"isbn13": isISBN13,
|
||||
"eth_addr": isEthereumAddress,
|
||||
"eth_addr_checksum": isEthereumAddressChecksum,
|
||||
"btc_addr": isBitcoinAddress,
|
||||
"btc_addr_bech32": isBitcoinBech32Address,
|
||||
"uuid": isUUID,
|
||||
@@ -194,6 +205,7 @@ var (
|
||||
"html_encoded": isHTMLEncoded,
|
||||
"url_encoded": isURLEncoded,
|
||||
"dir": isDir,
|
||||
"dirpath": isDirPath,
|
||||
"json": isJSON,
|
||||
"jwt": isJWT,
|
||||
"hostname_port": isHostnamePort,
|
||||
@@ -214,6 +226,11 @@ var (
|
||||
"semver": isSemverFormat,
|
||||
"dns_rfc1035_label": isDnsRFC1035LabelFormat,
|
||||
"credit_card": isCreditCard,
|
||||
"cve": isCveFormat,
|
||||
"luhn_checksum": hasLuhnChecksum,
|
||||
"mongodb": isMongoDB,
|
||||
"cron": isCron,
|
||||
"spicedb": isSpiceDB,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -307,18 +324,42 @@ func isUnique(fl FieldLevel) bool {
|
||||
}
|
||||
|
||||
m := reflect.MakeMap(reflect.MapOf(sfTyp, v.Type()))
|
||||
var fieldlen int
|
||||
for i := 0; i < field.Len(); i++ {
|
||||
m.SetMapIndex(reflect.Indirect(reflect.Indirect(field.Index(i)).FieldByName(param)), v)
|
||||
key := reflect.Indirect(reflect.Indirect(field.Index(i)).FieldByName(param))
|
||||
if key.IsValid() {
|
||||
fieldlen++
|
||||
m.SetMapIndex(key, v)
|
||||
}
|
||||
}
|
||||
return field.Len() == m.Len()
|
||||
return fieldlen == m.Len()
|
||||
case reflect.Map:
|
||||
m := reflect.MakeMap(reflect.MapOf(field.Type().Elem(), v.Type()))
|
||||
var m reflect.Value
|
||||
if field.Type().Elem().Kind() == reflect.Ptr {
|
||||
m = reflect.MakeMap(reflect.MapOf(field.Type().Elem().Elem(), v.Type()))
|
||||
} else {
|
||||
m = reflect.MakeMap(reflect.MapOf(field.Type().Elem(), v.Type()))
|
||||
}
|
||||
|
||||
for _, k := range field.MapKeys() {
|
||||
m.SetMapIndex(field.MapIndex(k), v)
|
||||
m.SetMapIndex(reflect.Indirect(field.MapIndex(k)), v)
|
||||
}
|
||||
|
||||
return field.Len() == m.Len()
|
||||
default:
|
||||
if parent := fl.Parent(); parent.Kind() == reflect.Struct {
|
||||
uniqueField := parent.FieldByName(param)
|
||||
if uniqueField == reflect.ValueOf(nil) {
|
||||
panic(fmt.Sprintf("Bad field name provided %s", param))
|
||||
}
|
||||
|
||||
if uniqueField.Kind() != field.Kind() {
|
||||
panic(fmt.Sprintf("Bad field type %T:%T", field.Interface(), uniqueField.Interface()))
|
||||
}
|
||||
|
||||
return field.Interface() != uniqueField.Interface()
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||
}
|
||||
}
|
||||
@@ -613,14 +654,16 @@ func isISBN10(fl FieldLevel) bool {
|
||||
func isEthereumAddress(fl FieldLevel) bool {
|
||||
address := fl.Field().String()
|
||||
|
||||
return ethAddressRegex.MatchString(address)
|
||||
}
|
||||
|
||||
// isEthereumAddressChecksum is the validation function for validating if the field's value is a valid checksumed Ethereum address.
|
||||
func isEthereumAddressChecksum(fl FieldLevel) bool {
|
||||
address := fl.Field().String()
|
||||
|
||||
if !ethAddressRegex.MatchString(address) {
|
||||
return false
|
||||
}
|
||||
|
||||
if ethAddressRegexUpper.MatchString(address) || ethAddressRegexLower.MatchString(address) {
|
||||
return true
|
||||
}
|
||||
|
||||
// Checksum validation. Reference: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md
|
||||
address = address[2:] // Skip "0x" prefix.
|
||||
h := sha3.NewLegacyKeccak256()
|
||||
@@ -889,6 +932,12 @@ func isNe(fl FieldLevel) bool {
|
||||
return !isEq(fl)
|
||||
}
|
||||
|
||||
// isNeIgnoreCase is the validation function for validating that the field's string value does not equal the
|
||||
// provided param value. The comparison is case-insensitive
|
||||
func isNeIgnoreCase(fl FieldLevel) bool {
|
||||
return !isEqIgnoreCase(fl)
|
||||
}
|
||||
|
||||
// isLteCrossStructField is the validation function for validating if the current field's value is less than or equal to the field, within a separate struct, specified by the param's value.
|
||||
func isLteCrossStructField(fl FieldLevel) bool {
|
||||
field := fl.Field()
|
||||
@@ -1246,8 +1295,13 @@ func isEq(fl FieldLevel) bool {
|
||||
|
||||
return field.Uint() == p
|
||||
|
||||
case reflect.Float32, reflect.Float64:
|
||||
p := asFloat(param)
|
||||
case reflect.Float32:
|
||||
p := asFloat32(param)
|
||||
|
||||
return field.Float() == p
|
||||
|
||||
case reflect.Float64:
|
||||
p := asFloat64(param)
|
||||
|
||||
return field.Float() == p
|
||||
|
||||
@@ -1260,6 +1314,22 @@ func isEq(fl FieldLevel) bool {
|
||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||
}
|
||||
|
||||
// isEqIgnoreCase is the validation function for validating if the current field's string value is
|
||||
// equal to the param's value.
|
||||
// The comparison is case-insensitive.
|
||||
func isEqIgnoreCase(fl FieldLevel) bool {
|
||||
field := fl.Field()
|
||||
param := fl.Param()
|
||||
|
||||
switch field.Kind() {
|
||||
|
||||
case reflect.String:
|
||||
return strings.EqualFold(field.String(), param)
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||
}
|
||||
|
||||
// isPostcodeByIso3166Alpha2 validates by value which is country code in iso 3166 alpha 2
|
||||
// example: `postcode_iso3166_alpha2=US`
|
||||
func isPostcodeByIso3166Alpha2(fl FieldLevel) bool {
|
||||
@@ -1311,6 +1381,11 @@ func isBase64URL(fl FieldLevel) bool {
|
||||
return base64URLRegex.MatchString(fl.Field().String())
|
||||
}
|
||||
|
||||
// isBase64RawURL is the validation function for validating if the current field's value is a valid base64 URL safe string without '=' padding.
|
||||
func isBase64RawURL(fl FieldLevel) bool {
|
||||
return base64RawURLRegex.MatchString(fl.Field().String())
|
||||
}
|
||||
|
||||
// isURI is the validation function for validating if the current field's value is a valid URI.
|
||||
func isURI(fl FieldLevel) bool {
|
||||
field := fl.Field()
|
||||
@@ -1345,31 +1420,50 @@ func isURL(fl FieldLevel) bool {
|
||||
switch field.Kind() {
|
||||
case reflect.String:
|
||||
|
||||
var i int
|
||||
s := field.String()
|
||||
|
||||
// checks needed as of Go 1.6 because of change https://github.com/golang/go/commit/617c93ce740c3c3cc28cdd1a0d712be183d0b328#diff-6c2d018290e298803c0c9419d8739885L195
|
||||
// emulate browser and strip the '#' suffix prior to validation. see issue-#237
|
||||
if i = strings.Index(s, "#"); i > -1 {
|
||||
s = s[:i]
|
||||
}
|
||||
|
||||
if len(s) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
url, err := url.ParseRequestURI(s)
|
||||
|
||||
url, err := url.Parse(s)
|
||||
if err != nil || url.Scheme == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
if url.Host == "" && url.Fragment == "" && url.Opaque == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||
}
|
||||
|
||||
// isHttpURL is the validation function for validating if the current field's value is a valid HTTP(s) URL.
|
||||
func isHttpURL(fl FieldLevel) bool {
|
||||
if !isURL(fl) {
|
||||
return false
|
||||
}
|
||||
|
||||
field := fl.Field()
|
||||
switch field.Kind() {
|
||||
case reflect.String:
|
||||
|
||||
s := strings.ToLower(field.String())
|
||||
|
||||
url, err := url.Parse(s)
|
||||
if err != nil || url.Host == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
return url.Scheme == "http" || url.Scheme == "https"
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||
}
|
||||
|
||||
// isUrnRFC2141 is the validation function for validating if the current field's value is a valid URN as per RFC 2141.
|
||||
func isUrnRFC2141(fl FieldLevel) bool {
|
||||
field := fl.Field()
|
||||
@@ -1387,7 +1481,7 @@ func isUrnRFC2141(fl FieldLevel) bool {
|
||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||
}
|
||||
|
||||
// isFile is the validation function for validating if the current field's value is a valid file path.
|
||||
// isFile is the validation function for validating if the current field's value is a valid existing file path.
|
||||
func isFile(fl FieldLevel) bool {
|
||||
field := fl.Field()
|
||||
|
||||
@@ -1404,6 +1498,122 @@ func isFile(fl FieldLevel) bool {
|
||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||
}
|
||||
|
||||
// isImage is the validation function for validating if the current field's value contains the path to a valid image file
|
||||
func isImage(fl FieldLevel) bool {
|
||||
mimetypes := map[string]bool{
|
||||
"image/bmp": true,
|
||||
"image/cis-cod": true,
|
||||
"image/gif": true,
|
||||
"image/ief": true,
|
||||
"image/jpeg": true,
|
||||
"image/jp2": true,
|
||||
"image/jpx": true,
|
||||
"image/jpm": true,
|
||||
"image/pipeg": true,
|
||||
"image/png": true,
|
||||
"image/svg+xml": true,
|
||||
"image/tiff": true,
|
||||
"image/webp": true,
|
||||
"image/x-cmu-raster": true,
|
||||
"image/x-cmx": true,
|
||||
"image/x-icon": true,
|
||||
"image/x-portable-anymap": true,
|
||||
"image/x-portable-bitmap": true,
|
||||
"image/x-portable-graymap": true,
|
||||
"image/x-portable-pixmap": true,
|
||||
"image/x-rgb": true,
|
||||
"image/x-xbitmap": true,
|
||||
"image/x-xpixmap": true,
|
||||
"image/x-xwindowdump": true,
|
||||
}
|
||||
field := fl.Field()
|
||||
|
||||
switch field.Kind() {
|
||||
case reflect.String:
|
||||
filePath := field.String()
|
||||
fileInfo, err := os.Stat(filePath)
|
||||
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if fileInfo.IsDir() {
|
||||
return false
|
||||
}
|
||||
|
||||
file, err := os.Open(filePath)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
mime, err := mimetype.DetectReader(file)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if _, ok := mimetypes[mime.String()]; ok {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// isFilePath is the validation function for validating if the current field's value is a valid file path.
|
||||
func isFilePath(fl FieldLevel) bool {
|
||||
|
||||
var exists bool
|
||||
var err error
|
||||
|
||||
field := fl.Field()
|
||||
|
||||
// Not valid if it is a directory.
|
||||
if isDir(fl) {
|
||||
return false
|
||||
}
|
||||
// If it exists, it obviously is valid.
|
||||
// This is done first to avoid code duplication and unnecessary additional logic.
|
||||
if exists = isFile(fl); exists {
|
||||
return true
|
||||
}
|
||||
|
||||
// It does not exist but may still be a valid filepath.
|
||||
switch field.Kind() {
|
||||
case reflect.String:
|
||||
// Every OS allows for whitespace, but none
|
||||
// let you use a file with no filename (to my knowledge).
|
||||
// Unless you're dealing with raw inodes, but I digress.
|
||||
if strings.TrimSpace(field.String()) == "" {
|
||||
return false
|
||||
}
|
||||
// We make sure it isn't a directory.
|
||||
if strings.HasSuffix(field.String(), string(os.PathSeparator)) {
|
||||
return false
|
||||
}
|
||||
if _, err = os.Stat(field.String()); err != nil {
|
||||
switch t := err.(type) {
|
||||
case *fs.PathError:
|
||||
if t.Err == syscall.EINVAL {
|
||||
// It's definitely an invalid character in the filepath.
|
||||
return false
|
||||
}
|
||||
// It could be a permission error, a does-not-exist error, etc.
|
||||
// Out-of-scope for this validation, though.
|
||||
return true
|
||||
default:
|
||||
// Something went *seriously* wrong.
|
||||
/*
|
||||
Per https://pkg.go.dev/os#Stat:
|
||||
"If there is an error, it will be of type *PathError."
|
||||
*/
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||
}
|
||||
|
||||
// isE164 is the validation function for validating if the current field's value is a valid e.164 formatted phone number.
|
||||
func isE164(fl FieldLevel) bool {
|
||||
return e164Regex.MatchString(fl.Field().String())
|
||||
@@ -1510,11 +1720,11 @@ func hasValue(fl FieldLevel) bool {
|
||||
if fl.(*validate).fldIsPointer && field.Interface() != nil {
|
||||
return true
|
||||
}
|
||||
return field.IsValid() && field.Interface() != reflect.Zero(field.Type()).Interface()
|
||||
return field.IsValid() && !field.IsZero()
|
||||
}
|
||||
}
|
||||
|
||||
// requireCheckField is a func for check field kind
|
||||
// requireCheckFieldKind is a func for check field kind
|
||||
func requireCheckFieldKind(fl FieldLevel, param string, defaultNotFoundValue bool) bool {
|
||||
field := fl.Field()
|
||||
kind := field.Kind()
|
||||
@@ -1534,12 +1744,14 @@ func requireCheckFieldKind(fl FieldLevel, param string, defaultNotFoundValue boo
|
||||
if nullable && field.Interface() != nil {
|
||||
return false
|
||||
}
|
||||
return field.IsValid() && field.Interface() == reflect.Zero(field.Type()).Interface()
|
||||
return field.IsValid() && field.IsZero()
|
||||
}
|
||||
}
|
||||
|
||||
// requireCheckFieldValue is a func for check field value
|
||||
func requireCheckFieldValue(fl FieldLevel, param string, value string, defaultNotFoundValue bool) bool {
|
||||
func requireCheckFieldValue(
|
||||
fl FieldLevel, param string, value string, defaultNotFoundValue bool,
|
||||
) bool {
|
||||
field, kind, _, found := fl.GetStructFieldOKAdvanced2(fl.Parent(), param)
|
||||
if !found {
|
||||
return defaultNotFoundValue
|
||||
@@ -1553,8 +1765,11 @@ func requireCheckFieldValue(fl FieldLevel, param string, value string, defaultNo
|
||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||||
return field.Uint() == asUint(value)
|
||||
|
||||
case reflect.Float32, reflect.Float64:
|
||||
return field.Float() == asFloat(value)
|
||||
case reflect.Float32:
|
||||
return field.Float() == asFloat32(value)
|
||||
|
||||
case reflect.Float64:
|
||||
return field.Float() == asFloat64(value)
|
||||
|
||||
case reflect.Slice, reflect.Map, reflect.Array:
|
||||
return int64(field.Len()) == asInt(value)
|
||||
@@ -1592,10 +1807,10 @@ func excludedIf(fl FieldLevel) bool {
|
||||
|
||||
for i := 0; i < len(params); i += 2 {
|
||||
if !requireCheckFieldValue(fl, params[i], params[i+1], false) {
|
||||
return false
|
||||
return true
|
||||
}
|
||||
}
|
||||
return true
|
||||
return !hasValue(fl)
|
||||
}
|
||||
|
||||
// requiredUnless is the validation function
|
||||
@@ -1614,6 +1829,21 @@ func requiredUnless(fl FieldLevel) bool {
|
||||
return hasValue(fl)
|
||||
}
|
||||
|
||||
// skipUnless is the validation function
|
||||
// The field under validation must be present and not empty only unless all the other specified fields are equal to the value following with the specified field.
|
||||
func skipUnless(fl FieldLevel) bool {
|
||||
params := parseOneOfParam2(fl.Param())
|
||||
if len(params)%2 != 0 {
|
||||
panic(fmt.Sprintf("Bad param number for skip_unless %s", fl.FieldName()))
|
||||
}
|
||||
for i := 0; i < len(params); i += 2 {
|
||||
if !requireCheckFieldValue(fl, params[i], params[i+1], false) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return hasValue(fl)
|
||||
}
|
||||
|
||||
// excludedUnless is the validation function
|
||||
// The field under validation must not be present or is empty unless all the other specified fields are equal to the value following with the specified field.
|
||||
func excludedUnless(fl FieldLevel) bool {
|
||||
@@ -1623,10 +1853,10 @@ func excludedUnless(fl FieldLevel) bool {
|
||||
}
|
||||
for i := 0; i < len(params); i += 2 {
|
||||
if !requireCheckFieldValue(fl, params[i], params[i+1], false) {
|
||||
return true
|
||||
return !hasValue(fl)
|
||||
}
|
||||
}
|
||||
return !hasValue(fl)
|
||||
return true
|
||||
}
|
||||
|
||||
// excludedWith is the validation function
|
||||
@@ -1838,8 +2068,13 @@ func isGte(fl FieldLevel) bool {
|
||||
|
||||
return field.Uint() >= p
|
||||
|
||||
case reflect.Float32, reflect.Float64:
|
||||
p := asFloat(param)
|
||||
case reflect.Float32:
|
||||
p := asFloat32(param)
|
||||
|
||||
return field.Float() >= p
|
||||
|
||||
case reflect.Float64:
|
||||
p := asFloat64(param)
|
||||
|
||||
return field.Float() >= p
|
||||
|
||||
@@ -1884,10 +2119,16 @@ func isGt(fl FieldLevel) bool {
|
||||
|
||||
return field.Uint() > p
|
||||
|
||||
case reflect.Float32, reflect.Float64:
|
||||
p := asFloat(param)
|
||||
case reflect.Float32:
|
||||
p := asFloat32(param)
|
||||
|
||||
return field.Float() > p
|
||||
|
||||
case reflect.Float64:
|
||||
p := asFloat64(param)
|
||||
|
||||
return field.Float() > p
|
||||
|
||||
case reflect.Struct:
|
||||
|
||||
if field.Type().ConvertibleTo(timeType) {
|
||||
@@ -1926,8 +2167,13 @@ func hasLengthOf(fl FieldLevel) bool {
|
||||
|
||||
return field.Uint() == p
|
||||
|
||||
case reflect.Float32, reflect.Float64:
|
||||
p := asFloat(param)
|
||||
case reflect.Float32:
|
||||
p := asFloat32(param)
|
||||
|
||||
return field.Float() == p
|
||||
|
||||
case reflect.Float64:
|
||||
p := asFloat64(param)
|
||||
|
||||
return field.Float() == p
|
||||
}
|
||||
@@ -2059,8 +2305,13 @@ func isLte(fl FieldLevel) bool {
|
||||
|
||||
return field.Uint() <= p
|
||||
|
||||
case reflect.Float32, reflect.Float64:
|
||||
p := asFloat(param)
|
||||
case reflect.Float32:
|
||||
p := asFloat32(param)
|
||||
|
||||
return field.Float() <= p
|
||||
|
||||
case reflect.Float64:
|
||||
p := asFloat64(param)
|
||||
|
||||
return field.Float() <= p
|
||||
|
||||
@@ -2105,8 +2356,13 @@ func isLt(fl FieldLevel) bool {
|
||||
|
||||
return field.Uint() < p
|
||||
|
||||
case reflect.Float32, reflect.Float64:
|
||||
p := asFloat(param)
|
||||
case reflect.Float32:
|
||||
p := asFloat32(param)
|
||||
|
||||
return field.Float() < p
|
||||
|
||||
case reflect.Float64:
|
||||
p := asFloat64(param)
|
||||
|
||||
return field.Float() < p
|
||||
|
||||
@@ -2275,7 +2531,7 @@ func isFQDN(fl FieldLevel) bool {
|
||||
return fqdnRegexRFC1123.MatchString(val)
|
||||
}
|
||||
|
||||
// isDir is the validation function for validating if the current field's value is a valid directory.
|
||||
// isDir is the validation function for validating if the current field's value is a valid existing directory.
|
||||
func isDir(fl FieldLevel) bool {
|
||||
field := fl.Field()
|
||||
|
||||
@@ -2291,13 +2547,79 @@ func isDir(fl FieldLevel) bool {
|
||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||
}
|
||||
|
||||
// isDirPath is the validation function for validating if the current field's value is a valid directory.
|
||||
func isDirPath(fl FieldLevel) bool {
|
||||
|
||||
var exists bool
|
||||
var err error
|
||||
|
||||
field := fl.Field()
|
||||
|
||||
// If it exists, it obviously is valid.
|
||||
// This is done first to avoid code duplication and unnecessary additional logic.
|
||||
if exists = isDir(fl); exists {
|
||||
return true
|
||||
}
|
||||
|
||||
// It does not exist but may still be a valid path.
|
||||
switch field.Kind() {
|
||||
case reflect.String:
|
||||
// Every OS allows for whitespace, but none
|
||||
// let you use a dir with no name (to my knowledge).
|
||||
// Unless you're dealing with raw inodes, but I digress.
|
||||
if strings.TrimSpace(field.String()) == "" {
|
||||
return false
|
||||
}
|
||||
if _, err = os.Stat(field.String()); err != nil {
|
||||
switch t := err.(type) {
|
||||
case *fs.PathError:
|
||||
if t.Err == syscall.EINVAL {
|
||||
// It's definitely an invalid character in the path.
|
||||
return false
|
||||
}
|
||||
// It could be a permission error, a does-not-exist error, etc.
|
||||
// Out-of-scope for this validation, though.
|
||||
// Lastly, we make sure it is a directory.
|
||||
if strings.HasSuffix(field.String(), string(os.PathSeparator)) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
default:
|
||||
// Something went *seriously* wrong.
|
||||
/*
|
||||
Per https://pkg.go.dev/os#Stat:
|
||||
"If there is an error, it will be of type *PathError."
|
||||
*/
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
// We repeat the check here to make sure it is an explicit directory in case the above os.Stat didn't trigger an error.
|
||||
if strings.HasSuffix(field.String(), string(os.PathSeparator)) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||
}
|
||||
|
||||
// isJSON is the validation function for validating if the current field's value is a valid json string.
|
||||
func isJSON(fl FieldLevel) bool {
|
||||
field := fl.Field()
|
||||
|
||||
if field.Kind() == reflect.String {
|
||||
switch field.Kind() {
|
||||
case reflect.String:
|
||||
val := field.String()
|
||||
return json.Valid([]byte(val))
|
||||
case reflect.Slice:
|
||||
fieldType := field.Type()
|
||||
|
||||
if fieldType.ConvertibleTo(byteSliceType) {
|
||||
b := field.Convert(byteSliceType).Interface().([]byte)
|
||||
return json.Valid(b)
|
||||
}
|
||||
}
|
||||
|
||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||
@@ -2316,7 +2638,9 @@ func isHostnamePort(fl FieldLevel) bool {
|
||||
return false
|
||||
}
|
||||
// Port must be a iny <= 65535.
|
||||
if portNum, err := strconv.ParseInt(port, 10, 32); err != nil || portNum > 65535 || portNum < 1 {
|
||||
if portNum, err := strconv.ParseInt(
|
||||
port, 10, 32,
|
||||
); err != nil || portNum > 65535 || portNum < 1 {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -2397,13 +2721,13 @@ func isIso3166Alpha2(fl FieldLevel) bool {
|
||||
return iso3166_1_alpha2[val]
|
||||
}
|
||||
|
||||
// isIso3166Alpha2 is the validation function for validating if the current field's value is a valid iso3166-1 alpha-3 country code.
|
||||
// isIso3166Alpha3 is the validation function for validating if the current field's value is a valid iso3166-1 alpha-3 country code.
|
||||
func isIso3166Alpha3(fl FieldLevel) bool {
|
||||
val := fl.Field().String()
|
||||
return iso3166_1_alpha3[val]
|
||||
}
|
||||
|
||||
// isIso3166Alpha2 is the validation function for validating if the current field's value is a valid iso3166-1 alpha-numeric country code.
|
||||
// isIso3166AlphaNumeric is the validation function for validating if the current field's value is a valid iso3166-1 alpha-numeric country code.
|
||||
func isIso3166AlphaNumeric(fl FieldLevel) bool {
|
||||
field := fl.Field()
|
||||
|
||||
@@ -2479,6 +2803,13 @@ func isSemverFormat(fl FieldLevel) bool {
|
||||
return semverRegex.MatchString(semverString)
|
||||
}
|
||||
|
||||
// isCveFormat is the validation function for validating if the current field's value is a valid cve id, defined in CVE mitre org
|
||||
func isCveFormat(fl FieldLevel) bool {
|
||||
cveString := fl.Field().String()
|
||||
|
||||
return cveRegex.MatchString(cveString)
|
||||
}
|
||||
|
||||
// isDnsRFC1035LabelFormat is the validation function
|
||||
// for validating if the current field's value is
|
||||
// a valid dns RFC 1035 label, defined in RFC 1035.
|
||||
@@ -2487,6 +2818,52 @@ func isDnsRFC1035LabelFormat(fl FieldLevel) bool {
|
||||
return dnsRegexRFC1035Label.MatchString(val)
|
||||
}
|
||||
|
||||
// digitsHaveLuhnChecksum returns true if and only if the last element of the given digits slice is the Luhn checksum of the previous elements
|
||||
func digitsHaveLuhnChecksum(digits []string) bool {
|
||||
size := len(digits)
|
||||
sum := 0
|
||||
for i, digit := range digits {
|
||||
value, err := strconv.Atoi(digit)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
if size%2 == 0 && i%2 == 0 || size%2 == 1 && i%2 == 1 {
|
||||
v := value * 2
|
||||
if v >= 10 {
|
||||
sum += 1 + (v % 10)
|
||||
} else {
|
||||
sum += v
|
||||
}
|
||||
} else {
|
||||
sum += value
|
||||
}
|
||||
}
|
||||
return (sum % 10) == 0
|
||||
}
|
||||
|
||||
// isMongoDB is the validation function for validating if the current field's value is valid mongoDB objectID
|
||||
func isMongoDB(fl FieldLevel) bool {
|
||||
val := fl.Field().String()
|
||||
return mongodbRegex.MatchString(val)
|
||||
}
|
||||
|
||||
// isSpiceDB is the validation function for validating if the current field's value is valid for use with Authzed SpiceDB in the indicated way
|
||||
func isSpiceDB(fl FieldLevel) bool {
|
||||
val := fl.Field().String()
|
||||
param := fl.Param()
|
||||
|
||||
switch param {
|
||||
case "permission":
|
||||
return spicedbPermissionRegex.MatchString(val)
|
||||
case "type":
|
||||
return spicedbTypeRegex.MatchString(val)
|
||||
case "id", "":
|
||||
return spicedbIDRegex.MatchString(val)
|
||||
}
|
||||
|
||||
panic("Unrecognized parameter: " + param)
|
||||
}
|
||||
|
||||
// isCreditCard is the validation function for validating if the current field's value is a valid credit card number
|
||||
func isCreditCard(fl FieldLevel) bool {
|
||||
val := fl.Field().String()
|
||||
@@ -2505,22 +2882,33 @@ func isCreditCard(fl FieldLevel) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
sum := 0
|
||||
for i, digit := range ccDigits {
|
||||
value, err := strconv.Atoi(digit)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
if size%2 == 0 && i%2 == 0 || size%2 == 1 && i%2 == 1 {
|
||||
v := value * 2
|
||||
if v >= 10 {
|
||||
sum += 1 + (v % 10)
|
||||
} else {
|
||||
sum += v
|
||||
}
|
||||
} else {
|
||||
sum += value
|
||||
}
|
||||
}
|
||||
return (sum % 10) == 0
|
||||
return digitsHaveLuhnChecksum(ccDigits)
|
||||
}
|
||||
|
||||
// hasLuhnChecksum is the validation for validating if the current field's value has a valid Luhn checksum
|
||||
func hasLuhnChecksum(fl FieldLevel) bool {
|
||||
field := fl.Field()
|
||||
var str string // convert to a string which will then be split into single digits; easier and more readable than shifting/extracting single digits from a number
|
||||
switch field.Kind() {
|
||||
case reflect.String:
|
||||
str = field.String()
|
||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||
str = strconv.FormatInt(field.Int(), 10)
|
||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
||||
str = strconv.FormatUint(field.Uint(), 10)
|
||||
default:
|
||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||
}
|
||||
size := len(str)
|
||||
if size < 2 { // there has to be at least one digit that carries a meaning + the checksum
|
||||
return false
|
||||
}
|
||||
digits := strings.Split(str, "")
|
||||
return digitsHaveLuhnChecksum(digits)
|
||||
}
|
||||
|
||||
// isCron is the validation function for validating if the current field's value is a valid cron expression
|
||||
func isCron(fl FieldLevel) bool {
|
||||
cronString := fl.Field().String()
|
||||
return cronRegex.MatchString(cronString)
|
||||
}
|
||||
|
2
vendor/github.com/go-playground/validator/v10/cache.go
generated
vendored
2
vendor/github.com/go-playground/validator/v10/cache.go
generated
vendored
@@ -120,7 +120,7 @@ func (v *Validate) extractStructCache(current reflect.Value, sName string) *cStr
|
||||
var fld reflect.StructField
|
||||
var tag string
|
||||
var customName string
|
||||
|
||||
|
||||
for i := 0; i < numFields; i++ {
|
||||
|
||||
fld = typ.Field(i)
|
||||
|
1958
vendor/github.com/go-playground/validator/v10/country_codes.go
generated
vendored
1958
vendor/github.com/go-playground/validator/v10/country_codes.go
generated
vendored
File diff suppressed because it is too large
Load Diff
402
vendor/github.com/go-playground/validator/v10/doc.go
generated
vendored
402
vendor/github.com/go-playground/validator/v10/doc.go
generated
vendored
File diff suppressed because it is too large
Load Diff
5
vendor/github.com/go-playground/validator/v10/errors.go
generated
vendored
5
vendor/github.com/go-playground/validator/v10/errors.go
generated
vendored
@@ -44,12 +44,9 @@ func (ve ValidationErrors) Error() string {
|
||||
|
||||
buff := bytes.NewBufferString("")
|
||||
|
||||
var fe *fieldError
|
||||
|
||||
for i := 0; i < len(ve); i++ {
|
||||
|
||||
fe = ve[i].(*fieldError)
|
||||
buff.WriteString(fe.Error())
|
||||
buff.WriteString(ve[i].Error())
|
||||
buff.WriteString("\n")
|
||||
}
|
||||
|
||||
|
16
vendor/github.com/go-playground/validator/v10/options.go
generated
vendored
Normal file
16
vendor/github.com/go-playground/validator/v10/options.go
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
package validator
|
||||
|
||||
// Option represents a configurations option to be applied to validator during initialization.
|
||||
type Option func(*Validate)
|
||||
|
||||
// WithRequiredStructEnabled enables required tag on non-pointer structs to be applied instead of ignored.
|
||||
//
|
||||
// This was made opt-in behaviour in order to maintain backward compatibility with the behaviour previous
|
||||
// to being able to apply struct level validations on struct fields directly.
|
||||
//
|
||||
// It is recommended you enabled this as it will be the default behaviour in v11+
|
||||
func WithRequiredStructEnabled() Option {
|
||||
return func(v *Validate) {
|
||||
v.requiredStructEnabled = true
|
||||
}
|
||||
}
|
16
vendor/github.com/go-playground/validator/v10/regexes.go
generated
vendored
16
vendor/github.com/go-playground/validator/v10/regexes.go
generated
vendored
@@ -19,6 +19,7 @@ const (
|
||||
e164RegexString = "^\\+[1-9]?[0-9]{7,14}$"
|
||||
base64RegexString = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$"
|
||||
base64URLRegexString = "^(?:[A-Za-z0-9-_]{4})*(?:[A-Za-z0-9-_]{2}==|[A-Za-z0-9-_]{3}=|[A-Za-z0-9-_]{4})$"
|
||||
base64RawURLRegexString = "^(?:[A-Za-z0-9-_]{4})*(?:[A-Za-z0-9-_]{2,4})$"
|
||||
iSBN10RegexString = "^(?:[0-9]{9}X|[0-9]{10})$"
|
||||
iSBN13RegexString = "^(?:(?:97(?:8|9))[0-9]{10})$"
|
||||
uUID3RegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$"
|
||||
@@ -64,6 +65,12 @@ const (
|
||||
bicRegexString = `^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$`
|
||||
semverRegexString = `^(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-]+)*))?$` // numbered capture groups https://semver.org/
|
||||
dnsRegexStringRFC1035Label = "^[a-z]([-a-z0-9]*[a-z0-9]){0,62}$"
|
||||
cveRegexString = `^CVE-(1999|2\d{3})-(0[^0]\d{2}|0\d[^0]\d{1}|0\d{2}[^0]|[1-9]{1}\d{3,})$` // CVE Format Id https://cve.mitre.org/cve/identifiers/syntaxchange.html
|
||||
mongodbRegexString = "^[a-f\\d]{24}$"
|
||||
cronRegexString = `(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (\d+(ns|us|µs|ms|s|m|h))+)|((((\d+,)+\d+|(\d+(\/|-)\d+)|\d+|\*) ?){5,7})`
|
||||
spicedbIDRegexString = `^(([a-zA-Z0-9/_|\-=+]{1,})|\*)$`
|
||||
spicedbPermissionRegexString = "^([a-z][a-z0-9_]{1,62}[a-z0-9])?$"
|
||||
spicedbTypeRegexString = "^([a-z][a-z0-9_]{1,61}[a-z0-9]/)?[a-z][a-z0-9_]{1,62}[a-z0-9]$"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -83,6 +90,7 @@ var (
|
||||
emailRegex = regexp.MustCompile(emailRegexString)
|
||||
base64Regex = regexp.MustCompile(base64RegexString)
|
||||
base64URLRegex = regexp.MustCompile(base64URLRegexString)
|
||||
base64RawURLRegex = regexp.MustCompile(base64RawURLRegexString)
|
||||
iSBN10Regex = regexp.MustCompile(iSBN10RegexString)
|
||||
iSBN13Regex = regexp.MustCompile(iSBN13RegexString)
|
||||
uUID3Regex = regexp.MustCompile(uUID3RegexString)
|
||||
@@ -118,8 +126,6 @@ var (
|
||||
btcUpperAddressRegexBech32 = regexp.MustCompile(btcAddressUpperRegexStringBech32)
|
||||
btcLowerAddressRegexBech32 = regexp.MustCompile(btcAddressLowerRegexStringBech32)
|
||||
ethAddressRegex = regexp.MustCompile(ethAddressRegexString)
|
||||
ethAddressRegexUpper = regexp.MustCompile(ethAddressUpperRegexString)
|
||||
ethAddressRegexLower = regexp.MustCompile(ethAddressLowerRegexString)
|
||||
uRLEncodedRegex = regexp.MustCompile(uRLEncodedRegexString)
|
||||
hTMLEncodedRegex = regexp.MustCompile(hTMLEncodedRegexString)
|
||||
hTMLRegex = regexp.MustCompile(hTMLRegexString)
|
||||
@@ -128,4 +134,10 @@ var (
|
||||
bicRegex = regexp.MustCompile(bicRegexString)
|
||||
semverRegex = regexp.MustCompile(semverRegexString)
|
||||
dnsRegexRFC1035Label = regexp.MustCompile(dnsRegexStringRFC1035Label)
|
||||
cveRegex = regexp.MustCompile(cveRegexString)
|
||||
mongodbRegex = regexp.MustCompile(mongodbRegexString)
|
||||
cronRegex = regexp.MustCompile(cronRegexString)
|
||||
spicedbIDRegex = regexp.MustCompile(spicedbIDRegexString)
|
||||
spicedbPermissionRegex = regexp.MustCompile(spicedbPermissionRegexString)
|
||||
spicedbTypeRegex = regexp.MustCompile(spicedbTypeRegexString)
|
||||
)
|
||||
|
6
vendor/github.com/go-playground/validator/v10/struct_level.go
generated
vendored
6
vendor/github.com/go-playground/validator/v10/struct_level.go
generated
vendored
@@ -62,7 +62,7 @@ type StructLevel interface {
|
||||
// existing namespace that validator is on.
|
||||
// e.g. pass 'User.FirstName' or 'Users[0].FirstName' depending
|
||||
// on the nesting. most of the time they will be blank, unless you validate
|
||||
// at a level lower the the current field depth
|
||||
// at a level lower the current field depth
|
||||
ReportValidationErrors(relativeNamespace, relativeActualNamespace string, errs ValidationErrors)
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ var _ StructLevel = new(validate)
|
||||
// if not is a nested struct.
|
||||
//
|
||||
// this is only called when within Struct and Field Level validation and
|
||||
// should not be relied upon for an acurate value otherwise.
|
||||
// should not be relied upon for an accurate value otherwise.
|
||||
func (v *validate) Top() reflect.Value {
|
||||
return v.top
|
||||
}
|
||||
@@ -85,7 +85,7 @@ func (v *validate) Top() reflect.Value {
|
||||
// if not is a nested struct.
|
||||
//
|
||||
// this is only called when within Struct and Field Level validation and
|
||||
// should not be relied upon for an acurate value otherwise.
|
||||
// should not be relied upon for an accurate value otherwise.
|
||||
func (v *validate) Parent() reflect.Value {
|
||||
return v.slflParent
|
||||
}
|
||||
|
14
vendor/github.com/go-playground/validator/v10/util.go
generated
vendored
14
vendor/github.com/go-playground/validator/v10/util.go
generated
vendored
@@ -234,7 +234,7 @@ func asInt(param string) int64 {
|
||||
func asIntFromTimeDuration(param string) int64 {
|
||||
d, err := time.ParseDuration(param)
|
||||
if err != nil {
|
||||
// attempt parsing as an an integer assuming nanosecond precision
|
||||
// attempt parsing as an integer assuming nanosecond precision
|
||||
return asInt(param)
|
||||
}
|
||||
return int64(d)
|
||||
@@ -261,13 +261,19 @@ func asUint(param string) uint64 {
|
||||
return i
|
||||
}
|
||||
|
||||
// asFloat returns the parameter as a float64
|
||||
// asFloat64 returns the parameter as a float64
|
||||
// or panics if it can't convert
|
||||
func asFloat(param string) float64 {
|
||||
|
||||
func asFloat64(param string) float64 {
|
||||
i, err := strconv.ParseFloat(param, 64)
|
||||
panicIf(err)
|
||||
return i
|
||||
}
|
||||
|
||||
// asFloat64 returns the parameter as a float64
|
||||
// or panics if it can't convert
|
||||
func asFloat32(param string) float64 {
|
||||
i, err := strconv.ParseFloat(param, 32)
|
||||
panicIf(err)
|
||||
return i
|
||||
}
|
||||
|
||||
|
114
vendor/github.com/go-playground/validator/v10/validator.go
generated
vendored
114
vendor/github.com/go-playground/validator/v10/validator.go
generated
vendored
@@ -99,6 +99,8 @@ func (v *validate) traverseField(ctx context.Context, parent reflect.Value, curr
|
||||
|
||||
current, kind, v.fldIsPointer = v.extractTypeInternal(current, false)
|
||||
|
||||
var isNestedStruct bool
|
||||
|
||||
switch kind {
|
||||
case reflect.Ptr, reflect.Interface, reflect.Invalid:
|
||||
|
||||
@@ -160,86 +162,61 @@ func (v *validate) traverseField(ctx context.Context, parent reflect.Value, curr
|
||||
}
|
||||
}
|
||||
|
||||
case reflect.Struct:
|
||||
|
||||
typ = current.Type()
|
||||
|
||||
if !typ.ConvertibleTo(timeType) {
|
||||
|
||||
if ct != nil {
|
||||
|
||||
if ct.typeof == typeStructOnly {
|
||||
goto CONTINUE
|
||||
} else if ct.typeof == typeIsDefault {
|
||||
// set Field Level fields
|
||||
v.slflParent = parent
|
||||
v.flField = current
|
||||
v.cf = cf
|
||||
v.ct = ct
|
||||
|
||||
if !ct.fn(ctx, v) {
|
||||
v.str1 = string(append(ns, cf.altName...))
|
||||
|
||||
if v.v.hasTagNameFunc {
|
||||
v.str2 = string(append(structNs, cf.name...))
|
||||
} else {
|
||||
v.str2 = v.str1
|
||||
}
|
||||
|
||||
v.errs = append(v.errs,
|
||||
&fieldError{
|
||||
v: v.v,
|
||||
tag: ct.aliasTag,
|
||||
actualTag: ct.tag,
|
||||
ns: v.str1,
|
||||
structNs: v.str2,
|
||||
fieldLen: uint8(len(cf.altName)),
|
||||
structfieldLen: uint8(len(cf.name)),
|
||||
value: current.Interface(),
|
||||
param: ct.param,
|
||||
kind: kind,
|
||||
typ: typ,
|
||||
},
|
||||
)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
ct = ct.next
|
||||
}
|
||||
|
||||
if ct != nil && ct.typeof == typeNoStructLevel {
|
||||
return
|
||||
}
|
||||
|
||||
CONTINUE:
|
||||
// if len == 0 then validating using 'Var' or 'VarWithValue'
|
||||
// Var - doesn't make much sense to do it that way, should call 'Struct', but no harm...
|
||||
// VarWithField - this allows for validating against each field within the struct against a specific value
|
||||
// pretty handy in certain situations
|
||||
if len(cf.name) > 0 {
|
||||
ns = append(append(ns, cf.altName...), '.')
|
||||
structNs = append(append(structNs, cf.name...), '.')
|
||||
}
|
||||
|
||||
v.validateStruct(ctx, parent, current, typ, ns, structNs, ct)
|
||||
if kind == reflect.Invalid {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if ct == nil || !ct.hasTag {
|
||||
return
|
||||
case reflect.Struct:
|
||||
isNestedStruct = !current.Type().ConvertibleTo(timeType)
|
||||
// For backward compatibility before struct level validation tags were supported
|
||||
// as there were a number of projects relying on `required` not failing on non-pointer
|
||||
// structs. Since it's basically nonsensical to use `required` with a non-pointer struct
|
||||
// are explicitly skipping the required validation for it. This WILL be removed in the
|
||||
// next major version.
|
||||
if !v.v.requiredStructEnabled && ct != nil && ct.tag == requiredTag {
|
||||
ct = ct.next
|
||||
}
|
||||
}
|
||||
|
||||
typ = current.Type()
|
||||
|
||||
OUTER:
|
||||
for {
|
||||
if ct == nil {
|
||||
if ct == nil || !ct.hasTag || (isNestedStruct && len(cf.name) == 0) {
|
||||
// isNestedStruct check here
|
||||
if isNestedStruct {
|
||||
// if len == 0 then validating using 'Var' or 'VarWithValue'
|
||||
// Var - doesn't make much sense to do it that way, should call 'Struct', but no harm...
|
||||
// VarWithField - this allows for validating against each field within the struct against a specific value
|
||||
// pretty handy in certain situations
|
||||
if len(cf.name) > 0 {
|
||||
ns = append(append(ns, cf.altName...), '.')
|
||||
structNs = append(append(structNs, cf.name...), '.')
|
||||
}
|
||||
|
||||
v.validateStruct(ctx, parent, current, typ, ns, structNs, ct)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
switch ct.typeof {
|
||||
case typeNoStructLevel:
|
||||
return
|
||||
|
||||
case typeStructOnly:
|
||||
if isNestedStruct {
|
||||
// if len == 0 then validating using 'Var' or 'VarWithValue'
|
||||
// Var - doesn't make much sense to do it that way, should call 'Struct', but no harm...
|
||||
// VarWithField - this allows for validating against each field within the struct against a specific value
|
||||
// pretty handy in certain situations
|
||||
if len(cf.name) > 0 {
|
||||
ns = append(append(ns, cf.altName...), '.')
|
||||
structNs = append(append(structNs, cf.name...), '.')
|
||||
}
|
||||
|
||||
v.validateStruct(ctx, parent, current, typ, ns, structNs, ct)
|
||||
}
|
||||
return
|
||||
|
||||
case typeOmitEmpty:
|
||||
|
||||
@@ -366,7 +343,7 @@ OUTER:
|
||||
ct = ct.next
|
||||
|
||||
if ct == nil {
|
||||
return
|
||||
continue OUTER
|
||||
}
|
||||
|
||||
if ct.typeof != typeOr {
|
||||
@@ -452,7 +429,6 @@ OUTER:
|
||||
v.ct = ct
|
||||
|
||||
if !ct.fn(ctx, v) {
|
||||
|
||||
v.str1 = string(append(ns, cf.altName...))
|
||||
|
||||
if v.v.hasTagNameFunc {
|
||||
|
65
vendor/github.com/go-playground/validator/v10/validator_instance.go
generated
vendored
65
vendor/github.com/go-playground/validator/v10/validator_instance.go
generated
vendored
@@ -29,6 +29,7 @@ const (
|
||||
requiredWithAllTag = "required_with_all"
|
||||
requiredIfTag = "required_if"
|
||||
requiredUnlessTag = "required_unless"
|
||||
skipUnlessTag = "skip_unless"
|
||||
excludedWithoutAllTag = "excluded_without_all"
|
||||
excludedWithoutTag = "excluded_without"
|
||||
excludedWithTag = "excluded_with"
|
||||
@@ -52,12 +53,14 @@ var (
|
||||
timeDurationType = reflect.TypeOf(time.Duration(0))
|
||||
timeType = reflect.TypeOf(time.Time{})
|
||||
|
||||
byteSliceType = reflect.TypeOf([]byte{})
|
||||
|
||||
defaultCField = &cField{namesEqual: true}
|
||||
)
|
||||
|
||||
// FilterFunc is the type used to filter fields using
|
||||
// StructFiltered(...) function.
|
||||
// returning true results in the field being filtered/skiped from
|
||||
// returning true results in the field being filtered/skipped from
|
||||
// validation
|
||||
type FilterFunc func(ns []byte) bool
|
||||
|
||||
@@ -76,19 +79,20 @@ type internalValidationFuncWrapper struct {
|
||||
|
||||
// Validate contains the validator settings and cache
|
||||
type Validate struct {
|
||||
tagName string
|
||||
pool *sync.Pool
|
||||
hasCustomFuncs bool
|
||||
hasTagNameFunc bool
|
||||
tagNameFunc TagNameFunc
|
||||
structLevelFuncs map[reflect.Type]StructLevelFuncCtx
|
||||
customFuncs map[reflect.Type]CustomTypeFunc
|
||||
aliases map[string]string
|
||||
validations map[string]internalValidationFuncWrapper
|
||||
transTagFunc map[ut.Translator]map[string]TranslationFunc // map[<locale>]map[<tag>]TranslationFunc
|
||||
rules map[reflect.Type]map[string]string
|
||||
tagCache *tagCache
|
||||
structCache *structCache
|
||||
tagName string
|
||||
pool *sync.Pool
|
||||
tagNameFunc TagNameFunc
|
||||
structLevelFuncs map[reflect.Type]StructLevelFuncCtx
|
||||
customFuncs map[reflect.Type]CustomTypeFunc
|
||||
aliases map[string]string
|
||||
validations map[string]internalValidationFuncWrapper
|
||||
transTagFunc map[ut.Translator]map[string]TranslationFunc // map[<locale>]map[<tag>]TranslationFunc
|
||||
rules map[reflect.Type]map[string]string
|
||||
tagCache *tagCache
|
||||
structCache *structCache
|
||||
hasCustomFuncs bool
|
||||
hasTagNameFunc bool
|
||||
requiredStructEnabled bool
|
||||
}
|
||||
|
||||
// New returns a new instance of 'validate' with sane defaults.
|
||||
@@ -96,7 +100,7 @@ type Validate struct {
|
||||
// It caches information about your struct and validations,
|
||||
// in essence only parsing your validation tags once per struct type.
|
||||
// Using multiple instances neglects the benefit of caching.
|
||||
func New() *Validate {
|
||||
func New(options ...Option) *Validate {
|
||||
|
||||
tc := new(tagCache)
|
||||
tc.m.Store(make(map[string]*cTag))
|
||||
@@ -123,7 +127,8 @@ func New() *Validate {
|
||||
switch k {
|
||||
// these require that even if the value is nil that the validation should run, omitempty still overrides this behaviour
|
||||
case requiredIfTag, requiredUnlessTag, requiredWithTag, requiredWithAllTag, requiredWithoutTag, requiredWithoutAllTag,
|
||||
excludedIfTag, excludedUnlessTag, excludedWithTag, excludedWithAllTag, excludedWithoutTag, excludedWithoutAllTag:
|
||||
excludedIfTag, excludedUnlessTag, excludedWithTag, excludedWithAllTag, excludedWithoutTag, excludedWithoutAllTag,
|
||||
skipUnlessTag:
|
||||
_ = v.registerValidation(k, wrapFunc(val), true, true)
|
||||
default:
|
||||
// no need to error check here, baked in will always be valid
|
||||
@@ -142,6 +147,9 @@ func New() *Validate {
|
||||
},
|
||||
}
|
||||
|
||||
for _, o := range options {
|
||||
o(v)
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
@@ -151,7 +159,7 @@ func (v *Validate) SetTagName(name string) {
|
||||
}
|
||||
|
||||
// ValidateMapCtx validates a map using a map of validation rules and allows passing of contextual
|
||||
// validation validation information via context.Context.
|
||||
// validation information via context.Context.
|
||||
func (v Validate) ValidateMapCtx(ctx context.Context, data map[string]interface{}, rules map[string]interface{}) map[string]interface{} {
|
||||
errs := make(map[string]interface{})
|
||||
for field, rule := range rules {
|
||||
@@ -190,14 +198,14 @@ func (v *Validate) ValidateMap(data map[string]interface{}, rules map[string]int
|
||||
//
|
||||
// eg. to use the names which have been specified for JSON representations of structs, rather than normal Go field names:
|
||||
//
|
||||
// validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
|
||||
// name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
|
||||
// // skip if tag key says it should be ignored
|
||||
// if name == "-" {
|
||||
// return ""
|
||||
// }
|
||||
// return name
|
||||
// })
|
||||
// validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
|
||||
// name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
|
||||
// // skip if tag key says it should be ignored
|
||||
// if name == "-" {
|
||||
// return ""
|
||||
// }
|
||||
// return name
|
||||
// })
|
||||
func (v *Validate) RegisterTagNameFunc(fn TagNameFunc) {
|
||||
v.tagNameFunc = fn
|
||||
v.hasTagNameFunc = true
|
||||
@@ -451,7 +459,7 @@ func (v *Validate) StructPartial(s interface{}, fields ...string) error {
|
||||
}
|
||||
|
||||
// StructPartialCtx validates the fields passed in only, ignoring all others and allows passing of contextual
|
||||
// validation validation information via context.Context
|
||||
// validation information via context.Context
|
||||
// Fields may be provided in a namespaced fashion relative to the struct provided
|
||||
// eg. NestedStruct.Field or NestedArrayField[0].Struct.Name
|
||||
//
|
||||
@@ -541,7 +549,7 @@ func (v *Validate) StructExcept(s interface{}, fields ...string) error {
|
||||
}
|
||||
|
||||
// StructExceptCtx validates all fields except the ones passed in and allows passing of contextual
|
||||
// validation validation information via context.Context
|
||||
// validation information via context.Context
|
||||
// Fields may be provided in a namespaced fashion relative to the struct provided
|
||||
// i.e. NestedStruct.Field or NestedArrayField[0].Struct.Name
|
||||
//
|
||||
@@ -613,7 +621,7 @@ func (v *Validate) Var(field interface{}, tag string) error {
|
||||
}
|
||||
|
||||
// VarCtx validates a single variable using tag style validation and allows passing of contextual
|
||||
// validation validation information via context.Context.
|
||||
// validation information via context.Context.
|
||||
// eg.
|
||||
// var i int
|
||||
// validate.Var(i, "gt=1,lt=10")
|
||||
@@ -632,6 +640,7 @@ func (v *Validate) VarCtx(ctx context.Context, field interface{}, tag string) (e
|
||||
}
|
||||
|
||||
ctag := v.fetchCacheTag(tag)
|
||||
|
||||
val := reflect.ValueOf(field)
|
||||
vd := v.pool.Get().(*validate)
|
||||
vd.top = val
|
||||
|
Reference in New Issue
Block a user