mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-11-22 11:46:40 +00:00
[chore]: Bump github.com/go-playground/validator/v10 (#1637)
Bumps [github.com/go-playground/validator/v10](https://github.com/go-playground/validator) from 10.11.2 to 10.12.0. - [Release notes](https://github.com/go-playground/validator/releases) - [Commits](https://github.com/go-playground/validator/compare/v10.11.2...v10.12.0) --- updated-dependencies: - dependency-name: github.com/go-playground/validator/v10 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit is contained in:
parent
66bedc4747
commit
4096e7076a
4
go.mod
4
go.mod
|
@ -27,7 +27,7 @@ require (
|
||||||
github.com/gin-gonic/gin v1.9.0
|
github.com/gin-gonic/gin v1.9.0
|
||||||
github.com/go-fed/httpsig v1.1.0
|
github.com/go-fed/httpsig v1.1.0
|
||||||
github.com/go-playground/form/v4 v4.2.0
|
github.com/go-playground/form/v4 v4.2.0
|
||||||
github.com/go-playground/validator/v10 v10.11.2
|
github.com/go-playground/validator/v10 v10.12.0
|
||||||
github.com/google/uuid v1.3.0
|
github.com/google/uuid v1.3.0
|
||||||
github.com/gorilla/feeds v1.1.1
|
github.com/gorilla/feeds v1.1.1
|
||||||
github.com/gorilla/websocket v1.5.0
|
github.com/gorilla/websocket v1.5.0
|
||||||
|
@ -121,7 +121,7 @@ require (
|
||||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
|
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
|
||||||
github.com/klauspost/compress v1.15.15 // indirect
|
github.com/klauspost/compress v1.15.15 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.3 // indirect
|
github.com/klauspost/cpuid/v2 v2.2.3 // indirect
|
||||||
github.com/leodido/go-urn v1.2.1 // indirect
|
github.com/leodido/go-urn v1.2.2 // indirect
|
||||||
github.com/magiconair/properties v1.8.7 // indirect
|
github.com/magiconair/properties v1.8.7 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.17 // indirect
|
github.com/mattn/go-isatty v0.0.17 // indirect
|
||||||
github.com/minio/md5-simd v1.1.2 // indirect
|
github.com/minio/md5-simd v1.1.2 // indirect
|
||||||
|
|
8
go.sum
8
go.sum
|
@ -219,8 +219,8 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl
|
||||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
||||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||||
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
|
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
|
||||||
github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU=
|
github.com/go-playground/validator/v10 v10.12.0 h1:E4gtWgxWxp8YSxExrQFv5BpCahla0PVF2oTTEYaWQGI=
|
||||||
github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s=
|
github.com/go-playground/validator/v10 v10.12.0/go.mod h1:hCAPuzYvKdP33pxWa+2+6AIKXEKqjIUyqsNCtbsSJrA=
|
||||||
github.com/go-session/session v3.1.2+incompatible/go.mod h1:8B3iivBQjrz/JtC68Np2T1yBBLxTan3mn/3OM0CyRt0=
|
github.com/go-session/session v3.1.2+incompatible/go.mod h1:8B3iivBQjrz/JtC68Np2T1yBBLxTan3mn/3OM0CyRt0=
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
|
github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
|
||||||
|
@ -421,8 +421,9 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
|
|
||||||
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
|
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
|
||||||
|
github.com/leodido/go-urn v1.2.2 h1:7z68G0FCGvDk646jz1AelTYNYWrTNm0bEcFAo147wt4=
|
||||||
|
github.com/leodido/go-urn v1.2.2/go.mod h1:kUaIbLZWttglzwNuG0pgsh5vuV6u2YcGBYz1hIPjtOQ=
|
||||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
|
@ -501,6 +502,7 @@ github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||||
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
|
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
|
||||||
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
|
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
|
github.com/rwtodd/Go.Sed v0.0.0-20210816025313-55464686f9ef/go.mod h1:8AEUvGVi2uQ5b24BIhcr0GCcpd/RNAFWaN2CJFrWIIQ=
|
||||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
|
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
|
||||||
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
|
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
|
||||||
|
|
24
vendor/github.com/go-playground/validator/v10/README.md
generated
vendored
24
vendor/github.com/go-playground/validator/v10/README.md
generated
vendored
|
@ -1,7 +1,7 @@
|
||||||
Package validator
|
Package validator
|
||||||
=================
|
=================
|
||||||
<img align="right" src="https://raw.githubusercontent.com/go-playground/validator/v9/logo.png">[![Join the chat at https://gitter.im/go-playground/validator](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-playground/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
<img align="right" src="https://raw.githubusercontent.com/go-playground/validator/v10/logo.png">[![Join the chat at https://gitter.im/go-playground/validator](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-playground/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
![Project status](https://img.shields.io/badge/version-10.11.2-green.svg)
|
![Project status](https://img.shields.io/badge/version-10.12.0-green.svg)
|
||||||
[![Build Status](https://travis-ci.org/go-playground/validator.svg?branch=master)](https://travis-ci.org/go-playground/validator)
|
[![Build Status](https://travis-ci.org/go-playground/validator.svg?branch=master)](https://travis-ci.org/go-playground/validator)
|
||||||
[![Coverage Status](https://coveralls.io/repos/go-playground/validator/badge.svg?branch=master&service=github)](https://coveralls.io/github/go-playground/validator?branch=master)
|
[![Coverage Status](https://coveralls.io/repos/go-playground/validator/badge.svg?branch=master&service=github)](https://coveralls.io/github/go-playground/validator?branch=master)
|
||||||
[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator)
|
[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator)
|
||||||
|
@ -73,8 +73,8 @@ Baked-in Validations
|
||||||
| - | - |
|
| - | - |
|
||||||
| eqcsfield | Field Equals Another Field (relative)|
|
| eqcsfield | Field Equals Another Field (relative)|
|
||||||
| eqfield | Field Equals Another Field |
|
| eqfield | Field Equals Another Field |
|
||||||
| fieldcontains | NOT DOCUMENTED IN doc.go |
|
| fieldcontains | Check the indicated characters are present in the Field |
|
||||||
| fieldexcludes | NOT DOCUMENTED IN doc.go |
|
| fieldexcludes | Check the indicated characters are not present in the field |
|
||||||
| gtcsfield | Field Greater Than Another Relative Field |
|
| gtcsfield | Field Greater Than Another Relative Field |
|
||||||
| gtecsfield | Field Greater Than or Equal To Another Relative Field |
|
| gtecsfield | Field Greater Than or Equal To Another Relative Field |
|
||||||
| gtefield | Field Greater Than or Equal To Another Field |
|
| gtefield | Field Greater Than or Equal To Another Field |
|
||||||
|
@ -114,6 +114,7 @@ Baked-in Validations
|
||||||
| unix_addr | Unix domain socket end point Address |
|
| unix_addr | Unix domain socket end point Address |
|
||||||
| uri | URI String |
|
| uri | URI String |
|
||||||
| url | URL String |
|
| url | URL String |
|
||||||
|
| http_url | HTTP URL String |
|
||||||
| url_encoded | URL Encoded |
|
| url_encoded | URL Encoded |
|
||||||
| urn_rfc2141 | Urn RFC 2141 String |
|
| urn_rfc2141 | Urn RFC 2141 String |
|
||||||
|
|
||||||
|
@ -137,7 +138,7 @@ Baked-in Validations
|
||||||
| excludesrune | Excludes Rune |
|
| excludesrune | Excludes Rune |
|
||||||
| lowercase | Lowercase |
|
| lowercase | Lowercase |
|
||||||
| multibyte | Multi-Byte Characters |
|
| multibyte | Multi-Byte Characters |
|
||||||
| number | NOT DOCUMENTED IN doc.go |
|
| number | Number |
|
||||||
| numeric | Numeric |
|
| numeric | Numeric |
|
||||||
| printascii | Printable ASCII |
|
| printascii | Printable ASCII |
|
||||||
| startsnotwith | Starts Not With |
|
| startsnotwith | Starts Not With |
|
||||||
|
@ -149,11 +150,14 @@ Baked-in Validations
|
||||||
| - | - |
|
| - | - |
|
||||||
| base64 | Base64 String |
|
| base64 | Base64 String |
|
||||||
| base64url | Base64URL String |
|
| base64url | Base64URL String |
|
||||||
|
| base64rawurl | Base64RawURL String |
|
||||||
| bic | Business Identifier Code (ISO 9362) |
|
| bic | Business Identifier Code (ISO 9362) |
|
||||||
| bcp47_language_tag | Language tag (BCP 47) |
|
| bcp47_language_tag | Language tag (BCP 47) |
|
||||||
| btc_addr | Bitcoin Address |
|
| btc_addr | Bitcoin Address |
|
||||||
| btc_addr_bech32 | Bitcoin Bech32 Address (segwit) |
|
| btc_addr_bech32 | Bitcoin Bech32 Address (segwit) |
|
||||||
| credit_card | Credit Card Number |
|
| credit_card | Credit Card Number |
|
||||||
|
| mongodb | MongoDB ObjectID |
|
||||||
|
| cron | Cron |
|
||||||
| datetime | Datetime |
|
| datetime | Datetime |
|
||||||
| e164 | e164 formatted phone number |
|
| e164 | e164 formatted phone number |
|
||||||
| email | E-mail String
|
| email | E-mail String
|
||||||
|
@ -176,6 +180,7 @@ Baked-in Validations
|
||||||
| jwt | JSON Web Token (JWT) |
|
| jwt | JSON Web Token (JWT) |
|
||||||
| latitude | Latitude |
|
| latitude | Latitude |
|
||||||
| longitude | Longitude |
|
| longitude | Longitude |
|
||||||
|
| luhn_checksum | Luhn Algorithm Checksum (for strings and (u)int) |
|
||||||
| postcode_iso3166_alpha2 | Postcode |
|
| postcode_iso3166_alpha2 | Postcode |
|
||||||
| postcode_iso3166_alpha2_field | Postcode |
|
| postcode_iso3166_alpha2_field | Postcode |
|
||||||
| rgb | RGB String |
|
| rgb | RGB String |
|
||||||
|
@ -202,22 +207,27 @@ Baked-in Validations
|
||||||
| tiger192 | TIGER192 hash |
|
| tiger192 | TIGER192 hash |
|
||||||
| semver | Semantic Versioning 2.0.0 |
|
| semver | Semantic Versioning 2.0.0 |
|
||||||
| ulid | Universally Unique Lexicographically Sortable Identifier ULID |
|
| ulid | Universally Unique Lexicographically Sortable Identifier ULID |
|
||||||
|
| cve | Common Vulnerabilities and Exposures Identifier (CVE id) |
|
||||||
|
|
||||||
### Comparisons:
|
### Comparisons:
|
||||||
| Tag | Description |
|
| Tag | Description |
|
||||||
| - | - |
|
| - | - |
|
||||||
| eq | Equals |
|
| eq | Equals |
|
||||||
|
| eq_ignore_case | Equals ignoring case |
|
||||||
| gt | Greater than|
|
| gt | Greater than|
|
||||||
| gte | Greater than or equal |
|
| gte | Greater than or equal |
|
||||||
| lt | Less Than |
|
| lt | Less Than |
|
||||||
| lte | Less Than or Equal |
|
| lte | Less Than or Equal |
|
||||||
| ne | Not Equal |
|
| ne | Not Equal |
|
||||||
|
| ne_ignore_case | Not Equal ignoring case |
|
||||||
|
|
||||||
### Other:
|
### Other:
|
||||||
| Tag | Description |
|
| Tag | Description |
|
||||||
| - | - |
|
| - | - |
|
||||||
| dir | Directory |
|
| dir | Existing Directory |
|
||||||
| file | File path |
|
| dirpath | Directory Path |
|
||||||
|
| file | Existing File |
|
||||||
|
| filepath | File Path |
|
||||||
| isdefault | Is Default |
|
| isdefault | Is Default |
|
||||||
| len | Length |
|
| len | Length |
|
||||||
| max | Maximum |
|
| max | Maximum |
|
||||||
|
|
311
vendor/github.com/go-playground/validator/v10/baked_in.go
generated
vendored
311
vendor/github.com/go-playground/validator/v10/baked_in.go
generated
vendored
|
@ -7,6 +7,7 @@
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/fs"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
@ -14,13 +15,14 @@
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
"golang.org/x/crypto/sha3"
|
"golang.org/x/crypto/sha3"
|
||||||
"golang.org/x/text/language"
|
"golang.org/x/text/language"
|
||||||
|
|
||||||
urn "github.com/leodido/go-urn"
|
"github.com/leodido/go-urn"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Func accepts a FieldLevel interface for all validation needs. The return
|
// Func accepts a FieldLevel interface for all validation needs. The return
|
||||||
|
@ -86,7 +88,9 @@ func wrapFunc(fn Func) FuncCtx {
|
||||||
"min": hasMinOf,
|
"min": hasMinOf,
|
||||||
"max": hasMaxOf,
|
"max": hasMaxOf,
|
||||||
"eq": isEq,
|
"eq": isEq,
|
||||||
|
"eq_ignore_case": isEqIgnoreCase,
|
||||||
"ne": isNe,
|
"ne": isNe,
|
||||||
|
"ne_ignore_case": isNeIgnoreCase,
|
||||||
"lt": isLt,
|
"lt": isLt,
|
||||||
"lte": isLte,
|
"lte": isLte,
|
||||||
"gt": isGt,
|
"gt": isGt,
|
||||||
|
@ -121,11 +125,14 @@ func wrapFunc(fn Func) FuncCtx {
|
||||||
"e164": isE164,
|
"e164": isE164,
|
||||||
"email": isEmail,
|
"email": isEmail,
|
||||||
"url": isURL,
|
"url": isURL,
|
||||||
|
"http_url": isHttpURL,
|
||||||
"uri": isURI,
|
"uri": isURI,
|
||||||
"urn_rfc2141": isUrnRFC2141, // RFC 2141
|
"urn_rfc2141": isUrnRFC2141, // RFC 2141
|
||||||
"file": isFile,
|
"file": isFile,
|
||||||
|
"filepath": isFilePath,
|
||||||
"base64": isBase64,
|
"base64": isBase64,
|
||||||
"base64url": isBase64URL,
|
"base64url": isBase64URL,
|
||||||
|
"base64rawurl": isBase64RawURL,
|
||||||
"contains": contains,
|
"contains": contains,
|
||||||
"containsany": containsAny,
|
"containsany": containsAny,
|
||||||
"containsrune": containsRune,
|
"containsrune": containsRune,
|
||||||
|
@ -140,6 +147,7 @@ func wrapFunc(fn Func) FuncCtx {
|
||||||
"isbn10": isISBN10,
|
"isbn10": isISBN10,
|
||||||
"isbn13": isISBN13,
|
"isbn13": isISBN13,
|
||||||
"eth_addr": isEthereumAddress,
|
"eth_addr": isEthereumAddress,
|
||||||
|
"eth_addr_checksum": isEthereumAddressChecksum,
|
||||||
"btc_addr": isBitcoinAddress,
|
"btc_addr": isBitcoinAddress,
|
||||||
"btc_addr_bech32": isBitcoinBech32Address,
|
"btc_addr_bech32": isBitcoinBech32Address,
|
||||||
"uuid": isUUID,
|
"uuid": isUUID,
|
||||||
|
@ -194,6 +202,7 @@ func wrapFunc(fn Func) FuncCtx {
|
||||||
"html_encoded": isHTMLEncoded,
|
"html_encoded": isHTMLEncoded,
|
||||||
"url_encoded": isURLEncoded,
|
"url_encoded": isURLEncoded,
|
||||||
"dir": isDir,
|
"dir": isDir,
|
||||||
|
"dirpath": isDirPath,
|
||||||
"json": isJSON,
|
"json": isJSON,
|
||||||
"jwt": isJWT,
|
"jwt": isJWT,
|
||||||
"hostname_port": isHostnamePort,
|
"hostname_port": isHostnamePort,
|
||||||
|
@ -214,6 +223,10 @@ func wrapFunc(fn Func) FuncCtx {
|
||||||
"semver": isSemverFormat,
|
"semver": isSemverFormat,
|
||||||
"dns_rfc1035_label": isDnsRFC1035LabelFormat,
|
"dns_rfc1035_label": isDnsRFC1035LabelFormat,
|
||||||
"credit_card": isCreditCard,
|
"credit_card": isCreditCard,
|
||||||
|
"cve": isCveFormat,
|
||||||
|
"luhn_checksum": hasLuhnChecksum,
|
||||||
|
"mongodb": isMongoDB,
|
||||||
|
"cron": isCron,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -307,18 +320,42 @@ func isUnique(fl FieldLevel) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
m := reflect.MakeMap(reflect.MapOf(sfTyp, v.Type()))
|
m := reflect.MakeMap(reflect.MapOf(sfTyp, v.Type()))
|
||||||
|
var fieldlen int
|
||||||
for i := 0; i < field.Len(); i++ {
|
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:
|
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() {
|
for _, k := range field.MapKeys() {
|
||||||
m.SetMapIndex(field.MapIndex(k), v)
|
m.SetMapIndex(reflect.Indirect(field.MapIndex(k)), v)
|
||||||
}
|
}
|
||||||
|
|
||||||
return field.Len() == m.Len()
|
return field.Len() == m.Len()
|
||||||
default:
|
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()))
|
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -613,14 +650,16 @@ func isISBN10(fl FieldLevel) bool {
|
||||||
func isEthereumAddress(fl FieldLevel) bool {
|
func isEthereumAddress(fl FieldLevel) bool {
|
||||||
address := fl.Field().String()
|
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) {
|
if !ethAddressRegex.MatchString(address) {
|
||||||
return false
|
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
|
// Checksum validation. Reference: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md
|
||||||
address = address[2:] // Skip "0x" prefix.
|
address = address[2:] // Skip "0x" prefix.
|
||||||
h := sha3.NewLegacyKeccak256()
|
h := sha3.NewLegacyKeccak256()
|
||||||
|
@ -889,6 +928,12 @@ func isNe(fl FieldLevel) bool {
|
||||||
return !isEq(fl)
|
return !isEq(fl)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isNe 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.
|
// 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 {
|
func isLteCrossStructField(fl FieldLevel) bool {
|
||||||
field := fl.Field()
|
field := fl.Field()
|
||||||
|
@ -1260,6 +1305,22 @@ func isEq(fl FieldLevel) bool {
|
||||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
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
|
// isPostcodeByIso3166Alpha2 validates by value which is country code in iso 3166 alpha 2
|
||||||
// example: `postcode_iso3166_alpha2=US`
|
// example: `postcode_iso3166_alpha2=US`
|
||||||
func isPostcodeByIso3166Alpha2(fl FieldLevel) bool {
|
func isPostcodeByIso3166Alpha2(fl FieldLevel) bool {
|
||||||
|
@ -1311,6 +1372,11 @@ func isBase64URL(fl FieldLevel) bool {
|
||||||
return base64URLRegex.MatchString(fl.Field().String())
|
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.
|
// isURI is the validation function for validating if the current field's value is a valid URI.
|
||||||
func isURI(fl FieldLevel) bool {
|
func isURI(fl FieldLevel) bool {
|
||||||
field := fl.Field()
|
field := fl.Field()
|
||||||
|
@ -1370,6 +1436,23 @@ func isURL(fl FieldLevel) bool {
|
||||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
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())
|
||||||
|
return strings.HasPrefix(s, "http://") || strings.HasPrefix(s, "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.
|
// 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 {
|
func isUrnRFC2141(fl FieldLevel) bool {
|
||||||
field := fl.Field()
|
field := fl.Field()
|
||||||
|
@ -1387,7 +1470,7 @@ func isUrnRFC2141(fl FieldLevel) bool {
|
||||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
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 {
|
func isFile(fl FieldLevel) bool {
|
||||||
field := fl.Field()
|
field := fl.Field()
|
||||||
|
|
||||||
|
@ -1404,6 +1487,57 @@ func isFile(fl FieldLevel) bool {
|
||||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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()
|
||||||
|
|
||||||
|
// 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.
|
// 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 {
|
func isE164(fl FieldLevel) bool {
|
||||||
return e164Regex.MatchString(fl.Field().String())
|
return e164Regex.MatchString(fl.Field().String())
|
||||||
|
@ -1539,7 +1673,9 @@ func requireCheckFieldKind(fl FieldLevel, param string, defaultNotFoundValue boo
|
||||||
}
|
}
|
||||||
|
|
||||||
// requireCheckFieldValue is a func for check field value
|
// 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)
|
field, kind, _, found := fl.GetStructFieldOKAdvanced2(fl.Parent(), param)
|
||||||
if !found {
|
if !found {
|
||||||
return defaultNotFoundValue
|
return defaultNotFoundValue
|
||||||
|
@ -1623,10 +1759,10 @@ func excludedUnless(fl FieldLevel) bool {
|
||||||
}
|
}
|
||||||
for i := 0; i < len(params); i += 2 {
|
for i := 0; i < len(params); i += 2 {
|
||||||
if !requireCheckFieldValue(fl, params[i], params[i+1], false) {
|
if !requireCheckFieldValue(fl, params[i], params[i+1], false) {
|
||||||
return true
|
return !hasValue(fl)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return !hasValue(fl)
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// excludedWith is the validation function
|
// excludedWith is the validation function
|
||||||
|
@ -2275,7 +2411,7 @@ func isFQDN(fl FieldLevel) bool {
|
||||||
return fqdnRegexRFC1123.MatchString(val)
|
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 {
|
func isDir(fl FieldLevel) bool {
|
||||||
field := fl.Field()
|
field := fl.Field()
|
||||||
|
|
||||||
|
@ -2291,6 +2427,64 @@ func isDir(fl FieldLevel) bool {
|
||||||
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
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.
|
// isJSON is the validation function for validating if the current field's value is a valid json string.
|
||||||
func isJSON(fl FieldLevel) bool {
|
func isJSON(fl FieldLevel) bool {
|
||||||
field := fl.Field()
|
field := fl.Field()
|
||||||
|
@ -2316,7 +2510,9 @@ func isHostnamePort(fl FieldLevel) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
// Port must be a iny <= 65535.
|
// 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
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2479,6 +2675,13 @@ func isSemverFormat(fl FieldLevel) bool {
|
||||||
return semverRegex.MatchString(semverString)
|
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
|
// isDnsRFC1035LabelFormat is the validation function
|
||||||
// for validating if the current field's value is
|
// for validating if the current field's value is
|
||||||
// a valid dns RFC 1035 label, defined in RFC 1035.
|
// a valid dns RFC 1035 label, defined in RFC 1035.
|
||||||
|
@ -2487,6 +2690,35 @@ func isDnsRFC1035LabelFormat(fl FieldLevel) bool {
|
||||||
return dnsRegexRFC1035Label.MatchString(val)
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
// isCreditCard is the validation function for validating if the current field's value is a valid credit card number
|
// isCreditCard is the validation function for validating if the current field's value is a valid credit card number
|
||||||
func isCreditCard(fl FieldLevel) bool {
|
func isCreditCard(fl FieldLevel) bool {
|
||||||
val := fl.Field().String()
|
val := fl.Field().String()
|
||||||
|
@ -2505,22 +2737,33 @@ func isCreditCard(fl FieldLevel) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
sum := 0
|
return digitsHaveLuhnChecksum(ccDigits)
|
||||||
for i, digit := range ccDigits {
|
}
|
||||||
value, err := strconv.Atoi(digit)
|
|
||||||
if err != nil {
|
// hasLuhnChecksum is the validation for validating if the current field's value has a valid Luhn checksum
|
||||||
return false
|
func hasLuhnChecksum(fl FieldLevel) bool {
|
||||||
}
|
field := fl.Field()
|
||||||
if size%2 == 0 && i%2 == 0 || size%2 == 1 && i%2 == 1 {
|
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
|
||||||
v := value * 2
|
switch field.Kind() {
|
||||||
if v >= 10 {
|
case reflect.String:
|
||||||
sum += 1 + (v % 10)
|
str = field.String()
|
||||||
} else {
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||||
sum += v
|
str = strconv.FormatInt(field.Int(), 10)
|
||||||
}
|
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
||||||
} else {
|
str = strconv.FormatUint(field.Uint(), 10)
|
||||||
sum += value
|
default:
|
||||||
}
|
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
|
||||||
}
|
}
|
||||||
return (sum % 10) == 0
|
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 fld reflect.StructField
|
||||||
var tag string
|
var tag string
|
||||||
var customName string
|
var customName string
|
||||||
|
|
||||||
for i := 0; i < numFields; i++ {
|
for i := 0; i < numFields; i++ {
|
||||||
|
|
||||||
fld = typ.Field(i)
|
fld = typ.Field(i)
|
||||||
|
|
6
vendor/github.com/go-playground/validator/v10/country_codes.go
generated
vendored
6
vendor/github.com/go-playground/validator/v10/country_codes.go
generated
vendored
|
@ -51,7 +51,7 @@
|
||||||
"TV": true, "UG": true, "UA": true, "AE": true, "GB": true,
|
"TV": true, "UG": true, "UA": true, "AE": true, "GB": true,
|
||||||
"US": true, "UM": true, "UY": true, "UZ": true, "VU": true,
|
"US": true, "UM": true, "UY": true, "UZ": true, "VU": true,
|
||||||
"VE": true, "VN": true, "VG": true, "VI": true, "WF": true,
|
"VE": true, "VN": true, "VG": true, "VI": true, "WF": true,
|
||||||
"EH": true, "YE": true, "ZM": true, "ZW": true,
|
"EH": true, "YE": true, "ZM": true, "ZW": true, "XK": true,
|
||||||
}
|
}
|
||||||
|
|
||||||
var iso3166_1_alpha3 = map[string]bool{
|
var iso3166_1_alpha3 = map[string]bool{
|
||||||
|
@ -105,7 +105,7 @@
|
||||||
"UGA": true, "UKR": true, "ARE": true, "GBR": true, "UMI": true,
|
"UGA": true, "UKR": true, "ARE": true, "GBR": true, "UMI": true,
|
||||||
"USA": true, "URY": true, "UZB": true, "VUT": true, "VEN": true,
|
"USA": true, "URY": true, "UZB": true, "VUT": true, "VEN": true,
|
||||||
"VNM": true, "VGB": true, "VIR": true, "WLF": true, "ESH": true,
|
"VNM": true, "VGB": true, "VIR": true, "WLF": true, "ESH": true,
|
||||||
"YEM": true, "ZMB": true, "ZWE": true, "ALA": true,
|
"YEM": true, "ZMB": true, "ZWE": true, "ALA": true, "UNK": true,
|
||||||
}
|
}
|
||||||
var iso3166_1_alpha_numeric = map[int]bool{
|
var iso3166_1_alpha_numeric = map[int]bool{
|
||||||
// see: https://www.iso.org/iso-3166-country-codes.html
|
// see: https://www.iso.org/iso-3166-country-codes.html
|
||||||
|
@ -158,7 +158,7 @@
|
||||||
800: true, 804: true, 784: true, 826: true, 581: true,
|
800: true, 804: true, 784: true, 826: true, 581: true,
|
||||||
840: true, 858: true, 860: true, 548: true, 862: true,
|
840: true, 858: true, 860: true, 548: true, 862: true,
|
||||||
704: true, 92: true, 850: true, 876: true, 732: true,
|
704: true, 92: true, 850: true, 876: true, 732: true,
|
||||||
887: true, 894: true, 716: true, 248: true,
|
887: true, 894: true, 716: true, 248: true, 153:true,
|
||||||
}
|
}
|
||||||
|
|
||||||
var iso3166_2 = map[string]bool{
|
var iso3166_2 = map[string]bool{
|
||||||
|
|
374
vendor/github.com/go-playground/validator/v10/doc.go
generated
vendored
374
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("")
|
buff := bytes.NewBufferString("")
|
||||||
|
|
||||||
var fe *fieldError
|
|
||||||
|
|
||||||
for i := 0; i < len(ve); i++ {
|
for i := 0; i < len(ve); i++ {
|
||||||
|
|
||||||
fe = ve[i].(*fieldError)
|
buff.WriteString(ve[i].Error())
|
||||||
buff.WriteString(fe.Error())
|
|
||||||
buff.WriteString("\n")
|
buff.WriteString("\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
10
vendor/github.com/go-playground/validator/v10/regexes.go
generated
vendored
10
vendor/github.com/go-playground/validator/v10/regexes.go
generated
vendored
|
@ -19,6 +19,7 @@
|
||||||
e164RegexString = "^\\+[1-9]?[0-9]{7,14}$"
|
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})$"
|
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})$"
|
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})$"
|
iSBN10RegexString = "^(?:[0-9]{9}X|[0-9]{10})$"
|
||||||
iSBN13RegexString = "^(?:(?:97(?:8|9))[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}$"
|
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,9 @@
|
||||||
bicRegexString = `^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$`
|
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/
|
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}$"
|
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})`
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -83,6 +87,7 @@
|
||||||
emailRegex = regexp.MustCompile(emailRegexString)
|
emailRegex = regexp.MustCompile(emailRegexString)
|
||||||
base64Regex = regexp.MustCompile(base64RegexString)
|
base64Regex = regexp.MustCompile(base64RegexString)
|
||||||
base64URLRegex = regexp.MustCompile(base64URLRegexString)
|
base64URLRegex = regexp.MustCompile(base64URLRegexString)
|
||||||
|
base64RawURLRegex = regexp.MustCompile(base64RawURLRegexString)
|
||||||
iSBN10Regex = regexp.MustCompile(iSBN10RegexString)
|
iSBN10Regex = regexp.MustCompile(iSBN10RegexString)
|
||||||
iSBN13Regex = regexp.MustCompile(iSBN13RegexString)
|
iSBN13Regex = regexp.MustCompile(iSBN13RegexString)
|
||||||
uUID3Regex = regexp.MustCompile(uUID3RegexString)
|
uUID3Regex = regexp.MustCompile(uUID3RegexString)
|
||||||
|
@ -118,8 +123,6 @@
|
||||||
btcUpperAddressRegexBech32 = regexp.MustCompile(btcAddressUpperRegexStringBech32)
|
btcUpperAddressRegexBech32 = regexp.MustCompile(btcAddressUpperRegexStringBech32)
|
||||||
btcLowerAddressRegexBech32 = regexp.MustCompile(btcAddressLowerRegexStringBech32)
|
btcLowerAddressRegexBech32 = regexp.MustCompile(btcAddressLowerRegexStringBech32)
|
||||||
ethAddressRegex = regexp.MustCompile(ethAddressRegexString)
|
ethAddressRegex = regexp.MustCompile(ethAddressRegexString)
|
||||||
ethAddressRegexUpper = regexp.MustCompile(ethAddressUpperRegexString)
|
|
||||||
ethAddressRegexLower = regexp.MustCompile(ethAddressLowerRegexString)
|
|
||||||
uRLEncodedRegex = regexp.MustCompile(uRLEncodedRegexString)
|
uRLEncodedRegex = regexp.MustCompile(uRLEncodedRegexString)
|
||||||
hTMLEncodedRegex = regexp.MustCompile(hTMLEncodedRegexString)
|
hTMLEncodedRegex = regexp.MustCompile(hTMLEncodedRegexString)
|
||||||
hTMLRegex = regexp.MustCompile(hTMLRegexString)
|
hTMLRegex = regexp.MustCompile(hTMLRegexString)
|
||||||
|
@ -128,4 +131,7 @@
|
||||||
bicRegex = regexp.MustCompile(bicRegexString)
|
bicRegex = regexp.MustCompile(bicRegexString)
|
||||||
semverRegex = regexp.MustCompile(semverRegexString)
|
semverRegex = regexp.MustCompile(semverRegexString)
|
||||||
dnsRegexRFC1035Label = regexp.MustCompile(dnsRegexStringRFC1035Label)
|
dnsRegexRFC1035Label = regexp.MustCompile(dnsRegexStringRFC1035Label)
|
||||||
|
cveRegex = regexp.MustCompile(cveRegexString)
|
||||||
|
mongodbRegex = regexp.MustCompile(mongodbRegexString)
|
||||||
|
cronRegex = regexp.MustCompile(cronRegexString)
|
||||||
)
|
)
|
||||||
|
|
1
vendor/github.com/go-playground/validator/v10/validator.go
generated
vendored
1
vendor/github.com/go-playground/validator/v10/validator.go
generated
vendored
|
@ -452,7 +452,6 @@ func (v *validate) traverseField(ctx context.Context, parent reflect.Value, curr
|
||||||
v.ct = ct
|
v.ct = ct
|
||||||
|
|
||||||
if !ct.fn(ctx, v) {
|
if !ct.fn(ctx, v) {
|
||||||
|
|
||||||
v.str1 = string(append(ns, cf.altName...))
|
v.str1 = string(append(ns, cf.altName...))
|
||||||
|
|
||||||
if v.v.hasTagNameFunc {
|
if v.v.hasTagNameFunc {
|
||||||
|
|
19
vendor/github.com/go-playground/validator/v10/validator_instance.go
generated
vendored
19
vendor/github.com/go-playground/validator/v10/validator_instance.go
generated
vendored
|
@ -190,14 +190,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:
|
// 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 {
|
// validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
|
||||||
// name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
|
// name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
|
||||||
// // skip if tag key says it should be ignored
|
// // skip if tag key says it should be ignored
|
||||||
// if name == "-" {
|
// if name == "-" {
|
||||||
// return ""
|
// return ""
|
||||||
// }
|
// }
|
||||||
// return name
|
// return name
|
||||||
// })
|
// })
|
||||||
func (v *Validate) RegisterTagNameFunc(fn TagNameFunc) {
|
func (v *Validate) RegisterTagNameFunc(fn TagNameFunc) {
|
||||||
v.tagNameFunc = fn
|
v.tagNameFunc = fn
|
||||||
v.hasTagNameFunc = true
|
v.hasTagNameFunc = true
|
||||||
|
@ -613,7 +613,7 @@ func (v *Validate) Var(field interface{}, tag string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// VarCtx validates a single variable using tag style validation and allows passing of contextual
|
// 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.
|
// eg.
|
||||||
// var i int
|
// var i int
|
||||||
// validate.Var(i, "gt=1,lt=10")
|
// validate.Var(i, "gt=1,lt=10")
|
||||||
|
@ -632,6 +632,7 @@ func (v *Validate) VarCtx(ctx context.Context, field interface{}, tag string) (e
|
||||||
}
|
}
|
||||||
|
|
||||||
ctag := v.fetchCacheTag(tag)
|
ctag := v.fetchCacheTag(tag)
|
||||||
|
|
||||||
val := reflect.ValueOf(field)
|
val := reflect.ValueOf(field)
|
||||||
vd := v.pool.Get().(*validate)
|
vd := v.pool.Get().(*validate)
|
||||||
vd.top = val
|
vd.top = val
|
||||||
|
|
3
vendor/github.com/leodido/go-urn/.gitignore
generated
vendored
3
vendor/github.com/leodido/go-urn/.gitignore
generated
vendored
|
@ -8,4 +8,5 @@
|
||||||
*.out
|
*.out
|
||||||
*.txt
|
*.txt
|
||||||
|
|
||||||
vendor/
|
vendor/
|
||||||
|
/removecomments
|
16
vendor/github.com/leodido/go-urn/.travis.yml
generated
vendored
16
vendor/github.com/leodido/go-urn/.travis.yml
generated
vendored
|
@ -1,16 +0,0 @@
|
||||||
language: go
|
|
||||||
|
|
||||||
go:
|
|
||||||
- 1.13.x
|
|
||||||
- 1.14.x
|
|
||||||
- 1.15.x
|
|
||||||
- tip
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- go get -t -v ./...
|
|
||||||
|
|
||||||
script:
|
|
||||||
- go test -race -coverprofile=coverage.txt -covermode=atomic
|
|
||||||
|
|
||||||
after_success:
|
|
||||||
- bash <(curl -s https://codecov.io/bash)
|
|
28
vendor/github.com/leodido/go-urn/README.md
generated
vendored
28
vendor/github.com/leodido/go-urn/README.md
generated
vendored
|
@ -1,4 +1,4 @@
|
||||||
[![Build](https://img.shields.io/travis/leodido/go-urn/master.svg?style=for-the-badge)](https://travis-ci.org/leodido/go-urn) [![Coverage](https://img.shields.io/codecov/c/github/leodido/go-urn.svg?style=for-the-badge)](https://codecov.io/gh/leodido/go-urn) [![Documentation](https://img.shields.io/badge/godoc-reference-blue.svg?style=for-the-badge)](https://godoc.org/github.com/leodido/go-urn)
|
[![Build](https://img.shields.io/circleci/build/github/leodido/go-urn?style=for-the-badge)](https://app.circleci.com/pipelines/github/leodido/go-urn) [![Coverage](https://img.shields.io/codecov/c/github/leodido/go-urn.svg?style=for-the-badge)](https://codecov.io/gh/leodido/go-urn) [![Documentation](https://img.shields.io/badge/godoc-reference-blue.svg?style=for-the-badge)](https://godoc.org/github.com/leodido/go-urn)
|
||||||
|
|
||||||
**A parser for URNs**.
|
**A parser for URNs**.
|
||||||
|
|
||||||
|
@ -52,4 +52,30 @@ no/19/urn:UrN:NSS__________________________________/-4 20000000 399 ns
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Example
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/leodido/go-urn"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var uid = "URN:foo:a123,456"
|
||||||
|
|
||||||
|
u, ok := urn.Parse([]byte(uid))
|
||||||
|
if !ok {
|
||||||
|
panic("error parsing urn")
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(u.ID)
|
||||||
|
fmt.Println(u.SS)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// foo
|
||||||
|
// a123,456
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
[![Analytics](https://ga-beacon.appspot.com/UA-49657176-1/go-urn?flat)](https://github.com/igrigorik/ga-beacon)
|
[![Analytics](https://ga-beacon.appspot.com/UA-49657176-1/go-urn?flat)](https://github.com/igrigorik/ga-beacon)
|
38
vendor/github.com/leodido/go-urn/makefile
generated
vendored
38
vendor/github.com/leodido/go-urn/makefile
generated
vendored
|
@ -1,18 +1,37 @@
|
||||||
SHELL := /bin/bash
|
SHELL := /bin/bash
|
||||||
|
RAGEL := ragel
|
||||||
|
GOFMT := go fmt
|
||||||
|
|
||||||
|
export GO_TEST=env GOTRACEBACK=all go test $(GO_ARGS)
|
||||||
|
|
||||||
|
.PHONY: build
|
||||||
build: machine.go
|
build: machine.go
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
@rm -rf docs
|
||||||
|
@rm -f machine.go
|
||||||
|
|
||||||
|
.PHONY: images
|
||||||
images: docs/urn.png
|
images: docs/urn.png
|
||||||
|
|
||||||
|
.PHONY: removecomments
|
||||||
|
removecomments:
|
||||||
|
@go build ./tools/removecomments
|
||||||
|
|
||||||
machine.go: machine.go.rl
|
machine.go: machine.go.rl
|
||||||
ragel -Z -G2 -e -o $@ $<
|
|
||||||
@sed -i '/^\/\/line/d' $@
|
machine.go: removecomments
|
||||||
@$(MAKE) -s file=$@ snake2camel
|
|
||||||
@gofmt -w -s $@
|
machine.go:
|
||||||
|
$(RAGEL) -Z -G2 -e -o $@ $<
|
||||||
|
@./removecomments $@
|
||||||
|
$(MAKE) -s file=$@ snake2camel
|
||||||
|
$(GOFMT) $@
|
||||||
|
|
||||||
docs/urn.dot: machine.go.rl
|
docs/urn.dot: machine.go.rl
|
||||||
@mkdir -p docs
|
@mkdir -p docs
|
||||||
ragel -Z -e -Vp $< -o $@
|
$(RAGEL) -Z -e -Vp $< -o $@
|
||||||
|
|
||||||
docs/urn.png: docs/urn.dot
|
docs/urn.png: docs/urn.dot
|
||||||
dot $< -Tpng -o $@
|
dot $< -Tpng -o $@
|
||||||
|
@ -22,13 +41,8 @@ bench: *_test.go machine.go
|
||||||
go test -bench=. -benchmem -benchtime=5s ./...
|
go test -bench=. -benchmem -benchtime=5s ./...
|
||||||
|
|
||||||
.PHONY: tests
|
.PHONY: tests
|
||||||
tests: *_test.go machine.go
|
tests: *_test.go
|
||||||
go test -race -timeout 10s -coverprofile=coverage.out -covermode=atomic -v ./...
|
$(GO_TEST) ./...
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
@rm -rf docs
|
|
||||||
@rm -f machine.go
|
|
||||||
|
|
||||||
.PHONY: snake2camel
|
.PHONY: snake2camel
|
||||||
snake2camel:
|
snake2camel:
|
||||||
|
|
6
vendor/modules.txt
vendored
6
vendor/modules.txt
vendored
|
@ -210,7 +210,7 @@ github.com/go-playground/locales/currency
|
||||||
# github.com/go-playground/universal-translator v0.18.1
|
# github.com/go-playground/universal-translator v0.18.1
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
github.com/go-playground/universal-translator
|
github.com/go-playground/universal-translator
|
||||||
# github.com/go-playground/validator/v10 v10.11.2
|
# github.com/go-playground/validator/v10 v10.12.0
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
github.com/go-playground/validator/v10
|
github.com/go-playground/validator/v10
|
||||||
# github.com/go-xmlfmt/xmlfmt v0.0.0-20211206191508-7fd73a941850
|
# github.com/go-xmlfmt/xmlfmt v0.0.0-20211206191508-7fd73a941850
|
||||||
|
@ -337,8 +337,8 @@ github.com/klauspost/compress/zlib
|
||||||
# github.com/klauspost/cpuid/v2 v2.2.3
|
# github.com/klauspost/cpuid/v2 v2.2.3
|
||||||
## explicit; go 1.15
|
## explicit; go 1.15
|
||||||
github.com/klauspost/cpuid/v2
|
github.com/klauspost/cpuid/v2
|
||||||
# github.com/leodido/go-urn v1.2.1
|
# github.com/leodido/go-urn v1.2.2
|
||||||
## explicit; go 1.13
|
## explicit; go 1.16
|
||||||
github.com/leodido/go-urn
|
github.com/leodido/go-urn
|
||||||
# github.com/magiconair/properties v1.8.7
|
# github.com/magiconair/properties v1.8.7
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
|
|
Loading…
Reference in a new issue