summaryrefslogtreecommitdiff
path: root/vendor/github.com/go-playground
diff options
context:
space:
mode:
authorLibravatar Terin Stock <terinjokes@gmail.com>2025-03-09 17:47:56 +0100
committerLibravatar Terin Stock <terinjokes@gmail.com>2025-03-10 01:59:49 +0100
commit3ac1ee16f377d31a0fb80c8dae28b6239ac4229e (patch)
treef61faa581feaaeaba2542b9f2b8234a590684413 /vendor/github.com/go-playground
parent[chore] update URLs to forked source (diff)
downloadgotosocial-3ac1ee16f377d31a0fb80c8dae28b6239ac4229e.tar.xz
[chore] remove vendor
Diffstat (limited to 'vendor/github.com/go-playground')
-rw-r--r--vendor/github.com/go-playground/form/v4/.gitignore28
-rw-r--r--vendor/github.com/go-playground/form/v4/LICENSE21
-rw-r--r--vendor/github.com/go-playground/form/v4/Makefile13
-rw-r--r--vendor/github.com/go-playground/form/v4/README.md323
-rw-r--r--vendor/github.com/go-playground/form/v4/cache.go133
-rw-r--r--vendor/github.com/go-playground/form/v4/decoder.go752
-rw-r--r--vendor/github.com/go-playground/form/v4/doc.go275
-rw-r--r--vendor/github.com/go-playground/form/v4/encoder.go261
-rw-r--r--vendor/github.com/go-playground/form/v4/form.go49
-rw-r--r--vendor/github.com/go-playground/form/v4/form_decoder.go187
-rw-r--r--vendor/github.com/go-playground/form/v4/form_encoder.go157
-rw-r--r--vendor/github.com/go-playground/form/v4/logo.jpgbin20388 -> 0 bytes
-rw-r--r--vendor/github.com/go-playground/form/v4/util.go62
-rw-r--r--vendor/github.com/go-playground/locales/.gitignore24
-rw-r--r--vendor/github.com/go-playground/locales/.travis.yml26
-rw-r--r--vendor/github.com/go-playground/locales/LICENSE21
-rw-r--r--vendor/github.com/go-playground/locales/README.md170
-rw-r--r--vendor/github.com/go-playground/locales/currency/currency.go311
-rw-r--r--vendor/github.com/go-playground/locales/logo.pngbin37360 -> 0 bytes
-rw-r--r--vendor/github.com/go-playground/locales/rules.go293
-rw-r--r--vendor/github.com/go-playground/universal-translator/.gitignore25
-rw-r--r--vendor/github.com/go-playground/universal-translator/.travis.yml27
-rw-r--r--vendor/github.com/go-playground/universal-translator/LICENSE21
-rw-r--r--vendor/github.com/go-playground/universal-translator/Makefile18
-rw-r--r--vendor/github.com/go-playground/universal-translator/README.md87
-rw-r--r--vendor/github.com/go-playground/universal-translator/errors.go148
-rw-r--r--vendor/github.com/go-playground/universal-translator/import_export.go274
-rw-r--r--vendor/github.com/go-playground/universal-translator/logo.pngbin16598 -> 0 bytes
-rw-r--r--vendor/github.com/go-playground/universal-translator/translator.go420
-rw-r--r--vendor/github.com/go-playground/universal-translator/universal_translator.go113
-rw-r--r--vendor/github.com/go-playground/validator/v10/.gitignore32
-rw-r--r--vendor/github.com/go-playground/validator/v10/LICENSE22
-rw-r--r--vendor/github.com/go-playground/validator/v10/MAINTAINERS.md16
-rw-r--r--vendor/github.com/go-playground/validator/v10/Makefile18
-rw-r--r--vendor/github.com/go-playground/validator/v10/README.md379
-rw-r--r--vendor/github.com/go-playground/validator/v10/baked_in.go3046
-rw-r--r--vendor/github.com/go-playground/validator/v10/cache.go332
-rw-r--r--vendor/github.com/go-playground/validator/v10/country_codes.go1177
-rw-r--r--vendor/github.com/go-playground/validator/v10/currency_codes.go79
-rw-r--r--vendor/github.com/go-playground/validator/v10/doc.go1498
-rw-r--r--vendor/github.com/go-playground/validator/v10/errors.go276
-rw-r--r--vendor/github.com/go-playground/validator/v10/field_level.go120
-rw-r--r--vendor/github.com/go-playground/validator/v10/logo.pngbin13443 -> 0 bytes
-rw-r--r--vendor/github.com/go-playground/validator/v10/options.go26
-rw-r--r--vendor/github.com/go-playground/validator/v10/postcode_regexes.go179
-rw-r--r--vendor/github.com/go-playground/validator/v10/regexes.go163
-rw-r--r--vendor/github.com/go-playground/validator/v10/struct_level.go175
-rw-r--r--vendor/github.com/go-playground/validator/v10/translations.go11
-rw-r--r--vendor/github.com/go-playground/validator/v10/util.go312
-rw-r--r--vendor/github.com/go-playground/validator/v10/validator.go510
-rw-r--r--vendor/github.com/go-playground/validator/v10/validator_instance.go710
51 files changed, 0 insertions, 13320 deletions
diff --git a/vendor/github.com/go-playground/form/v4/.gitignore b/vendor/github.com/go-playground/form/v4/.gitignore
deleted file mode 100644
index aa19ee287..000000000
--- a/vendor/github.com/go-playground/form/v4/.gitignore
+++ /dev/null
@@ -1,28 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
-*.test
-*.prof
-old.txt
-new.txt
-
-/.idea \ No newline at end of file
diff --git a/vendor/github.com/go-playground/form/v4/LICENSE b/vendor/github.com/go-playground/form/v4/LICENSE
deleted file mode 100644
index 8d8aba15b..000000000
--- a/vendor/github.com/go-playground/form/v4/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2016 Go Playground
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/vendor/github.com/go-playground/form/v4/Makefile b/vendor/github.com/go-playground/form/v4/Makefile
deleted file mode 100644
index 0ff37bce2..000000000
--- a/vendor/github.com/go-playground/form/v4/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-all: lint test bench
-
-lint:
- golangci-lint run --timeout 5m
-
-test:
- go test -covermode=atomic -race ./...
-
-bench:
- go test -bench=. -benchmem ./...
-
-.PHONY: test lint bench
-.DEFAULT_GOAL := all
diff --git a/vendor/github.com/go-playground/form/v4/README.md b/vendor/github.com/go-playground/form/v4/README.md
deleted file mode 100644
index 2e76aeea4..000000000
--- a/vendor/github.com/go-playground/form/v4/README.md
+++ /dev/null
@@ -1,323 +0,0 @@
-Package form
-============
-<img align="right" src="https://raw.githubusercontent.com/go-playground/form/master/logo.jpg">![Project status](https://img.shields.io/badge/version-4.2.1-green.svg)
-[![Build Status](https://github.com/go-playground/form/actions/workflows/workflow.yml/badge.svg)](https://github.com/go-playground/form/actions/workflows/workflow.yml)
-[![Coverage Status](https://coveralls.io/repos/github/go-playground/form/badge.svg?branch=master)](https://coveralls.io/github/go-playground/form?branch=master)
-[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/form)](https://goreportcard.com/report/github.com/go-playground/form)
-[![GoDoc](https://godoc.org/github.com/go-playground/form?status.svg)](https://godoc.org/github.com/go-playground/form)
-![License](https://img.shields.io/dub/l/vibe-d.svg)
-[![Gitter](https://badges.gitter.im/go-playground/form.svg)](https://gitter.im/go-playground/form?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
-
-Package form Decodes url.Values into Go value(s) and Encodes Go value(s) into url.Values.
-
-It has the following features:
-
-- Supports map of almost all types.
-- Supports both Numbered and Normal arrays eg. `"Array[0]"` and just `"Array"` with multiple values passed.
-- Slice honours the specified index. eg. if "Slice[2]" is the only Slice value passed down, it will be put at index 2; if slice isn't big enough it will be expanded.
-- Array honours the specified index. eg. if "Array[2]" is the only Array value passed down, it will be put at index 2; if array isn't big enough a warning will be printed and value ignored.
-- Only creates objects as necessary eg. if no `array` or `map` values are passed down, the `array` and `map` are left as their default values in the struct.
-- Allows for Custom Type registration.
-- Handles time.Time using RFC3339 time format by default, but can easily be changed by registering a Custom Type, see below.
-- Handles Encoding & Decoding of almost all Go types eg. can Decode into struct, array, map, int... and Encode a struct, array, map, int...
-
-Common Questions
-
-- Does it support encoding.TextUnmarshaler? No because TextUnmarshaler only accepts []byte but posted values can have multiple values, so is not suitable.
-- Mixing `array/slice` with `array[idx]/slice[idx]`, in which order are they parsed? `array/slice` then `array[idx]/slice[idx]`
-
-Supported Types ( out of the box )
-----------
-
-* `string`
-* `bool`
-* `int`, `int8`, `int16`, `int32`, `int64`
-* `uint`, `uint8`, `uint16`, `uint32`, `uint64`
-* `float32`, `float64`
-* `struct` and `anonymous struct`
-* `interface{}`
-* `time.Time` - by default using RFC3339
-* a `pointer` to one of the above types
-* `slice`, `array`
-* `map`
-* `custom types` can override any of the above types
-* many other types may be supported inherently
-
-**NOTE**: `map`, `struct` and `slice` nesting are ad infinitum.
-
-Installation
-------------
-
-Use go get.
-
- go get github.com/go-playground/form
-
-Then import the form package into your own code.
-
- import "github.com/go-playground/form/v4"
-
-Usage
------
-
-- Use symbol `.` for separating fields/structs. (eg. `structfield.field`)
-- Use `[index or key]` for access to index of a slice/array or key for map. (eg. `arrayfield[0]`, `mapfield[keyvalue]`)
-
-```html
-<form method="POST">
- <input type="text" name="Name" value="joeybloggs"/>
- <input type="text" name="Age" value="3"/>
- <input type="text" name="Gender" value="Male"/>
- <input type="text" name="Address[0].Name" value="26 Here Blvd."/>
- <input type="text" name="Address[0].Phone" value="9(999)999-9999"/>
- <input type="text" name="Address[1].Name" value="26 There Blvd."/>
- <input type="text" name="Address[1].Phone" value="1(111)111-1111"/>
- <input type="text" name="active" value="true"/>
- <input type="text" name="MapExample[key]" value="value"/>
- <input type="text" name="NestedMap[key][key]" value="value"/>
- <input type="text" name="NestedArray[0][0]" value="value"/>
- <input type="submit"/>
-</form>
-```
-
-Examples
--------
-
-Decoding
-```go
-package main
-
-import (
- "fmt"
- "log"
- "net/url"
-
- "github.com/go-playground/form/v4"
-)
-
-// Address contains address information
-type Address struct {
- Name string
- Phone string
-}
-
-// User contains user information
-type User struct {
- Name string
- Age uint8
- Gender string
- Address []Address
- Active bool `form:"active"`
- MapExample map[string]string
- NestedMap map[string]map[string]string
- NestedArray [][]string
-}
-
-// use a single instance of Decoder, it caches struct info
-var decoder *form.Decoder
-
-func main() {
- decoder = form.NewDecoder()
-
- // this simulates the results of http.Request's ParseForm() function
- values := parseForm()
-
- var user User
-
- // must pass a pointer
- err := decoder.Decode(&user, values)
- if err != nil {
- log.Panic(err)
- }
-
- fmt.Printf("%#v\n", user)
-}
-
-// this simulates the results of http.Request's ParseForm() function
-func parseForm() url.Values {
- return url.Values{
- "Name": []string{"joeybloggs"},
- "Age": []string{"3"},
- "Gender": []string{"Male"},
- "Address[0].Name": []string{"26 Here Blvd."},
- "Address[0].Phone": []string{"9(999)999-9999"},
- "Address[1].Name": []string{"26 There Blvd."},
- "Address[1].Phone": []string{"1(111)111-1111"},
- "active": []string{"true"},
- "MapExample[key]": []string{"value"},
- "NestedMap[key][key]": []string{"value"},
- "NestedArray[0][0]": []string{"value"},
- }
-}
-```
-
-Encoding
-```go
-package main
-
-import (
- "fmt"
- "log"
-
- "github.com/go-playground/form/v4"
-)
-
-// Address contains address information
-type Address struct {
- Name string
- Phone string
-}
-
-// User contains user information
-type User struct {
- Name string
- Age uint8
- Gender string
- Address []Address
- Active bool `form:"active"`
- MapExample map[string]string
- NestedMap map[string]map[string]string
- NestedArray [][]string
-}
-
-// use a single instance of Encoder, it caches struct info
-var encoder *form.Encoder
-
-func main() {
- encoder = form.NewEncoder()
-
- user := User{
- Name: "joeybloggs",
- Age: 3,
- Gender: "Male",
- Address: []Address{
- {Name: "26 Here Blvd.", Phone: "9(999)999-9999"},
- {Name: "26 There Blvd.", Phone: "1(111)111-1111"},
- },
- Active: true,
- MapExample: map[string]string{"key": "value"},
- NestedMap: map[string]map[string]string{"key": {"key": "value"}},
- NestedArray: [][]string{{"value"}},
- }
-
- // must pass a pointer
- values, err := encoder.Encode(&user)
- if err != nil {
- log.Panic(err)
- }
-
- fmt.Printf("%#v\n", values)
-}
-```
-
-Registering Custom Types
---------------
-
-Decoder
-```go
-decoder.RegisterCustomTypeFunc(func(vals []string) (interface{}, error) {
- return time.Parse("2006-01-02", vals[0])
-}, time.Time{})
-```
-ADDITIONAL: if a struct type is registered, the function will only be called if a url.Value exists for
-the struct and not just the struct fields eg. url.Values{"User":"Name%3Djoeybloggs"} will call the
-custom type function with 'User' as the type, however url.Values{"User.Name":"joeybloggs"} will not.
-
-
-Encoder
-```go
-encoder.RegisterCustomTypeFunc(func(x interface{}) ([]string, error) {
- return []string{x.(time.Time).Format("2006-01-02")}, nil
-}, time.Time{})
-```
-
-Ignoring Fields
---------------
-you can tell form to ignore fields using `-` in the tag
-```go
-type MyStruct struct {
- Field string `form:"-"`
-}
-```
-
-Omitempty
---------------
-you can tell form to omit empty fields using `,omitempty` or `FieldName,omitempty` in the tag
-```go
-type MyStruct struct {
- Field string `form:",omitempty"`
- Field2 string `form:"CustomFieldName,omitempty"`
-}
-```
-
-Notes
-------
-To maximize compatibility with other systems the Encoder attempts
-to avoid using array indexes in url.Values if at all possible.
-
-eg.
-```go
-// A struct field of
-Field []string{"1", "2", "3"}
-
-// will be output a url.Value as
-"Field": []string{"1", "2", "3"}
-
-and not
-"Field[0]": []string{"1"}
-"Field[1]": []string{"2"}
-"Field[2]": []string{"3"}
-
-// however there are times where it is unavoidable, like with pointers
-i := int(1)
-Field []*string{nil, nil, &i}
-
-// to avoid index 1 and 2 must use index
-"Field[2]": []string{"1"}
-```
-
-Benchmarks
-------
-###### Run on M1 MacBook Pro using go version go1.20.6 darwin/amd64
-
-NOTE: the 1 allocation and B/op in the first 4 decodes is actually the struct allocating when passing it in, so primitives are actually zero allocation.
-
-```go
-go test -run=NONE -bench=. -benchmem=true ./...
-goos: darwin
-goarch: arm64
-pkg: github.com/go-playground/form/v4/benchmarks
-BenchmarkSimpleUserDecodeStruct-8 8704111 121.1 ns/op 64 B/op 1 allocs/op
-BenchmarkSimpleUserDecodeStructParallel-8 35916134 32.89 ns/op 64 B/op 1 allocs/op
-BenchmarkSimpleUserEncodeStruct-8 3746173 320.7 ns/op 485 B/op 10 allocs/op
-BenchmarkSimpleUserEncodeStructParallel-8 7293147 180.0 ns/op 485 B/op 10 allocs/op
-BenchmarkPrimitivesDecodeStructAllPrimitivesTypes-8 2993259 400.5 ns/op 96 B/op 1 allocs/op
-BenchmarkPrimitivesDecodeStructAllPrimitivesTypesParallel-8 13023300 97.70 ns/op 96 B/op 1 allocs/op
-BenchmarkPrimitivesEncodeStructAllPrimitivesTypes-8 643202 1767 ns/op 2977 B/op 35 allocs/op
-BenchmarkPrimitivesEncodeStructAllPrimitivesTypesParallel-8 1000000 1202 ns/op 2978 B/op 35 allocs/op
-BenchmarkComplexArrayDecodeStructAllTypes-8 172630 6822 ns/op 2008 B/op 121 allocs/op
-BenchmarkComplexArrayDecodeStructAllTypesParallel-8 719788 1735 ns/op 2009 B/op 121 allocs/op
-BenchmarkComplexArrayEncodeStructAllTypes-8 197052 5839 ns/op 7087 B/op 104 allocs/op
-BenchmarkComplexArrayEncodeStructAllTypesParallel-8 348039 3247 ns/op 7089 B/op 104 allocs/op
-BenchmarkComplexMapDecodeStructAllTypes-8 139246 8550 ns/op 5313 B/op 130 allocs/op
-BenchmarkComplexMapDecodeStructAllTypesParallel-8 409018 3143 ns/op 5317 B/op 130 allocs/op
-BenchmarkComplexMapEncodeStructAllTypes-8 208833 5515 ns/op 4257 B/op 103 allocs/op
-BenchmarkComplexMapEncodeStructAllTypesParallel-8 523833 2182 ns/op 4258 B/op 103 allocs/op
-BenchmarkDecodeNestedStruct-8 807690 1408 ns/op 344 B/op 14 allocs/op
-BenchmarkDecodeNestedStructParallel-8 3409441 359.6 ns/op 344 B/op 14 allocs/op
-BenchmarkEncodeNestedStruct-8 1488520 803.6 ns/op 653 B/op 16 allocs/op
-BenchmarkEncodeNestedStructParallel-8 3570204 346.6 ns/op 653 B/op 16 allocs/op
-```
-
-Competitor benchmarks can be found [here](https://github.com/go-playground/form/blob/master/benchmarks/benchmarks.md)
-
-Complimentary Software
-----------------------
-
-Here is a list of software that compliments using this library post decoding.
-
-* [Validator](https://github.com/go-playground/validator) - Go Struct and Field validation, including Cross Field, Cross Struct, Map, Slice and Array diving.
-* [mold](https://github.com/go-playground/mold) - Is a general library to help modify or set data within data structures and other objects.
-
-License
-------
-Distributed under MIT License, please see license file in code for more details.
diff --git a/vendor/github.com/go-playground/form/v4/cache.go b/vendor/github.com/go-playground/form/v4/cache.go
deleted file mode 100644
index 47e5fce96..000000000
--- a/vendor/github.com/go-playground/form/v4/cache.go
+++ /dev/null
@@ -1,133 +0,0 @@
-package form
-
-import (
- "reflect"
- "sort"
- "strings"
- "sync"
- "sync/atomic"
-)
-
-type cacheFields []cachedField
-
-func (s cacheFields) Len() int {
- return len(s)
-}
-
-func (s cacheFields) Less(i, j int) bool {
- return !s[i].isAnonymous
-}
-
-func (s cacheFields) Swap(i, j int) {
- s[i], s[j] = s[j], s[i]
-}
-
-type cachedField struct {
- idx int
- name string
- isAnonymous bool
- isOmitEmpty bool
-}
-
-type cachedStruct struct {
- fields cacheFields
-}
-
-type structCacheMap struct {
- m atomic.Value // map[reflect.Type]*cachedStruct
- lock sync.Mutex
- tagFn TagNameFunc
-}
-
-// TagNameFunc allows for adding of a custom tag name parser
-type TagNameFunc func(field reflect.StructField) string
-
-func newStructCacheMap() *structCacheMap {
-
- sc := new(structCacheMap)
- sc.m.Store(make(map[reflect.Type]*cachedStruct))
-
- return sc
-}
-
-func (s *structCacheMap) Get(key reflect.Type) (value *cachedStruct, ok bool) {
- value, ok = s.m.Load().(map[reflect.Type]*cachedStruct)[key]
- return
-}
-
-func (s *structCacheMap) Set(key reflect.Type, value *cachedStruct) {
-
- m := s.m.Load().(map[reflect.Type]*cachedStruct)
-
- nm := make(map[reflect.Type]*cachedStruct, len(m)+1)
- for k, v := range m {
- nm[k] = v
- }
- nm[key] = value
- s.m.Store(nm)
-}
-
-func (s *structCacheMap) parseStruct(mode Mode, current reflect.Value, key reflect.Type, tagName string) *cachedStruct {
-
- s.lock.Lock()
-
- // could have been multiple trying to access, but once first is done this ensures struct
- // isn't parsed again.
- cs, ok := s.Get(key)
- if ok {
- s.lock.Unlock()
- return cs
- }
-
- typ := current.Type()
- cs = &cachedStruct{fields: make([]cachedField, 0, 4)} // init 4, betting most structs decoding into have at aleast 4 fields.
-
- numFields := current.NumField()
-
- var fld reflect.StructField
- var name string
- var idx int
- var isOmitEmpty bool
-
- for i := 0; i < numFields; i++ {
- isOmitEmpty = false
- fld = typ.Field(i)
-
- if fld.PkgPath != blank && !fld.Anonymous {
- continue
- }
-
- if s.tagFn != nil {
- name = s.tagFn(fld)
- } else {
- name = fld.Tag.Get(tagName)
- }
-
- if name == ignore {
- continue
- }
-
- if mode == ModeExplicit && len(name) == 0 {
- continue
- }
-
- // check for omitempty
- if idx = strings.LastIndexByte(name, ','); idx != -1 {
- isOmitEmpty = name[idx+1:] == "omitempty"
- name = name[:idx]
- }
-
- if len(name) == 0 {
- name = fld.Name
- }
-
- cs.fields = append(cs.fields, cachedField{idx: i, name: name, isAnonymous: fld.Anonymous, isOmitEmpty: isOmitEmpty})
- }
-
- sort.Sort(cs.fields)
- s.Set(typ, cs)
-
- s.lock.Unlock()
-
- return cs
-}
diff --git a/vendor/github.com/go-playground/form/v4/decoder.go b/vendor/github.com/go-playground/form/v4/decoder.go
deleted file mode 100644
index e21242279..000000000
--- a/vendor/github.com/go-playground/form/v4/decoder.go
+++ /dev/null
@@ -1,752 +0,0 @@
-package form
-
-import (
- "fmt"
- "log"
- "net/url"
- "reflect"
- "strconv"
- "time"
-)
-
-const (
- errArraySize = "Array size of '%d' is larger than the maximum currently set on the decoder of '%d'. To increase this limit please see, SetMaxArraySize(size uint)"
- errMissingStartBracket = "Invalid formatting for key '%s' missing '[' bracket"
- errMissingEndBracket = "Invalid formatting for key '%s' missing ']' bracket"
-)
-
-type decoder struct {
- d *Decoder
- errs DecodeErrors
- dm dataMap
- values url.Values
- maxKeyLen int
- namespace []byte
-}
-
-func (d *decoder) setError(namespace []byte, err error) {
- if d.errs == nil {
- d.errs = make(DecodeErrors)
- }
- d.errs[string(namespace)] = err
-}
-
-func (d *decoder) findAlias(ns string) *recursiveData {
- for i := 0; i < len(d.dm); i++ {
- if d.dm[i].alias == ns {
- return d.dm[i]
- }
- }
- return nil
-}
-
-func (d *decoder) parseMapData() {
- // already parsed
- if len(d.dm) > 0 {
- return
- }
-
- d.maxKeyLen = 0
- d.dm = d.dm[0:0]
-
- var i int
- var idx int
- var l int
- var insideBracket bool
- var rd *recursiveData
- var isNum bool
-
- for k := range d.values {
-
- if len(k) > d.maxKeyLen {
- d.maxKeyLen = len(k)
- }
-
- for i = 0; i < len(k); i++ {
-
- switch k[i] {
- case '[':
- idx = i
- insideBracket = true
- isNum = true
- case ']':
-
- if !insideBracket {
- log.Panicf(errMissingStartBracket, k)
- }
-
- if rd = d.findAlias(k[:idx]); rd == nil {
-
- l = len(d.dm) + 1
-
- if l > cap(d.dm) {
- dm := make(dataMap, l)
- copy(dm, d.dm)
- rd = new(recursiveData)
- dm[len(d.dm)] = rd
- d.dm = dm
- } else {
- l = len(d.dm)
- d.dm = d.dm[:l+1]
- rd = d.dm[l]
- rd.sliceLen = 0
- rd.keys = rd.keys[0:0]
- }
-
- rd.alias = k[:idx]
- }
-
- // is map + key
- ke := key{
- ivalue: -1,
- value: k[idx+1 : i],
- searchValue: k[idx : i+1],
- }
-
- // is key is number, most likely array key, keep track of just in case an array/slice.
- if isNum {
-
- // no need to check for error, it will always pass
- // as we have done the checking to ensure
- // the value is a number ahead of time.
- var err error
- ke.ivalue, err = strconv.Atoi(ke.value)
- if err != nil {
- ke.ivalue = -1
- }
-
- if ke.ivalue > rd.sliceLen {
- rd.sliceLen = ke.ivalue
-
- }
- }
-
- rd.keys = append(rd.keys, ke)
-
- insideBracket = false
- default:
- // checking if not a number, 0-9 is 48-57 in byte, see for yourself fmt.Println('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
- if insideBracket && (k[i] > 57 || k[i] < 48) {
- isNum = false
- }
- }
- }
-
- // if still inside bracket, that means no ending bracket was ever specified
- if insideBracket {
- log.Panicf(errMissingEndBracket, k)
- }
- }
-}
-
-func (d *decoder) traverseStruct(v reflect.Value, typ reflect.Type, namespace []byte) (set bool) {
-
- l := len(namespace)
- first := l == 0
-
- // anonymous structs will still work for caching as the whole definition is stored
- // including tags
- s, ok := d.d.structCache.Get(typ)
- if !ok {
- s = d.d.structCache.parseStruct(d.d.mode, v, typ, d.d.tagName)
- }
-
- for _, f := range s.fields {
- namespace = namespace[:l]
-
- if f.isAnonymous {
- if d.setFieldByType(v.Field(f.idx), namespace, 0) {
- set = true
- }
- }
-
- if first {
- namespace = append(namespace, f.name...)
- } else {
- namespace = append(namespace, d.d.namespacePrefix...)
- namespace = append(namespace, f.name...)
- namespace = append(namespace, d.d.namespaceSuffix...)
- }
-
- if d.setFieldByType(v.Field(f.idx), namespace, 0) {
- set = true
- }
- }
-
- return
-}
-
-func (d *decoder) setFieldByType(current reflect.Value, namespace []byte, idx int) (set bool) {
-
- var err error
- v, kind := ExtractType(current)
-
- arr, ok := d.values[string(namespace)]
-
- if d.d.customTypeFuncs != nil {
-
- if ok {
- if cf, ok := d.d.customTypeFuncs[v.Type()]; ok {
- val, err := cf(arr[idx:])
- if err != nil {
- d.setError(namespace, err)
- return
- }
-
- v.Set(reflect.ValueOf(val))
- set = true
- return
- }
- }
- }
- switch kind {
- case reflect.Interface:
- if !ok || idx == len(arr) {
- return
- }
- v.Set(reflect.ValueOf(arr[idx]))
- set = true
-
- case reflect.Ptr:
- newVal := reflect.New(v.Type().Elem())
- if set = d.setFieldByType(newVal.Elem(), namespace, idx); set {
- v.Set(newVal)
- }
-
- case reflect.String:
- if !ok || idx == len(arr) {
- return
- }
- v.SetString(arr[idx])
- set = true
-
- case reflect.Uint, reflect.Uint64:
- if !ok || idx == len(arr) || len(arr[idx]) == 0 {
- return
- }
- var u64 uint64
- if u64, err = strconv.ParseUint(arr[idx], 10, 64); err != nil {
- d.setError(namespace, fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace)))
- return
- }
- v.SetUint(u64)
- set = true
-
- case reflect.Uint8:
- if !ok || idx == len(arr) || len(arr[idx]) == 0 {
- return
- }
- var u64 uint64
- if u64, err = strconv.ParseUint(arr[idx], 10, 8); err != nil {
- d.setError(namespace, fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace)))
- return
- }
- v.SetUint(u64)
- set = true
-
- case reflect.Uint16:
- if !ok || idx == len(arr) || len(arr[idx]) == 0 {
- return
- }
- var u64 uint64
- if u64, err = strconv.ParseUint(arr[idx], 10, 16); err != nil {
- d.setError(namespace, fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace)))
- return
- }
- v.SetUint(u64)
- set = true
-
- case reflect.Uint32:
- if !ok || idx == len(arr) || len(arr[idx]) == 0 {
- return
- }
- var u64 uint64
- if u64, err = strconv.ParseUint(arr[idx], 10, 32); err != nil {
- d.setError(namespace, fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace)))
- return
- }
- v.SetUint(u64)
- set = true
-
- case reflect.Int, reflect.Int64:
- if !ok || idx == len(arr) || len(arr[idx]) == 0 {
- return
- }
- var i64 int64
- if i64, err = strconv.ParseInt(arr[idx], 10, 64); err != nil {
- d.setError(namespace, fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace)))
- return
- }
- v.SetInt(i64)
- set = true
-
- case reflect.Int8:
- if !ok || idx == len(arr) || len(arr[idx]) == 0 {
- return
- }
- var i64 int64
- if i64, err = strconv.ParseInt(arr[idx], 10, 8); err != nil {
- d.setError(namespace, fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace)))
- return
- }
- v.SetInt(i64)
- set = true
-
- case reflect.Int16:
- if !ok || idx == len(arr) || len(arr[idx]) == 0 {
- return
- }
- var i64 int64
- if i64, err = strconv.ParseInt(arr[idx], 10, 16); err != nil {
- d.setError(namespace, fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace)))
- return
- }
- v.SetInt(i64)
- set = true
-
- case reflect.Int32:
- if !ok || idx == len(arr) || len(arr[idx]) == 0 {
- return
- }
- var i64 int64
- if i64, err = strconv.ParseInt(arr[idx], 10, 32); err != nil {
- d.setError(namespace, fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace)))
- return
- }
- v.SetInt(i64)
- set = true
-
- case reflect.Float32:
- if !ok || idx == len(arr) || len(arr[idx]) == 0 {
- return
- }
- var f float64
- if f, err = strconv.ParseFloat(arr[idx], 32); err != nil {
- d.setError(namespace, fmt.Errorf("Invalid Float Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace)))
- return
- }
- v.SetFloat(f)
- set = true
-
- case reflect.Float64:
- if !ok || idx == len(arr) || len(arr[idx]) == 0 {
- return
- }
- var f float64
- if f, err = strconv.ParseFloat(arr[idx], 64); err != nil {
- d.setError(namespace, fmt.Errorf("Invalid Float Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace)))
- return
- }
- v.SetFloat(f)
- set = true
-
- case reflect.Bool:
- if !ok || idx == len(arr) {
- return
- }
- var b bool
- if b, err = parseBool(arr[idx]); err != nil {
- d.setError(namespace, fmt.Errorf("Invalid Boolean Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace)))
- return
- }
- v.SetBool(b)
- set = true
-
- case reflect.Slice:
- d.parseMapData()
- // slice elements could be mixed eg. number and non-numbers Value[0]=[]string{"10"} and Value=[]string{"10","20"}
-
- if ok && len(arr) > 0 {
- var varr reflect.Value
-
- var ol int
- l := len(arr)
-
- if v.IsNil() {
- varr = reflect.MakeSlice(v.Type(), len(arr), len(arr))
- } else {
-
- ol = v.Len()
- l += ol
-
- if v.Cap() <= l {
- varr = reflect.MakeSlice(v.Type(), l, l)
- } else {
- // preserve predefined capacity, possibly for reuse after decoding
- varr = reflect.MakeSlice(v.Type(), l, v.Cap())
- }
- reflect.Copy(varr, v)
- }
-
- for i := ol; i < l; i++ {
- newVal := reflect.New(v.Type().Elem()).Elem()
-
- if d.setFieldByType(newVal, namespace, i-ol) {
- set = true
- varr.Index(i).Set(newVal)
- }
- }
-
- v.Set(varr)
- }
-
- // maybe it's an numbered array i.e. Phone[0].Number
- if rd := d.findAlias(string(namespace)); rd != nil {
-
- var varr reflect.Value
- var kv key
-
- sl := rd.sliceLen + 1
-
- // checking below for maxArraySize, but if array exists and already
- // has sufficient capacity allocated then we do not check as the code
- // obviously allows a capacity greater than the maxArraySize.
-
- if v.IsNil() {
-
- if sl > d.d.maxArraySize {
- d.setError(namespace, fmt.Errorf(errArraySize, sl, d.d.maxArraySize))
- return
- }
-
- varr = reflect.MakeSlice(v.Type(), sl, sl)
-
- } else if v.Len() < sl {
-
- if v.Cap() <= sl {
-
- if sl > d.d.maxArraySize {
- d.setError(namespace, fmt.Errorf(errArraySize, sl, d.d.maxArraySize))
- return
- }
-
- varr = reflect.MakeSlice(v.Type(), sl, sl)
- } else {
- varr = reflect.MakeSlice(v.Type(), sl, v.Cap())
- }
-
- reflect.Copy(varr, v)
-
- } else {
- varr = v
- }
-
- for i := 0; i < len(rd.keys); i++ {
-
- kv = rd.keys[i]
- newVal := reflect.New(varr.Type().Elem()).Elem()
-
- if kv.ivalue == -1 {
- d.setError(namespace, fmt.Errorf("invalid slice index '%s'", kv.value))
- continue
- }
-
- if d.setFieldByType(newVal, append(namespace, kv.searchValue...), 0) {
- set = true
- varr.Index(kv.ivalue).Set(newVal)
- }
- }
-
- if !set {
- return
- }
-
- v.Set(varr)
- }
-
- case reflect.Array:
- d.parseMapData()
-
- // array elements could be mixed eg. number and non-numbers Value[0]=[]string{"10"} and Value=[]string{"10","20"}
-
- if ok && len(arr) > 0 {
- var varr reflect.Value
- l := len(arr)
- overCapacity := v.Len() < l
- if overCapacity {
- // more values than array capacity, ignore values over capacity as it's possible some would just want
- // to grab the first x number of elements; in the future strict mode logic should return an error
- fmt.Println("warning number of post form array values is larger than array capacity, ignoring overflow values")
- }
- varr = reflect.Indirect(reflect.New(reflect.ArrayOf(v.Len(), v.Type().Elem())))
- reflect.Copy(varr, v)
-
- if v.Len() < len(arr) {
- l = v.Len()
- }
- for i := 0; i < l; i++ {
- newVal := reflect.New(v.Type().Elem()).Elem()
-
- if d.setFieldByType(newVal, namespace, i) {
- set = true
- varr.Index(i).Set(newVal)
- }
- }
- v.Set(varr)
- }
-
- // maybe it's an numbered array i.e. Phone[0].Number
- if rd := d.findAlias(string(namespace)); rd != nil {
- var varr reflect.Value
- var kv key
-
- overCapacity := rd.sliceLen >= v.Len()
- if overCapacity {
- // more values than array capacity, ignore values over capacity as it's possible some would just want
- // to grab the first x number of elements; in the future strict mode logic should return an error
- fmt.Println("warning number of post form array values is larger than array capacity, ignoring overflow values")
- }
- varr = reflect.Indirect(reflect.New(reflect.ArrayOf(v.Len(), v.Type().Elem())))
- reflect.Copy(varr, v)
-
- for i := 0; i < len(rd.keys); i++ {
- kv = rd.keys[i]
- if kv.ivalue >= v.Len() {
- continue
- }
- newVal := reflect.New(varr.Type().Elem()).Elem()
-
- if kv.ivalue == -1 {
- d.setError(namespace, fmt.Errorf("invalid array index '%s'", kv.value))
- continue
- }
-
- if d.setFieldByType(newVal, append(namespace, kv.searchValue...), 0) {
- set = true
- varr.Index(kv.ivalue).Set(newVal)
- }
- }
-
- if !set {
- return
- }
- v.Set(varr)
- }
-
- case reflect.Map:
- var rd *recursiveData
-
- d.parseMapData()
-
- // no natural map support so skip directly to dm lookup
- if rd = d.findAlias(string(namespace)); rd == nil {
- return
- }
-
- var existing bool
- var kv key
- var mp reflect.Value
- var mk reflect.Value
-
- typ := v.Type()
-
- if v.IsNil() {
- mp = reflect.MakeMap(typ)
- } else {
- existing = true
- mp = v
- }
-
- for i := 0; i < len(rd.keys); i++ {
- newVal := reflect.New(typ.Elem()).Elem()
- mk = reflect.New(typ.Key()).Elem()
- kv = rd.keys[i]
-
- if err := d.getMapKey(kv.value, mk, namespace); err != nil {
- d.setError(namespace, err)
- continue
- }
-
- if d.setFieldByType(newVal, append(namespace, kv.searchValue...), 0) {
- set = true
- mp.SetMapIndex(mk, newVal)
- }
- }
-
- if !set || existing {
- return
- }
-
- v.Set(mp)
-
- case reflect.Struct:
- typ := v.Type()
-
- // if we get here then no custom time function declared so use RFC3339 by default
- if typ == timeType {
-
- if !ok || len(arr[idx]) == 0 {
- return
- }
-
- t, err := time.Parse(time.RFC3339, arr[idx])
- if err != nil {
- d.setError(namespace, err)
- }
-
- v.Set(reflect.ValueOf(t))
- set = true
- return
- }
-
- d.parseMapData()
-
- // we must be recursing infinitly...but that's ok we caught it on the very first overun.
- if len(namespace) > d.maxKeyLen {
- return
- }
-
- set = d.traverseStruct(v, typ, namespace)
- }
- return
-}
-
-func (d *decoder) getMapKey(key string, current reflect.Value, namespace []byte) (err error) {
-
- v, kind := ExtractType(current)
-
- if d.d.customTypeFuncs != nil {
- if cf, ok := d.d.customTypeFuncs[v.Type()]; ok {
-
- val, er := cf([]string{key})
- if er != nil {
- err = er
- return
- }
-
- v.Set(reflect.ValueOf(val))
- return
- }
- }
-
- switch kind {
- case reflect.Interface:
- // If interface would have been set on the struct before decoding,
- // say to a struct value we would not get here but kind would be struct.
- v.Set(reflect.ValueOf(key))
- return
- case reflect.Ptr:
- newVal := reflect.New(v.Type().Elem())
- if err = d.getMapKey(key, newVal.Elem(), namespace); err == nil {
- v.Set(newVal)
- }
-
- case reflect.String:
- v.SetString(key)
-
- case reflect.Uint, reflect.Uint64:
-
- u64, e := strconv.ParseUint(key, 10, 64)
- if e != nil {
- err = fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace))
- return
- }
-
- v.SetUint(u64)
-
- case reflect.Uint8:
-
- u64, e := strconv.ParseUint(key, 10, 8)
- if e != nil {
- err = fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace))
- return
- }
-
- v.SetUint(u64)
-
- case reflect.Uint16:
-
- u64, e := strconv.ParseUint(key, 10, 16)
- if e != nil {
- err = fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace))
- return
- }
-
- v.SetUint(u64)
-
- case reflect.Uint32:
-
- u64, e := strconv.ParseUint(key, 10, 32)
- if e != nil {
- err = fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace))
- return
- }
-
- v.SetUint(u64)
-
- case reflect.Int, reflect.Int64:
-
- i64, e := strconv.ParseInt(key, 10, 64)
- if e != nil {
- err = fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace))
- return
- }
-
- v.SetInt(i64)
-
- case reflect.Int8:
-
- i64, e := strconv.ParseInt(key, 10, 8)
- if e != nil {
- err = fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace))
- return
- }
-
- v.SetInt(i64)
-
- case reflect.Int16:
-
- i64, e := strconv.ParseInt(key, 10, 16)
- if e != nil {
- err = fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace))
- return
- }
-
- v.SetInt(i64)
-
- case reflect.Int32:
-
- i64, e := strconv.ParseInt(key, 10, 32)
- if e != nil {
- err = fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace))
- return
- }
-
- v.SetInt(i64)
-
- case reflect.Float32:
-
- f, e := strconv.ParseFloat(key, 32)
- if e != nil {
- err = fmt.Errorf("Invalid Float Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace))
- return
- }
-
- v.SetFloat(f)
-
- case reflect.Float64:
-
- f, e := strconv.ParseFloat(key, 64)
- if e != nil {
- err = fmt.Errorf("Invalid Float Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace))
- return
- }
-
- v.SetFloat(f)
-
- case reflect.Bool:
-
- b, e := parseBool(key)
- if e != nil {
- err = fmt.Errorf("Invalid Boolean Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace))
- return
- }
-
- v.SetBool(b)
-
- default:
- err = fmt.Errorf("Unsupported Map Key '%s', Type '%v' Namespace '%s'", key, v.Type(), string(namespace))
- }
-
- return
-}
diff --git a/vendor/github.com/go-playground/form/v4/doc.go b/vendor/github.com/go-playground/form/v4/doc.go
deleted file mode 100644
index f553dac2c..000000000
--- a/vendor/github.com/go-playground/form/v4/doc.go
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
-Package form Decodes url.Values into Go value(s) and Encodes Go value(s) into url.Values.
-
-
-It has the following features:
-
- - Primitives types cause zero allocations.
- - Supports map of almost all types.
- - Supports both Numbered and Normal arrays eg. "Array[0]" and just "Array"
- with multiple values passed.
- - Slice honours the specified index. eg. if "Slice[2]" is the only Slice
- value passed down, it will be put at index 2; if slice isn't big enough
- it will be expanded.
- - Array honours the specified index. eg. if "Array[2]" is the only Array
- value passed down, it will be put at index 2; if array isn't big enough
- a warning will be printed and value ignored.
- - Only creates objects as necessary eg. if no `array` or `map` values are
- passed down, the `array` and `map` are left as their default values in
- the struct.
- - Allows for Custom Type registration.
- - Handles time.Time using RFC3339 time format by default,
- but can easily be changed by registering a Custom Type, see below.
- - Handles Encoding & Decoding of almost all Go types eg. can Decode into
- struct, array, map, int... and Encode a struct, array, map, int...
-
-Common Questions
-
-Questions
-
- Does it support encoding.TextUnmarshaler?
- No because TextUnmarshaler only accepts []byte but posted values can have
- multiple values, so is not suitable.
-
- Mixing array/slice with array[idx]/slice[idx], in which order are they parsed?
- array/slice then array[idx]/slice[idx]
-
-Supported Types
-
-out of the box supported types
-
- - string
- - bool
- - int, int8, int16, int32, int64
- - uint, uint8, uint16, uint32, uint64
- - float32, float64
- - struct and anonymous struct
- - interface{}
- - time.Time` - by default using RFC3339
- - a `pointer` to one of the above types
- - slice, array
- - map
- - `custom types` can override any of the above types
- - many other types may be supported inherently (eg. bson.ObjectId is
- type ObjectId string, which will get populated by the string type
-
- **NOTE**: map, struct and slice nesting are ad infinitum.
-
-Usage
-
-symbols
-
- - Use symbol `.` for separating fields/structs. (eg. `structfield.field`)
- - Use `[index or key]` for access to index of a slice/array or key for map.
- (eg. `arrayfield[0]`, `mapfield[keyvalue]`)
-
-html
-
- <form method="POST">
- <input type="text" name="Name" value="joeybloggs"/>
- <input type="text" name="Age" value="3"/>
- <input type="text" name="Gender" value="Male"/>
- <input type="text" name="Address[0].Name" value="26 Here Blvd."/>
- <input type="text" name="Address[0].Phone" value="9(999)999-9999"/>
- <input type="text" name="Address[1].Name" value="26 There Blvd."/>
- <input type="text" name="Address[1].Phone" value="1(111)111-1111"/>
- <input type="text" name="active" value="true"/>
- <input type="text" name="MapExample[key]" value="value"/>
- <input type="text" name="NestedMap[key][key]" value="value"/>
- <input type="text" name="NestedArray[0][0]" value="value"/>
- <input type="submit"/>
- </form>
-
-Example
-
-example decoding the above HTML
-
- package main
-
- import (
- "fmt"
- "log"
- "net/url"
-
- "github.com/go-playground/form/v4"
- )
-
- // Address contains address information
- type Address struct {
- Name string
- Phone string
- }
-
- // User contains user information
- type User struct {
- Name string
- Age uint8
- Gender string
- Address []Address
- Active bool `form:"active"`
- MapExample map[string]string
- NestedMap map[string]map[string]string
- NestedArray [][]string
- }
-
- // use a single instance of Decoder, it caches struct info
- var decoder *form.Decoder
-
- func main() {
- decoder = form.NewDecoder()
-
- // this simulates the results of http.Request's ParseForm() function
- values := parseForm()
-
- var user User
-
- // must pass a pointer
- err := decoder.Decode(&user, values)
- if err != nil {
- log.Panic(err)
- }
-
- fmt.Printf("%#v\n", user)
- }
-
- // this simulates the results of http.Request's ParseForm() function
- func parseForm() url.Values {
- return url.Values{
- "Name": []string{"joeybloggs"},
- "Age": []string{"3"},
- "Gender": []string{"Male"},
- "Address[0].Name": []string{"26 Here Blvd."},
- "Address[0].Phone": []string{"9(999)999-9999"},
- "Address[1].Name": []string{"26 There Blvd."},
- "Address[1].Phone": []string{"1(111)111-1111"},
- "active": []string{"true"},
- "MapExample[key]": []string{"value"},
- "NestedMap[key][key]": []string{"value"},
- "NestedArray[0][0]": []string{"value"},
- }
- }
-
-example encoding
-
- package main
-
- import (
- "fmt"
- "log"
-
- "github.com/go-playground/form/v4"
- )
-
- // Address contains address information
- type Address struct {
- Name string
- Phone string
- }
-
- // User contains user information
- type User struct {
- Name string
- Age uint8
- Gender string
- Address []Address
- Active bool `form:"active"`
- MapExample map[string]string
- NestedMap map[string]map[string]string
- NestedArray [][]string
- }
-
- // use a single instance of Encoder, it caches struct info
- var encoder *form.Encoder
-
- func main() {
- encoder = form.NewEncoder()
-
- user := User{
- Name: "joeybloggs",
- Age: 3,
- Gender: "Male",
- Address: []Address{
- {Name: "26 Here Blvd.", Phone: "9(999)999-9999"},
- {Name: "26 There Blvd.", Phone: "1(111)111-1111"},
- },
- Active: true,
- MapExample: map[string]string{"key": "value"},
- NestedMap: map[string]map[string]string{"key": {"key": "value"}},
- NestedArray: [][]string{{"value"}},
- }
-
- // must pass a pointer
- values, err := encoder.Encode(&user)
- if err != nil {
- log.Panic(err)
- }
-
- fmt.Printf("%#v\n", values)
- }
-
-
-Registering Custom Types
-
-Decoder
-
- decoder.RegisterCustomTypeFunc(func(vals []string) (interface{}, error) {
- return time.Parse("2006-01-02", vals[0])
- }, time.Time{})
-
- ADDITIONAL: if a struct type is registered, the function will only be called
- if a url.Value exists for the struct and not just the struct fields
- eg. url.Values{"User":"Name%3Djoeybloggs"} will call the custom type function
- with 'User' as the type, however url.Values{"User.Name":"joeybloggs"} will not.
-
-Encoder
-
- encoder.RegisterCustomTypeFunc(func(x interface{}) ([]string, error) {
- return []string{x.(time.Time).Format("2006-01-02")}, nil
- }, time.Time{})
-
-
-Ignoring Fields
-
-you can tell form to ignore fields using `-` in the tag
-
- type MyStruct struct {
- Field string `form:"-"`
- }
-
-Omitempty
-
-you can tell form to omit empty fields using `,omitempty` or `FieldName,omitempty` in the tag
-
- type MyStruct struct {
- Field string `form:",omitempty"`
- Field2 string `form:"CustomFieldName,omitempty"`
- }
-
-
-Notes
-
-To maximize compatibility with other systems the Encoder attempts
-to avoid using array indexes in url.Values if at all possible.
-
- eg.
-
- // A struct field of
- Field []string{"1", "2", "3"}
-
- // will be output a url.Value as
- "Field": []string{"1", "2", "3"}
-
- and not
- "Field[0]": []string{"1"}
- "Field[1]": []string{"2"}
- "Field[2]": []string{"3"}
-
- // however there are times where it is unavoidable, like with pointers
- i := int(1)
- Field []*string{nil, nil, &i}
-
- // to avoid index 1 and 2 must use index
- "Field[2]": []string{"1"}
-
-*/
-package form
diff --git a/vendor/github.com/go-playground/form/v4/encoder.go b/vendor/github.com/go-playground/form/v4/encoder.go
deleted file mode 100644
index eea0bd9f3..000000000
--- a/vendor/github.com/go-playground/form/v4/encoder.go
+++ /dev/null
@@ -1,261 +0,0 @@
-package form
-
-import (
- "fmt"
- "net/url"
- "reflect"
- "strconv"
- "time"
-)
-
-type encoder struct {
- e *Encoder
- errs EncodeErrors
- values url.Values
- namespace []byte
-}
-
-func (e *encoder) setError(namespace []byte, err error) {
- if e.errs == nil {
- e.errs = make(EncodeErrors)
- }
-
- e.errs[string(namespace)] = err
-}
-
-func (e *encoder) setVal(namespace []byte, idx int, vals ...string) {
-
- arr, ok := e.values[string(namespace)]
- if ok {
- arr = append(arr, vals...)
- } else {
- arr = vals
- }
-
- e.values[string(namespace)] = arr
-}
-
-func (e *encoder) traverseStruct(v reflect.Value, namespace []byte, idx int) {
-
- typ := v.Type()
- l := len(namespace)
- first := l == 0
-
- // anonymous structs will still work for caching as the whole definition is stored
- // including tags
- s, ok := e.e.structCache.Get(typ)
- if !ok {
- s = e.e.structCache.parseStruct(e.e.mode, v, typ, e.e.tagName)
- }
-
- for _, f := range s.fields {
- namespace = namespace[:l]
-
- if f.isAnonymous && e.e.embedAnonymous {
- e.setFieldByType(v.Field(f.idx), namespace, idx, f.isOmitEmpty)
- continue
- }
-
- if first {
- namespace = append(namespace, f.name...)
- } else {
- namespace = append(namespace, e.e.namespacePrefix...)
- namespace = append(namespace, f.name...)
- namespace = append(namespace, e.e.namespaceSuffix...)
- }
-
- e.setFieldByType(v.Field(f.idx), namespace, idx, f.isOmitEmpty)
- }
-}
-
-func (e *encoder) setFieldByType(current reflect.Value, namespace []byte, idx int, isOmitEmpty bool) {
-
- if idx > -1 && current.Kind() == reflect.Ptr {
- namespace = append(namespace, '[')
- namespace = strconv.AppendInt(namespace, int64(idx), 10)
- namespace = append(namespace, ']')
- idx = -2
- }
-
- if isOmitEmpty && !hasValue(current) {
- return
- }
- v, kind := ExtractType(current)
-
- if e.e.customTypeFuncs != nil {
-
- if cf, ok := e.e.customTypeFuncs[v.Type()]; ok {
-
- arr, err := cf(v.Interface())
- if err != nil {
- e.setError(namespace, err)
- return
- }
-
- if idx > -1 {
- namespace = append(namespace, '[')
- namespace = strconv.AppendInt(namespace, int64(idx), 10)
- namespace = append(namespace, ']')
- }
-
- e.setVal(namespace, idx, arr...)
- return
- }
- }
-
- switch kind {
- case reflect.Ptr, reflect.Interface, reflect.Invalid:
- return
-
- case reflect.String:
-
- e.setVal(namespace, idx, v.String())
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
-
- e.setVal(namespace, idx, strconv.FormatUint(v.Uint(), 10))
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-
- e.setVal(namespace, idx, strconv.FormatInt(v.Int(), 10))
-
- case reflect.Float32:
-
- e.setVal(namespace, idx, strconv.FormatFloat(v.Float(), 'f', -1, 32))
-
- case reflect.Float64:
-
- e.setVal(namespace, idx, strconv.FormatFloat(v.Float(), 'f', -1, 64))
-
- case reflect.Bool:
-
- e.setVal(namespace, idx, strconv.FormatBool(v.Bool()))
-
- case reflect.Slice, reflect.Array:
-
- if idx == -1 {
-
- for i := 0; i < v.Len(); i++ {
- e.setFieldByType(v.Index(i), namespace, i, false)
- }
-
- return
- }
-
- if idx > -1 {
- namespace = append(namespace, '[')
- namespace = strconv.AppendInt(namespace, int64(idx), 10)
- namespace = append(namespace, ']')
- }
-
- namespace = append(namespace, '[')
- l := len(namespace)
-
- for i := 0; i < v.Len(); i++ {
- namespace = namespace[:l]
- namespace = strconv.AppendInt(namespace, int64(i), 10)
- namespace = append(namespace, ']')
- e.setFieldByType(v.Index(i), namespace, -2, false)
- }
-
- case reflect.Map:
-
- if idx > -1 {
- namespace = append(namespace, '[')
- namespace = strconv.AppendInt(namespace, int64(idx), 10)
- namespace = append(namespace, ']')
- }
-
- var valid bool
- var s string
- l := len(namespace)
-
- for _, key := range v.MapKeys() {
-
- namespace = namespace[:l]
-
- if s, valid = e.getMapKey(key, namespace); !valid {
- continue
- }
-
- namespace = append(namespace, '[')
- namespace = append(namespace, s...)
- namespace = append(namespace, ']')
-
- e.setFieldByType(v.MapIndex(key), namespace, -2, false)
- }
-
- case reflect.Struct:
-
- // if we get here then no custom time function declared so use RFC3339 by default
- if v.Type() == timeType {
-
- if idx > -1 {
- namespace = append(namespace, '[')
- namespace = strconv.AppendInt(namespace, int64(idx), 10)
- namespace = append(namespace, ']')
- }
-
- e.setVal(namespace, idx, v.Interface().(time.Time).Format(time.RFC3339))
- return
- }
-
- if idx == -1 {
- e.traverseStruct(v, namespace, idx)
- return
- }
-
- if idx > -1 {
- namespace = append(namespace, '[')
- namespace = strconv.AppendInt(namespace, int64(idx), 10)
- namespace = append(namespace, ']')
- }
-
- e.traverseStruct(v, namespace, -2)
- }
-}
-
-func (e *encoder) getMapKey(key reflect.Value, namespace []byte) (string, bool) {
-
- v, kind := ExtractType(key)
-
- if e.e.customTypeFuncs != nil {
-
- if cf, ok := e.e.customTypeFuncs[v.Type()]; ok {
- arr, err := cf(v.Interface())
- if err != nil {
- e.setError(namespace, err)
- return "", false
- }
-
- return arr[0], true
- }
- }
-
- switch kind {
- case reflect.Interface, reflect.Ptr:
- return "", false
-
- case reflect.String:
- return v.String(), true
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- return strconv.FormatUint(v.Uint(), 10), true
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return strconv.FormatInt(v.Int(), 10), true
-
- case reflect.Float32:
- return strconv.FormatFloat(v.Float(), 'f', -1, 32), true
-
- case reflect.Float64:
- return strconv.FormatFloat(v.Float(), 'f', -1, 64), true
-
- case reflect.Bool:
- return strconv.FormatBool(v.Bool()), true
-
- default:
- e.setError(namespace, fmt.Errorf("Unsupported Map Key '%v' Namespace '%s'", v.String(), namespace))
- return "", false
- }
-}
diff --git a/vendor/github.com/go-playground/form/v4/form.go b/vendor/github.com/go-playground/form/v4/form.go
deleted file mode 100644
index b1b4e7dc2..000000000
--- a/vendor/github.com/go-playground/form/v4/form.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package form
-
-import (
- "reflect"
- "time"
-)
-
-const (
- blank = ""
- ignore = "-"
- fieldNS = "Field Namespace:"
- errorText = " ERROR:"
-)
-
-var (
- timeType = reflect.TypeOf(time.Time{})
-)
-
-// Mode specifies which mode the form decoder is to run
-type Mode uint8
-
-const (
-
- // ModeImplicit tries to parse values for all
- // fields that do not have an ignore '-' tag
- ModeImplicit Mode = iota
-
- // ModeExplicit only parses values for field with a field tag
- // and that tag is not the ignore '-' tag
- ModeExplicit
-)
-
-// AnonymousMode specifies how data should be rolled up
-// or separated from anonymous structs
-type AnonymousMode uint8
-
-const (
- // AnonymousEmbed embeds anonymous data when encoding
- // eg. type A struct { Field string }
- // type B struct { A, Field string }
- // encode results: url.Values{"Field":[]string{"B FieldVal", "A FieldVal"}}
- AnonymousEmbed AnonymousMode = iota
-
- // AnonymousSeparate does not embed anonymous data when encoding
- // eg. type A struct { Field string }
- // type B struct { A, Field string }
- // encode results: url.Values{"Field":[]string{"B FieldVal"}, "A.Field":[]string{"A FieldVal"}}
- AnonymousSeparate
-)
diff --git a/vendor/github.com/go-playground/form/v4/form_decoder.go b/vendor/github.com/go-playground/form/v4/form_decoder.go
deleted file mode 100644
index ac131ea8b..000000000
--- a/vendor/github.com/go-playground/form/v4/form_decoder.go
+++ /dev/null
@@ -1,187 +0,0 @@
-package form
-
-import (
- "bytes"
- "net/url"
- "reflect"
- "strings"
- "sync"
-)
-
-// DecodeCustomTypeFunc allows for registering/overriding types to be parsed.
-type DecodeCustomTypeFunc func([]string) (interface{}, error)
-
-// DecodeErrors is a map of errors encountered during form decoding
-type DecodeErrors map[string]error
-
-func (d DecodeErrors) Error() string {
- buff := bytes.NewBufferString(blank)
-
- for k, err := range d {
- buff.WriteString(fieldNS)
- buff.WriteString(k)
- buff.WriteString(errorText)
- buff.WriteString(err.Error())
- buff.WriteString("\n")
- }
-
- return strings.TrimSpace(buff.String())
-}
-
-// An InvalidDecoderError describes an invalid argument passed to Decode.
-// (The argument passed to Decode must be a non-nil pointer.)
-type InvalidDecoderError struct {
- Type reflect.Type
-}
-
-func (e *InvalidDecoderError) Error() string {
-
- if e.Type == nil {
- return "form: Decode(nil)"
- }
-
- if e.Type.Kind() != reflect.Ptr {
- return "form: Decode(non-pointer " + e.Type.String() + ")"
- }
-
- return "form: Decode(nil " + e.Type.String() + ")"
-}
-
-type key struct {
- ivalue int
- value string
- searchValue string
-}
-
-type recursiveData struct {
- alias string
- sliceLen int
- keys []key
-}
-
-type dataMap []*recursiveData
-
-// Decoder is the main decode instance
-type Decoder struct {
- tagName string
- mode Mode
- structCache *structCacheMap
- customTypeFuncs map[reflect.Type]DecodeCustomTypeFunc
- maxArraySize int
- dataPool *sync.Pool
- namespacePrefix string
- namespaceSuffix string
-}
-
-// NewDecoder creates a new decoder instance with sane defaults
-func NewDecoder() *Decoder {
-
- d := &Decoder{
- tagName: "form",
- mode: ModeImplicit,
- structCache: newStructCacheMap(),
- maxArraySize: 10000,
- namespacePrefix: ".",
- }
-
- d.dataPool = &sync.Pool{New: func() interface{} {
- return &decoder{
- d: d,
- namespace: make([]byte, 0, 64),
- }
- }}
-
- return d
-}
-
-// SetTagName sets the given tag name to be used by the decoder.
-// Default is "form"
-func (d *Decoder) SetTagName(tagName string) {
- d.tagName = tagName
-}
-
-// SetMode sets the mode the decoder should run
-// Default is ModeImplicit
-func (d *Decoder) SetMode(mode Mode) {
- d.mode = mode
-}
-
-// SetNamespacePrefix sets a struct namespace prefix.
-func (d *Decoder) SetNamespacePrefix(namespacePrefix string) {
- d.namespacePrefix = namespacePrefix
-}
-
-// SetNamespaceSuffix sets a struct namespace suffix.
-func (d *Decoder) SetNamespaceSuffix(namespaceSuffix string) {
- d.namespaceSuffix = namespaceSuffix
-}
-
-// SetMaxArraySize sets maximum array size that can be created.
-// This limit is for the array indexing this library supports to
-// avoid potential DOS or man-in-the-middle attacks using an unusually
-// high number.
-// DEFAULT: 10000
-func (d *Decoder) SetMaxArraySize(size uint) {
- d.maxArraySize = int(size)
-}
-
-// RegisterTagNameFunc registers a custom tag name parser function
-// NOTE: This method is not thread-safe it is intended that these all be registered prior to any parsing
-//
-// ADDITIONAL: once a custom function has been registered the default, or custom set, tag name is ignored
-// and relies 100% on the function for the name data. The return value WILL BE CACHED and so return value
-// must be consistent.
-func (d *Decoder) RegisterTagNameFunc(fn TagNameFunc) {
- d.structCache.tagFn = fn
-}
-
-// RegisterCustomTypeFunc registers a CustomTypeFunc against a number of types.
-// NOTE: This method is not thread-safe it is intended that these all be registered prior to any parsing
-//
-// ADDITIONAL: if a struct type is registered, the function will only be called if a url.Value exists for
-// the struct and not just the struct fields eg. url.Values{"User":"Name%3Djoeybloggs"} will call the
-// custom type function with `User` as the type, however url.Values{"User.Name":"joeybloggs"} will not.
-func (d *Decoder) RegisterCustomTypeFunc(fn DecodeCustomTypeFunc, types ...interface{}) {
-
- if d.customTypeFuncs == nil {
- d.customTypeFuncs = map[reflect.Type]DecodeCustomTypeFunc{}
- }
-
- for _, t := range types {
- d.customTypeFuncs[reflect.TypeOf(t)] = fn
- }
-}
-
-// Decode parses the given values and sets the corresponding struct and/or type values
-//
-// Decode returns an InvalidDecoderError if interface passed is invalid.
-func (d *Decoder) Decode(v interface{}, values url.Values) (err error) {
-
- val := reflect.ValueOf(v)
-
- if val.Kind() != reflect.Ptr || val.IsNil() {
- return &InvalidDecoderError{reflect.TypeOf(v)}
- }
-
- dec := d.dataPool.Get().(*decoder)
- dec.values = values
- dec.dm = dec.dm[0:0]
-
- val = val.Elem()
- typ := val.Type()
-
- if val.Kind() == reflect.Struct && typ != timeType {
- dec.traverseStruct(val, typ, dec.namespace[0:0])
- } else {
- dec.setFieldByType(val, dec.namespace[0:0], 0)
- }
-
- if len(dec.errs) > 0 {
- err = dec.errs
- dec.errs = nil
- }
-
- d.dataPool.Put(dec)
-
- return
-}
diff --git a/vendor/github.com/go-playground/form/v4/form_encoder.go b/vendor/github.com/go-playground/form/v4/form_encoder.go
deleted file mode 100644
index 48960c9a1..000000000
--- a/vendor/github.com/go-playground/form/v4/form_encoder.go
+++ /dev/null
@@ -1,157 +0,0 @@
-package form
-
-import (
- "bytes"
- "net/url"
- "reflect"
- "strings"
- "sync"
-)
-
-// EncodeCustomTypeFunc allows for registering/overriding types to be parsed.
-type EncodeCustomTypeFunc func(x interface{}) ([]string, error)
-
-// EncodeErrors is a map of errors encountered during form encoding
-type EncodeErrors map[string]error
-
-func (e EncodeErrors) Error() string {
- buff := bytes.NewBufferString(blank)
-
- for k, err := range e {
- buff.WriteString(fieldNS)
- buff.WriteString(k)
- buff.WriteString(errorText)
- buff.WriteString(err.Error())
- buff.WriteString("\n")
- }
-
- return strings.TrimSpace(buff.String())
-}
-
-// An InvalidEncodeError describes an invalid argument passed to Encode.
-type InvalidEncodeError struct {
- Type reflect.Type
-}
-
-func (e *InvalidEncodeError) Error() string {
-
- if e.Type == nil {
- return "form: Encode(nil)"
- }
-
- return "form: Encode(nil " + e.Type.String() + ")"
-}
-
-// Encoder is the main encode instance
-type Encoder struct {
- tagName string
- structCache *structCacheMap
- customTypeFuncs map[reflect.Type]EncodeCustomTypeFunc
- dataPool *sync.Pool
- mode Mode
- embedAnonymous bool
- namespacePrefix string
- namespaceSuffix string
-}
-
-// NewEncoder creates a new encoder instance with sane defaults
-func NewEncoder() *Encoder {
-
- e := &Encoder{
- tagName: "form",
- mode: ModeImplicit,
- structCache: newStructCacheMap(),
- embedAnonymous: true,
- namespacePrefix: ".",
- }
-
- e.dataPool = &sync.Pool{New: func() interface{} {
- return &encoder{
- e: e,
- namespace: make([]byte, 0, 64),
- }
- }}
-
- return e
-}
-
-// SetTagName sets the given tag name to be used by the encoder.
-// Default is "form"
-func (e *Encoder) SetTagName(tagName string) {
- e.tagName = tagName
-}
-
-// SetMode sets the mode the encoder should run
-// Default is ModeImplicit
-func (e *Encoder) SetMode(mode Mode) {
- e.mode = mode
-}
-
-// SetNamespacePrefix sets a struct namespace prefix.
-func (e *Encoder) SetNamespacePrefix(namespacePrefix string) {
- e.namespacePrefix = namespacePrefix
-}
-
-// SetNamespaceSuffix sets a struct namespace suffix.
-func (e *Encoder) SetNamespaceSuffix(namespaceSuffix string) {
- e.namespaceSuffix = namespaceSuffix
-}
-
-// SetAnonymousMode sets the mode the encoder should run
-// Default is AnonymousEmbed
-func (e *Encoder) SetAnonymousMode(mode AnonymousMode) {
- e.embedAnonymous = mode == AnonymousEmbed
-}
-
-// RegisterTagNameFunc registers a custom tag name parser function
-// NOTE: This method is not thread-safe it is intended that these all be registered prior to any parsing
-//
-// ADDITIONAL: once a custom function has been registered the default, or custom set, tag name is ignored
-// and relies 100% on the function for the name data. The return value WILL BE CACHED and so return value
-// must be consistent.
-func (e *Encoder) RegisterTagNameFunc(fn TagNameFunc) {
- e.structCache.tagFn = fn
-}
-
-// RegisterCustomTypeFunc registers a CustomTypeFunc against a number of types
-// NOTE: this method is not thread-safe it is intended that these all be registered prior to any parsing
-func (e *Encoder) RegisterCustomTypeFunc(fn EncodeCustomTypeFunc, types ...interface{}) {
-
- if e.customTypeFuncs == nil {
- e.customTypeFuncs = map[reflect.Type]EncodeCustomTypeFunc{}
- }
-
- for _, t := range types {
- e.customTypeFuncs[reflect.TypeOf(t)] = fn
- }
-}
-
-// Encode encodes the given values and sets the corresponding struct values
-func (e *Encoder) Encode(v interface{}) (values url.Values, err error) {
-
- val, kind := ExtractType(reflect.ValueOf(v))
-
- if kind == reflect.Ptr || kind == reflect.Interface || kind == reflect.Invalid {
- return nil, &InvalidEncodeError{reflect.TypeOf(v)}
- }
-
- enc := e.dataPool.Get().(*encoder)
- enc.values = make(url.Values)
-
- if kind == reflect.Struct && val.Type() != timeType {
- enc.traverseStruct(val, enc.namespace[0:0], -1)
- } else {
- enc.setFieldByType(val, enc.namespace[0:0], -1, false)
- }
-
- if len(enc.errs) > 0 {
- err = enc.errs
- enc.errs = nil
- }
-
- values = enc.values
-
- e.dataPool.Put(enc)
-
- return
-}
diff --git a/vendor/github.com/go-playground/form/v4/logo.jpg b/vendor/github.com/go-playground/form/v4/logo.jpg
deleted file mode 100644
index 2ef34f87e..000000000
--- a/vendor/github.com/go-playground/form/v4/logo.jpg
+++ /dev/null
Binary files differ
diff --git a/vendor/github.com/go-playground/form/v4/util.go b/vendor/github.com/go-playground/form/v4/util.go
deleted file mode 100644
index 02c86af72..000000000
--- a/vendor/github.com/go-playground/form/v4/util.go
+++ /dev/null
@@ -1,62 +0,0 @@
-package form
-
-import (
- "reflect"
- "strconv"
-)
-
-// ExtractType gets the actual underlying type of field value.
-// it is exposed for use within you Custom Functions
-func ExtractType(current reflect.Value) (reflect.Value, reflect.Kind) {
-
- switch current.Kind() {
- case reflect.Ptr:
-
- if current.IsNil() {
- return current, reflect.Ptr
- }
-
- return ExtractType(current.Elem())
-
- case reflect.Interface:
-
- if current.IsNil() {
- return current, reflect.Interface
- }
-
- return ExtractType(current.Elem())
-
- default:
- return current, current.Kind()
- }
-}
-
-func parseBool(str string) (bool, error) {
-
- switch str {
- case "1", "t", "T", "true", "TRUE", "True", "on", "yes", "ok":
- return true, nil
- case "", "0", "f", "F", "false", "FALSE", "False", "off", "no":
- return false, nil
- }
-
- // strconv.NumError mimicing exactly the strconv.ParseBool(..) error and type
- // to ensure compatibility with std library and beyond.
- return false, &strconv.NumError{Func: "ParseBool", Num: str, Err: strconv.ErrSyntax}
-}
-
-// hasValue determines if a reflect.Value is it's default value
-func hasValue(field reflect.Value) bool {
- switch field.Kind() {
- case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func:
- return !field.IsNil()
- default:
- if !field.IsValid() {
- return false
- }
- if !field.Type().Comparable() {
- return true
- }
- return field.Interface() != reflect.Zero(field.Type()).Interface()
- }
-}
diff --git a/vendor/github.com/go-playground/locales/.gitignore b/vendor/github.com/go-playground/locales/.gitignore
deleted file mode 100644
index daf913b1b..000000000
--- a/vendor/github.com/go-playground/locales/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
-*.test
-*.prof
diff --git a/vendor/github.com/go-playground/locales/.travis.yml b/vendor/github.com/go-playground/locales/.travis.yml
deleted file mode 100644
index d50237a60..000000000
--- a/vendor/github.com/go-playground/locales/.travis.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-language: go
-go:
- - 1.13.1
- - tip
-matrix:
- allow_failures:
- - go: tip
-
-notifications:
- email:
- recipients: dean.karn@gmail.com
- on_success: change
- on_failure: always
-
-before_install:
- - go install github.com/mattn/goveralls
-
-# Only clone the most recent commit.
-git:
- depth: 1
-
-script:
- - go test -v -race -covermode=atomic -coverprofile=coverage.coverprofile ./...
-
-after_success: |
- goveralls -coverprofile=coverage.coverprofile -service travis-ci -repotoken $COVERALLS_TOKEN \ No newline at end of file
diff --git a/vendor/github.com/go-playground/locales/LICENSE b/vendor/github.com/go-playground/locales/LICENSE
deleted file mode 100644
index 75854ac4f..000000000
--- a/vendor/github.com/go-playground/locales/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2016 Go Playground
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE. \ No newline at end of file
diff --git a/vendor/github.com/go-playground/locales/README.md b/vendor/github.com/go-playground/locales/README.md
deleted file mode 100644
index 7b6be2c64..000000000
--- a/vendor/github.com/go-playground/locales/README.md
+++ /dev/null
@@ -1,170 +0,0 @@
-## locales
-<img align="right" src="https://raw.githubusercontent.com/go-playground/locales/master/logo.png">![Project status](https://img.shields.io/badge/version-0.14.1-green.svg)
-[![Build Status](https://travis-ci.org/go-playground/locales.svg?branch=master)](https://travis-ci.org/go-playground/locales)
-[![GoDoc](https://godoc.org/github.com/go-playground/locales?status.svg)](https://godoc.org/github.com/go-playground/locales)
-![License](https://img.shields.io/dub/l/vibe-d.svg)
-
-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).
-
-Features
---------
-- [x] Rules generated from the latest [CLDR](http://cldr.unicode.org/index/downloads) data, v36.0.1
-- [x] Contains Cardinal, Ordinal and Range Plural Rules
-- [x] Contains Month, Weekday and Timezone translations built in
-- [x] Contains Date & Time formatting functions
-- [x] Contains Number, Currency, Accounting and Percent formatting functions
-- [x] Supports the "Gregorian" calendar only ( my time isn't unlimited, had to draw the line somewhere )
-
-Full Tests
---------------------
-I could sure use your help adding tests for every locale, it is a huge undertaking and I just don't have the free time to do it all at the moment;
-any help would be **greatly appreciated!!!!** please see [issue](https://github.com/go-playground/locales/issues/1) for details.
-
-Installation
------------
-
-Use go get
-
-```shell
-go get github.com/go-playground/locales
-```
-
-NOTES
---------
-You'll notice most return types are []byte, this is because most of the time the results will be concatenated with a larger body
-of text and can avoid some allocations if already appending to a byte array, otherwise just cast as string.
-
-Usage
--------
-```go
-package main
-
-import (
- "fmt"
- "time"
-
- "github.com/go-playground/locales/currency"
- "github.com/go-playground/locales/en_CA"
-)
-
-func main() {
-
- loc, _ := time.LoadLocation("America/Toronto")
- datetime := time.Date(2016, 02, 03, 9, 0, 1, 0, loc)
-
- l := en_CA.New()
-
- // Dates
- fmt.Println(l.FmtDateFull(datetime))
- fmt.Println(l.FmtDateLong(datetime))
- fmt.Println(l.FmtDateMedium(datetime))
- fmt.Println(l.FmtDateShort(datetime))
-
- // Times
- fmt.Println(l.FmtTimeFull(datetime))
- fmt.Println(l.FmtTimeLong(datetime))
- fmt.Println(l.FmtTimeMedium(datetime))
- fmt.Println(l.FmtTimeShort(datetime))
-
- // Months Wide
- fmt.Println(l.MonthWide(time.January))
- fmt.Println(l.MonthWide(time.February))
- fmt.Println(l.MonthWide(time.March))
- // ...
-
- // Months Abbreviated
- fmt.Println(l.MonthAbbreviated(time.January))
- fmt.Println(l.MonthAbbreviated(time.February))
- fmt.Println(l.MonthAbbreviated(time.March))
- // ...
-
- // Months Narrow
- fmt.Println(l.MonthNarrow(time.January))
- fmt.Println(l.MonthNarrow(time.February))
- fmt.Println(l.MonthNarrow(time.March))
- // ...
-
- // Weekdays Wide
- fmt.Println(l.WeekdayWide(time.Sunday))
- fmt.Println(l.WeekdayWide(time.Monday))
- fmt.Println(l.WeekdayWide(time.Tuesday))
- // ...
-
- // Weekdays Abbreviated
- fmt.Println(l.WeekdayAbbreviated(time.Sunday))
- fmt.Println(l.WeekdayAbbreviated(time.Monday))
- fmt.Println(l.WeekdayAbbreviated(time.Tuesday))
- // ...
-
- // Weekdays Short
- fmt.Println(l.WeekdayShort(time.Sunday))
- fmt.Println(l.WeekdayShort(time.Monday))
- fmt.Println(l.WeekdayShort(time.Tuesday))
- // ...
-
- // Weekdays Narrow
- fmt.Println(l.WeekdayNarrow(time.Sunday))
- fmt.Println(l.WeekdayNarrow(time.Monday))
- fmt.Println(l.WeekdayNarrow(time.Tuesday))
- // ...
-
- var f64 float64
-
- f64 = -10356.4523
-
- // Number
- fmt.Println(l.FmtNumber(f64, 2))
-
- // Currency
- fmt.Println(l.FmtCurrency(f64, 2, currency.CAD))
- fmt.Println(l.FmtCurrency(f64, 2, currency.USD))
-
- // Accounting
- fmt.Println(l.FmtAccounting(f64, 2, currency.CAD))
- fmt.Println(l.FmtAccounting(f64, 2, currency.USD))
-
- f64 = 78.12
-
- // Percent
- fmt.Println(l.FmtPercent(f64, 0))
-
- // Plural Rules for locale, so you know what rules you must cover
- fmt.Println(l.PluralsCardinal())
- fmt.Println(l.PluralsOrdinal())
-
- // Cardinal Plural Rules
- fmt.Println(l.CardinalPluralRule(1, 0))
- fmt.Println(l.CardinalPluralRule(1.0, 0))
- fmt.Println(l.CardinalPluralRule(1.0, 1))
- fmt.Println(l.CardinalPluralRule(3, 0))
-
- // Ordinal Plural Rules
- fmt.Println(l.OrdinalPluralRule(21, 0)) // 21st
- fmt.Println(l.OrdinalPluralRule(22, 0)) // 22nd
- fmt.Println(l.OrdinalPluralRule(33, 0)) // 33rd
- fmt.Println(l.OrdinalPluralRule(34, 0)) // 34th
-
- // Range Plural Rules
- fmt.Println(l.RangePluralRule(1, 0, 1, 0)) // 1-1
- fmt.Println(l.RangePluralRule(1, 0, 2, 0)) // 1-2
- fmt.Println(l.RangePluralRule(5, 0, 8, 0)) // 5-8
-}
-```
-
-NOTES:
--------
-These rules were generated from the [Unicode CLDR Project](http://cldr.unicode.org/), if you encounter any issues
-I strongly encourage contributing to the CLDR project to get the locale information corrected and the next time
-these locales are regenerated the fix will come with.
-
-I do however realize that time constraints are often important and so there are two options:
-
-1. Create your own locale, copy, paste and modify, and ensure it complies with the `Translator` interface.
-2. Add an exception in the locale generation code directly and once regenerated, fix will be in place.
-
-Please to not make fixes inside the locale files, they WILL get overwritten when the locales are regenerated.
-
-License
-------
-Distributed under MIT License, please see license file in code for more details.
diff --git a/vendor/github.com/go-playground/locales/currency/currency.go b/vendor/github.com/go-playground/locales/currency/currency.go
deleted file mode 100644
index b5a95fb07..000000000
--- a/vendor/github.com/go-playground/locales/currency/currency.go
+++ /dev/null
@@ -1,311 +0,0 @@
-package currency
-
-// Type is the currency type associated with the locales currency enum
-type Type int
-
-// locale currencies
-const (
- ADP Type = iota
- AED
- AFA
- AFN
- ALK
- ALL
- AMD
- ANG
- AOA
- AOK
- AON
- AOR
- ARA
- ARL
- ARM
- ARP
- ARS
- ATS
- AUD
- AWG
- AZM
- AZN
- BAD
- BAM
- BAN
- BBD
- BDT
- BEC
- BEF
- BEL
- BGL
- BGM
- BGN
- BGO
- BHD
- BIF
- BMD
- BND
- BOB
- BOL
- BOP
- BOV
- BRB
- BRC
- BRE
- BRL
- BRN
- BRR
- BRZ
- BSD
- BTN
- BUK
- BWP
- BYB
- BYN
- BYR
- BZD
- CAD
- CDF
- CHE
- CHF
- CHW
- CLE
- CLF
- CLP
- CNH
- CNX
- CNY
- COP
- COU
- CRC
- CSD
- CSK
- CUC
- CUP
- CVE
- CYP
- CZK
- DDM
- DEM
- DJF
- DKK
- DOP
- DZD
- ECS
- ECV
- EEK
- EGP
- ERN
- ESA
- ESB
- ESP
- ETB
- EUR
- FIM
- FJD
- FKP
- FRF
- GBP
- GEK
- GEL
- GHC
- GHS
- GIP
- GMD
- GNF
- GNS
- GQE
- GRD
- GTQ
- GWE
- GWP
- GYD
- HKD
- HNL
- HRD
- HRK
- HTG
- HUF
- IDR
- IEP
- ILP
- ILR
- ILS
- INR
- IQD
- IRR
- ISJ
- ISK
- ITL
- JMD
- JOD
- JPY
- KES
- KGS
- KHR
- KMF
- KPW
- KRH
- KRO
- KRW
- KWD
- KYD
- KZT
- LAK
- LBP
- LKR
- LRD
- LSL
- LTL
- LTT
- LUC
- LUF
- LUL
- LVL
- LVR
- LYD
- MAD
- MAF
- MCF
- MDC
- MDL
- MGA
- MGF
- MKD
- MKN
- MLF
- MMK
- MNT
- MOP
- MRO
- MRU
- MTL
- MTP
- MUR
- MVP
- MVR
- MWK
- MXN
- MXP
- MXV
- MYR
- MZE
- MZM
- MZN
- NAD
- NGN
- NIC
- NIO
- NLG
- NOK
- NPR
- NZD
- OMR
- PAB
- PEI
- PEN
- PES
- PGK
- PHP
- PKR
- PLN
- PLZ
- PTE
- PYG
- QAR
- RHD
- ROL
- RON
- RSD
- RUB
- RUR
- RWF
- SAR
- SBD
- SCR
- SDD
- SDG
- SDP
- SEK
- SGD
- SHP
- SIT
- SKK
- SLL
- SOS
- SRD
- SRG
- SSP
- STD
- STN
- SUR
- SVC
- SYP
- SZL
- THB
- TJR
- TJS
- TMM
- TMT
- TND
- TOP
- TPE
- TRL
- TRY
- TTD
- TWD
- TZS
- UAH
- UAK
- UGS
- UGX
- USD
- USN
- USS
- UYI
- UYP
- UYU
- UYW
- UZS
- VEB
- VEF
- VES
- VND
- VNN
- VUV
- WST
- XAF
- XAG
- XAU
- XBA
- XBB
- XBC
- XBD
- XCD
- XDR
- XEU
- XFO
- XFU
- XOF
- XPD
- XPF
- XPT
- XRE
- XSU
- XTS
- XUA
- XXX
- YDD
- YER
- YUD
- YUM
- YUN
- YUR
- ZAL
- ZAR
- ZMK
- ZMW
- ZRN
- ZRZ
- ZWD
- ZWL
- ZWR
-)
diff --git a/vendor/github.com/go-playground/locales/logo.png b/vendor/github.com/go-playground/locales/logo.png
deleted file mode 100644
index 3038276e6..000000000
--- a/vendor/github.com/go-playground/locales/logo.png
+++ /dev/null
Binary files differ
diff --git a/vendor/github.com/go-playground/locales/rules.go b/vendor/github.com/go-playground/locales/rules.go
deleted file mode 100644
index 920290014..000000000
--- a/vendor/github.com/go-playground/locales/rules.go
+++ /dev/null
@@ -1,293 +0,0 @@
-package locales
-
-import (
- "strconv"
- "time"
-
- "github.com/go-playground/locales/currency"
-)
-
-// // ErrBadNumberValue is returned when the number passed for
-// // plural rule determination cannot be parsed
-// type ErrBadNumberValue struct {
-// NumberValue string
-// InnerError error
-// }
-
-// // Error returns ErrBadNumberValue error string
-// func (e *ErrBadNumberValue) Error() string {
-// return fmt.Sprintf("Invalid Number Value '%s' %s", e.NumberValue, e.InnerError)
-// }
-
-// var _ error = new(ErrBadNumberValue)
-
-// PluralRule denotes the type of plural rules
-type PluralRule int
-
-// PluralRule's
-const (
- PluralRuleUnknown PluralRule = iota
- PluralRuleZero // zero
- PluralRuleOne // one - singular
- PluralRuleTwo // two - dual
- PluralRuleFew // few - paucal
- PluralRuleMany // many - also used for fractions if they have a separate class
- PluralRuleOther // other - required—general plural form—also used if the language only has a single form
-)
-
-const (
- pluralsString = "UnknownZeroOneTwoFewManyOther"
-)
-
-// Translator encapsulates an instance of a locale
-// NOTE: some values are returned as a []byte just in case the caller
-// wishes to add more and can help avoid allocations; otherwise just cast as string
-type Translator interface {
-
- // The following Functions are for overriding, debugging or developing
- // with a Translator Locale
-
- // Locale returns the string value of the translator
- Locale() string
-
- // returns an array of cardinal plural rules associated
- // with this translator
- PluralsCardinal() []PluralRule
-
- // returns an array of ordinal plural rules associated
- // with this translator
- PluralsOrdinal() []PluralRule
-
- // returns an array of range plural rules associated
- // with this translator
- PluralsRange() []PluralRule
-
- // returns the cardinal PluralRule given 'num' and digits/precision of 'v' for locale
- CardinalPluralRule(num float64, v uint64) PluralRule
-
- // returns the ordinal PluralRule given 'num' and digits/precision of 'v' for locale
- OrdinalPluralRule(num float64, v uint64) PluralRule
-
- // returns the ordinal PluralRule given 'num1', 'num2' and digits/precision of 'v1' and 'v2' for locale
- RangePluralRule(num1 float64, v1 uint64, num2 float64, v2 uint64) PluralRule
-
- // returns the locales abbreviated month given the 'month' provided
- MonthAbbreviated(month time.Month) string
-
- // returns the locales abbreviated months
- MonthsAbbreviated() []string
-
- // returns the locales narrow month given the 'month' provided
- MonthNarrow(month time.Month) string
-
- // returns the locales narrow months
- MonthsNarrow() []string
-
- // returns the locales wide month given the 'month' provided
- MonthWide(month time.Month) string
-
- // returns the locales wide months
- MonthsWide() []string
-
- // returns the locales abbreviated weekday given the 'weekday' provided
- WeekdayAbbreviated(weekday time.Weekday) string
-
- // returns the locales abbreviated weekdays
- WeekdaysAbbreviated() []string
-
- // returns the locales narrow weekday given the 'weekday' provided
- WeekdayNarrow(weekday time.Weekday) string
-
- // WeekdaysNarrowreturns the locales narrow weekdays
- WeekdaysNarrow() []string
-
- // returns the locales short weekday given the 'weekday' provided
- WeekdayShort(weekday time.Weekday) string
-
- // returns the locales short weekdays
- WeekdaysShort() []string
-
- // returns the locales wide weekday given the 'weekday' provided
- WeekdayWide(weekday time.Weekday) string
-
- // returns the locales wide weekdays
- WeekdaysWide() []string
-
- // The following Functions are common Formatting functionsfor the Translator's Locale
-
- // returns 'num' with digits/precision of 'v' for locale and handles both Whole and Real numbers based on 'v'
- FmtNumber(num float64, v uint64) string
-
- // returns 'num' with digits/precision of 'v' for locale and handles both Whole and Real numbers based on 'v'
- // NOTE: 'num' passed into FmtPercent is assumed to be in percent already
- FmtPercent(num float64, v uint64) string
-
- // returns the currency representation of 'num' with digits/precision of 'v' for locale
- FmtCurrency(num float64, v uint64, currency currency.Type) string
-
- // returns the currency representation of 'num' with digits/precision of 'v' for locale
- // in accounting notation.
- FmtAccounting(num float64, v uint64, currency currency.Type) string
-
- // returns the short date representation of 't' for locale
- FmtDateShort(t time.Time) string
-
- // returns the medium date representation of 't' for locale
- FmtDateMedium(t time.Time) string
-
- // returns the long date representation of 't' for locale
- FmtDateLong(t time.Time) string
-
- // returns the full date representation of 't' for locale
- FmtDateFull(t time.Time) string
-
- // returns the short time representation of 't' for locale
- FmtTimeShort(t time.Time) string
-
- // returns the medium time representation of 't' for locale
- FmtTimeMedium(t time.Time) string
-
- // returns the long time representation of 't' for locale
- FmtTimeLong(t time.Time) string
-
- // returns the full time representation of 't' for locale
- FmtTimeFull(t time.Time) string
-}
-
-// String returns the string value of PluralRule
-func (p PluralRule) String() string {
-
- switch p {
- case PluralRuleZero:
- return pluralsString[7:11]
- case PluralRuleOne:
- return pluralsString[11:14]
- case PluralRuleTwo:
- return pluralsString[14:17]
- case PluralRuleFew:
- return pluralsString[17:20]
- case PluralRuleMany:
- return pluralsString[20:24]
- case PluralRuleOther:
- return pluralsString[24:]
- default:
- return pluralsString[:7]
- }
-}
-
-//
-// Precision Notes:
-//
-// must specify a precision >= 0, and here is why https://play.golang.org/p/LyL90U0Vyh
-//
-// v := float64(3.141)
-// i := float64(int64(v))
-//
-// fmt.Println(v - i)
-//
-// or
-//
-// s := strconv.FormatFloat(v-i, 'f', -1, 64)
-// fmt.Println(s)
-//
-// these will not print what you'd expect: 0.14100000000000001
-// and so this library requires a precision to be specified, or
-// inaccurate plural rules could be applied.
-//
-//
-//
-// n - absolute value of the source number (integer and decimals).
-// i - integer digits of n.
-// v - number of visible fraction digits in n, with trailing zeros.
-// w - number of visible fraction digits in n, without trailing zeros.
-// f - visible fractional digits in n, with trailing zeros.
-// t - visible fractional digits in n, without trailing zeros.
-//
-//
-// Func(num float64, v uint64) // v = digits/precision and prevents -1 as a special case as this can lead to very unexpected behaviour, see precision note's above.
-//
-// n := math.Abs(num)
-// i := int64(n)
-// v := v
-//
-//
-// w := strconv.FormatFloat(num-float64(i), 'f', int(v), 64) // then parse backwards on string until no more zero's....
-// f := strconv.FormatFloat(n, 'f', int(v), 64) // then turn everything after decimal into an int64
-// t := strconv.FormatFloat(n, 'f', int(v), 64) // then parse backwards on string until no more zero's....
-//
-//
-//
-// General Inclusion Rules
-// - v will always be available inherently
-// - all require n
-// - w requires i
-//
-
-// W returns the number of visible fraction digits in N, without trailing zeros.
-func W(n float64, v uint64) (w int64) {
-
- s := strconv.FormatFloat(n-float64(int64(n)), 'f', int(v), 64)
-
- // with either be '0' or '0.xxxx', so if 1 then w will be zero
- // otherwise need to parse
- if len(s) != 1 {
-
- s = s[2:]
- end := len(s) + 1
-
- for i := end; i >= 0; i-- {
- if s[i] != '0' {
- end = i + 1
- break
- }
- }
-
- w = int64(len(s[:end]))
- }
-
- return
-}
-
-// F returns the visible fractional digits in N, with trailing zeros.
-func F(n float64, v uint64) (f int64) {
-
- s := strconv.FormatFloat(n-float64(int64(n)), 'f', int(v), 64)
-
- // with either be '0' or '0.xxxx', so if 1 then f will be zero
- // otherwise need to parse
- if len(s) != 1 {
-
- // ignoring error, because it can't fail as we generated
- // the string internally from a real number
- f, _ = strconv.ParseInt(s[2:], 10, 64)
- }
-
- return
-}
-
-// T returns the visible fractional digits in N, without trailing zeros.
-func T(n float64, v uint64) (t int64) {
-
- s := strconv.FormatFloat(n-float64(int64(n)), 'f', int(v), 64)
-
- // with either be '0' or '0.xxxx', so if 1 then t will be zero
- // otherwise need to parse
- if len(s) != 1 {
-
- s = s[2:]
- end := len(s) + 1
-
- for i := end; i >= 0; i-- {
- if s[i] != '0' {
- end = i + 1
- break
- }
- }
-
- // ignoring error, because it can't fail as we generated
- // the string internally from a real number
- t, _ = strconv.ParseInt(s[:end], 10, 64)
- }
-
- return
-}
diff --git a/vendor/github.com/go-playground/universal-translator/.gitignore b/vendor/github.com/go-playground/universal-translator/.gitignore
deleted file mode 100644
index bc4e07f34..000000000
--- a/vendor/github.com/go-playground/universal-translator/.gitignore
+++ /dev/null
@@ -1,25 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
-*.test
-*.prof
-*.coverprofile \ No newline at end of file
diff --git a/vendor/github.com/go-playground/universal-translator/.travis.yml b/vendor/github.com/go-playground/universal-translator/.travis.yml
deleted file mode 100644
index 39b8b923e..000000000
--- a/vendor/github.com/go-playground/universal-translator/.travis.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-language: go
-go:
- - 1.13.4
- - tip
-matrix:
- allow_failures:
- - go: tip
-
-notifications:
- email:
- recipients: dean.karn@gmail.com
- on_success: change
- on_failure: always
-
-before_install:
- - go install github.com/mattn/goveralls
-
-# Only clone the most recent commit.
-git:
- depth: 1
-
-script:
- - go test -v -race -covermode=atomic -coverprofile=coverage.coverprofile ./...
-
-after_success: |
- [ $TRAVIS_GO_VERSION = 1.13.4 ] &&
- goveralls -coverprofile=coverage.coverprofile -service travis-ci -repotoken $COVERALLS_TOKEN \ No newline at end of file
diff --git a/vendor/github.com/go-playground/universal-translator/LICENSE b/vendor/github.com/go-playground/universal-translator/LICENSE
deleted file mode 100644
index 8d8aba15b..000000000
--- a/vendor/github.com/go-playground/universal-translator/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2016 Go Playground
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/vendor/github.com/go-playground/universal-translator/Makefile b/vendor/github.com/go-playground/universal-translator/Makefile
deleted file mode 100644
index ec3455bd5..000000000
--- a/vendor/github.com/go-playground/universal-translator/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-GOCMD=GO111MODULE=on go
-
-linters-install:
- @golangci-lint --version >/dev/null 2>&1 || { \
- echo "installing linting tools..."; \
- curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s v1.41.1; \
- }
-
-lint: linters-install
- golangci-lint run
-
-test:
- $(GOCMD) test -cover -race ./...
-
-bench:
- $(GOCMD) test -bench=. -benchmem ./...
-
-.PHONY: test lint linters-install \ No newline at end of file
diff --git a/vendor/github.com/go-playground/universal-translator/README.md b/vendor/github.com/go-playground/universal-translator/README.md
deleted file mode 100644
index d9b665474..000000000
--- a/vendor/github.com/go-playground/universal-translator/README.md
+++ /dev/null
@@ -1,87 +0,0 @@
-## universal-translator
-<img align="right" src="https://raw.githubusercontent.com/go-playground/universal-translator/master/logo.png">![Project status](https://img.shields.io/badge/version-0.18.1-green.svg)
-[![Coverage Status](https://coveralls.io/repos/github/go-playground/universal-translator/badge.svg)](https://coveralls.io/github/go-playground/universal-translator)
-[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/universal-translator)](https://goreportcard.com/report/github.com/go-playground/universal-translator)
-[![GoDoc](https://godoc.org/github.com/go-playground/universal-translator?status.svg)](https://godoc.org/github.com/go-playground/universal-translator)
-![License](https://img.shields.io/dub/l/vibe-d.svg)
-
-Universal Translator is an i18n Translator for Go/Golang using CLDR data + pluralization rules
-
-Why another i18n library?
---------------------------
-Because none of the plural rules seem to be correct out there, including the previous implementation of this package,
-so I took it upon myself to create [locales](https://github.com/go-playground/locales) for everyone to use; this package
-is a thin wrapper around [locales](https://github.com/go-playground/locales) in order to store and translate text for
-use in your applications.
-
-Features
---------
-- [x] Rules generated from the [CLDR](http://cldr.unicode.org/index/downloads) data, v36.0.1
-- [x] Contains Cardinal, Ordinal and Range Plural Rules
-- [x] Contains Month, Weekday and Timezone translations built in
-- [x] Contains Date & Time formatting functions
-- [x] Contains Number, Currency, Accounting and Percent formatting functions
-- [x] Supports the "Gregorian" calendar only ( my time isn't unlimited, had to draw the line somewhere )
-- [x] Support loading translations from files
-- [x] Exporting translations to file(s), mainly for getting them professionally translated
-- [ ] Code Generation for translation files -> Go code.. i.e. after it has been professionally translated
-- [ ] Tests for all languages, I need help with this, please see [here](https://github.com/go-playground/locales/issues/1)
-
-Installation
------------
-
-Use go get
-
-```shell
-go get github.com/go-playground/universal-translator
-```
-
-Usage & Documentation
--------
-
-Please see https://godoc.org/github.com/go-playground/universal-translator for usage docs
-
-##### Examples:
-
-- [Basic](https://github.com/go-playground/universal-translator/tree/master/_examples/basic)
-- [Full - no files](https://github.com/go-playground/universal-translator/tree/master/_examples/full-no-files)
-- [Full - with files](https://github.com/go-playground/universal-translator/tree/master/_examples/full-with-files)
-
-File formatting
---------------
-All types, Plain substitution, Cardinal, Ordinal and Range translations can all be contained within the same file(s);
-they are only separated for easy viewing.
-
-##### Examples:
-
-- [Formats](https://github.com/go-playground/universal-translator/tree/master/_examples/file-formats)
-
-##### Basic Makeup
-NOTE: not all fields are needed for all translation types, see [examples](https://github.com/go-playground/universal-translator/tree/master/_examples/file-formats)
-```json
-{
- "locale": "en",
- "key": "days-left",
- "trans": "You have {0} day left.",
- "type": "Cardinal",
- "rule": "One",
- "override": false
-}
-```
-|Field|Description|
-|---|---|
-|locale|The locale for which the translation is for.|
-|key|The translation key that will be used to store and lookup each translation; normally it is a string or integer.|
-|trans|The actual translation text.|
-|type|The type of translation Cardinal, Ordinal, Range or "" for a plain substitution(not required to be defined if plain used)|
-|rule|The plural rule for which the translation is for eg. One, Two, Few, Many or Other.(not required to be defined if plain used)|
-|override|If you wish to override an existing translation that has already been registered, set this to 'true'. 99% of the time there is no need to define it.|
-
-Help With Tests
----------------
-To anyone interesting in helping or contributing, I sure could use some help creating tests for each language.
-Please see issue [here](https://github.com/go-playground/locales/issues/1) for details.
-
-License
-------
-Distributed under MIT License, please see license file in code for more details.
diff --git a/vendor/github.com/go-playground/universal-translator/errors.go b/vendor/github.com/go-playground/universal-translator/errors.go
deleted file mode 100644
index 38b163b62..000000000
--- a/vendor/github.com/go-playground/universal-translator/errors.go
+++ /dev/null
@@ -1,148 +0,0 @@
-package ut
-
-import (
- "errors"
- "fmt"
-
- "github.com/go-playground/locales"
-)
-
-var (
- // ErrUnknowTranslation indicates the translation could not be found
- ErrUnknowTranslation = errors.New("Unknown Translation")
-)
-
-var _ error = new(ErrConflictingTranslation)
-var _ error = new(ErrRangeTranslation)
-var _ error = new(ErrOrdinalTranslation)
-var _ error = new(ErrCardinalTranslation)
-var _ error = new(ErrMissingPluralTranslation)
-var _ error = new(ErrExistingTranslator)
-
-// ErrExistingTranslator is the error representing a conflicting translator
-type ErrExistingTranslator struct {
- locale string
-}
-
-// Error returns ErrExistingTranslator's internal error text
-func (e *ErrExistingTranslator) Error() string {
- return fmt.Sprintf("error: conflicting translator for locale '%s'", e.locale)
-}
-
-// ErrConflictingTranslation is the error representing a conflicting translation
-type ErrConflictingTranslation struct {
- locale string
- key interface{}
- rule locales.PluralRule
- text string
-}
-
-// Error returns ErrConflictingTranslation's internal error text
-func (e *ErrConflictingTranslation) Error() string {
-
- if _, ok := e.key.(string); !ok {
- return fmt.Sprintf("error: conflicting key '%#v' rule '%s' with text '%s' for locale '%s', value being ignored", e.key, e.rule, e.text, e.locale)
- }
-
- return fmt.Sprintf("error: conflicting key '%s' rule '%s' with text '%s' for locale '%s', value being ignored", e.key, e.rule, e.text, e.locale)
-}
-
-// ErrRangeTranslation is the error representing a range translation error
-type ErrRangeTranslation struct {
- text string
-}
-
-// Error returns ErrRangeTranslation's internal error text
-func (e *ErrRangeTranslation) Error() string {
- return e.text
-}
-
-// ErrOrdinalTranslation is the error representing an ordinal translation error
-type ErrOrdinalTranslation struct {
- text string
-}
-
-// Error returns ErrOrdinalTranslation's internal error text
-func (e *ErrOrdinalTranslation) Error() string {
- return e.text
-}
-
-// ErrCardinalTranslation is the error representing a cardinal translation error
-type ErrCardinalTranslation struct {
- text string
-}
-
-// Error returns ErrCardinalTranslation's internal error text
-func (e *ErrCardinalTranslation) Error() string {
- return e.text
-}
-
-// ErrMissingPluralTranslation is the error signifying a missing translation given
-// the locales plural rules.
-type ErrMissingPluralTranslation struct {
- locale string
- key interface{}
- rule locales.PluralRule
- translationType string
-}
-
-// Error returns ErrMissingPluralTranslation's internal error text
-func (e *ErrMissingPluralTranslation) Error() string {
-
- if _, ok := e.key.(string); !ok {
- return fmt.Sprintf("error: missing '%s' plural rule '%s' for translation with key '%#v' and locale '%s'", e.translationType, e.rule, e.key, e.locale)
- }
-
- return fmt.Sprintf("error: missing '%s' plural rule '%s' for translation with key '%s' and locale '%s'", e.translationType, e.rule, e.key, e.locale)
-}
-
-// ErrMissingBracket is the error representing a missing bracket in a translation
-// eg. This is a {0 <-- missing ending '}'
-type ErrMissingBracket struct {
- locale string
- key interface{}
- text string
-}
-
-// Error returns ErrMissingBracket error message
-func (e *ErrMissingBracket) Error() string {
- return fmt.Sprintf("error: missing bracket '{}', in translation. locale: '%s' key: '%v' text: '%s'", e.locale, e.key, e.text)
-}
-
-// ErrBadParamSyntax is the error representing a bad parameter definition in a translation
-// eg. This is a {must-be-int}
-type ErrBadParamSyntax struct {
- locale string
- param string
- key interface{}
- text string
-}
-
-// Error returns ErrBadParamSyntax error message
-func (e *ErrBadParamSyntax) Error() string {
- return fmt.Sprintf("error: bad parameter syntax, missing parameter '%s' in translation. locale: '%s' key: '%v' text: '%s'", e.param, e.locale, e.key, e.text)
-}
-
-// import/export errors
-
-// ErrMissingLocale is the error representing an expected locale that could
-// not be found aka locale not registered with the UniversalTranslator Instance
-type ErrMissingLocale struct {
- locale string
-}
-
-// Error returns ErrMissingLocale's internal error text
-func (e *ErrMissingLocale) Error() string {
- return fmt.Sprintf("error: locale '%s' not registered.", e.locale)
-}
-
-// ErrBadPluralDefinition is the error representing an incorrect plural definition
-// usually found within translations defined within files during the import process.
-type ErrBadPluralDefinition struct {
- tl translation
-}
-
-// Error returns ErrBadPluralDefinition's internal error text
-func (e *ErrBadPluralDefinition) Error() string {
- return fmt.Sprintf("error: bad plural definition '%#v'", e.tl)
-}
diff --git a/vendor/github.com/go-playground/universal-translator/import_export.go b/vendor/github.com/go-playground/universal-translator/import_export.go
deleted file mode 100644
index 87a1b465c..000000000
--- a/vendor/github.com/go-playground/universal-translator/import_export.go
+++ /dev/null
@@ -1,274 +0,0 @@
-package ut
-
-import (
- "encoding/json"
- "fmt"
- "os"
- "path/filepath"
-
- "io"
-
- "github.com/go-playground/locales"
-)
-
-type translation struct {
- Locale string `json:"locale"`
- Key interface{} `json:"key"` // either string or integer
- Translation string `json:"trans"`
- PluralType string `json:"type,omitempty"`
- PluralRule string `json:"rule,omitempty"`
- OverrideExisting bool `json:"override,omitempty"`
-}
-
-const (
- cardinalType = "Cardinal"
- ordinalType = "Ordinal"
- rangeType = "Range"
-)
-
-// ImportExportFormat is the format of the file import or export
-type ImportExportFormat uint8
-
-// supported Export Formats
-const (
- FormatJSON ImportExportFormat = iota
-)
-
-// Export writes the translations out to a file on disk.
-//
-// NOTE: this currently only works with string or int translations keys.
-func (t *UniversalTranslator) Export(format ImportExportFormat, dirname string) error {
-
- _, err := os.Stat(dirname)
- if err != nil {
-
- if !os.IsNotExist(err) {
- return err
- }
-
- if err = os.MkdirAll(dirname, 0744); err != nil {
- return err
- }
- }
-
- // build up translations
- var trans []translation
- var b []byte
- var ext string
-
- for _, locale := range t.translators {
-
- for k, v := range locale.(*translator).translations {
- trans = append(trans, translation{
- Locale: locale.Locale(),
- Key: k,
- Translation: v.text,
- })
- }
-
- for k, pluralTrans := range locale.(*translator).cardinalTanslations {
-
- for i, plural := range pluralTrans {
-
- // leave enough for all plural rules
- // but not all are set for all languages.
- if plural == nil {
- continue
- }
-
- trans = append(trans, translation{
- Locale: locale.Locale(),
- Key: k.(string),
- Translation: plural.text,
- PluralType: cardinalType,
- PluralRule: locales.PluralRule(i).String(),
- })
- }
- }
-
- for k, pluralTrans := range locale.(*translator).ordinalTanslations {
-
- for i, plural := range pluralTrans {
-
- // leave enough for all plural rules
- // but not all are set for all languages.
- if plural == nil {
- continue
- }
-
- trans = append(trans, translation{
- Locale: locale.Locale(),
- Key: k.(string),
- Translation: plural.text,
- PluralType: ordinalType,
- PluralRule: locales.PluralRule(i).String(),
- })
- }
- }
-
- for k, pluralTrans := range locale.(*translator).rangeTanslations {
-
- for i, plural := range pluralTrans {
-
- // leave enough for all plural rules
- // but not all are set for all languages.
- if plural == nil {
- continue
- }
-
- trans = append(trans, translation{
- Locale: locale.Locale(),
- Key: k.(string),
- Translation: plural.text,
- PluralType: rangeType,
- PluralRule: locales.PluralRule(i).String(),
- })
- }
- }
-
- switch format {
- case FormatJSON:
- b, err = json.MarshalIndent(trans, "", " ")
- ext = ".json"
- }
-
- if err != nil {
- return err
- }
-
- err = os.WriteFile(filepath.Join(dirname, fmt.Sprintf("%s%s", locale.Locale(), ext)), b, 0644)
- if err != nil {
- return err
- }
-
- trans = trans[0:0]
- }
-
- return nil
-}
-
-// Import reads the translations out of a file or directory on disk.
-//
-// NOTE: this currently only works with string or int translations keys.
-func (t *UniversalTranslator) Import(format ImportExportFormat, dirnameOrFilename string) error {
-
- fi, err := os.Stat(dirnameOrFilename)
- if err != nil {
- return err
- }
-
- processFn := func(filename string) error {
-
- f, err := os.Open(filename)
- if err != nil {
- return err
- }
- defer f.Close()
-
- return t.ImportByReader(format, f)
- }
-
- if !fi.IsDir() {
- return processFn(dirnameOrFilename)
- }
-
- // recursively go through directory
- walker := func(path string, info os.FileInfo, err error) error {
-
- if info.IsDir() {
- return nil
- }
-
- switch format {
- case FormatJSON:
- // skip non JSON files
- if filepath.Ext(info.Name()) != ".json" {
- return nil
- }
- }
-
- return processFn(path)
- }
-
- return filepath.Walk(dirnameOrFilename, walker)
-}
-
-// ImportByReader imports the the translations found within the contents read from the supplied reader.
-//
-// 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 := io.ReadAll(reader)
- if err != nil {
- return err
- }
-
- var trans []translation
-
- switch format {
- case FormatJSON:
- err = json.Unmarshal(b, &trans)
- }
-
- if err != nil {
- return err
- }
-
- for _, tl := range trans {
-
- locale, found := t.FindTranslator(tl.Locale)
- if !found {
- return &ErrMissingLocale{locale: tl.Locale}
- }
-
- pr := stringToPR(tl.PluralRule)
-
- if pr == locales.PluralRuleUnknown {
-
- err = locale.Add(tl.Key, tl.Translation, tl.OverrideExisting)
- if err != nil {
- return err
- }
-
- continue
- }
-
- switch tl.PluralType {
- case cardinalType:
- err = locale.AddCardinal(tl.Key, tl.Translation, pr, tl.OverrideExisting)
- case ordinalType:
- err = locale.AddOrdinal(tl.Key, tl.Translation, pr, tl.OverrideExisting)
- case rangeType:
- err = locale.AddRange(tl.Key, tl.Translation, pr, tl.OverrideExisting)
- default:
- return &ErrBadPluralDefinition{tl: tl}
- }
-
- if err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func stringToPR(s string) locales.PluralRule {
-
- switch s {
- case "Zero":
- return locales.PluralRuleZero
- case "One":
- return locales.PluralRuleOne
- case "Two":
- return locales.PluralRuleTwo
- case "Few":
- return locales.PluralRuleFew
- case "Many":
- return locales.PluralRuleMany
- case "Other":
- return locales.PluralRuleOther
- default:
- return locales.PluralRuleUnknown
- }
-
-}
diff --git a/vendor/github.com/go-playground/universal-translator/logo.png b/vendor/github.com/go-playground/universal-translator/logo.png
deleted file mode 100644
index a37aa8c0c..000000000
--- a/vendor/github.com/go-playground/universal-translator/logo.png
+++ /dev/null
Binary files differ
diff --git a/vendor/github.com/go-playground/universal-translator/translator.go b/vendor/github.com/go-playground/universal-translator/translator.go
deleted file mode 100644
index 24b18db92..000000000
--- a/vendor/github.com/go-playground/universal-translator/translator.go
+++ /dev/null
@@ -1,420 +0,0 @@
-package ut
-
-import (
- "fmt"
- "strconv"
- "strings"
-
- "github.com/go-playground/locales"
-)
-
-const (
- paramZero = "{0}"
- paramOne = "{1}"
- unknownTranslation = ""
-)
-
-// Translator is universal translators
-// translator instance which is a thin wrapper
-// around locales.Translator instance providing
-// some extra functionality
-type Translator interface {
- locales.Translator
-
- // adds a normal translation for a particular language/locale
- // {#} is the only replacement type accepted and are ad infinitum
- // eg. one: '{0} day left' other: '{0} days left'
- Add(key interface{}, text string, override bool) error
-
- // adds a cardinal plural translation for a particular language/locale
- // {0} is the only replacement type accepted and only one variable is accepted as
- // multiple cannot be used for a plural rule determination, unless it is a range;
- // see AddRange below.
- // eg. in locale 'en' one: '{0} day left' other: '{0} days left'
- AddCardinal(key interface{}, text string, rule locales.PluralRule, override bool) error
-
- // adds an ordinal plural translation for a particular language/locale
- // {0} is the only replacement type accepted and only one variable is accepted as
- // multiple cannot be used for a plural rule determination, unless it is a range;
- // see AddRange below.
- // eg. in locale 'en' one: '{0}st day of spring' other: '{0}nd day of spring'
- // - 1st, 2nd, 3rd...
- AddOrdinal(key interface{}, text string, rule locales.PluralRule, override bool) error
-
- // adds a range plural translation for a particular language/locale
- // {0} and {1} are the only replacement types accepted and only these are accepted.
- // eg. in locale 'nl' one: '{0}-{1} day left' other: '{0}-{1} days left'
- AddRange(key interface{}, text string, rule locales.PluralRule, override bool) error
-
- // creates the translation for the locale given the 'key' and params passed in
- T(key interface{}, params ...string) (string, error)
-
- // creates the cardinal translation for the locale given the 'key', 'num' and 'digit' arguments
- // and param passed in
- C(key interface{}, num float64, digits uint64, param string) (string, error)
-
- // creates the ordinal translation for the locale given the 'key', 'num' and 'digit' arguments
- // and param passed in
- O(key interface{}, num float64, digits uint64, param string) (string, error)
-
- // creates the range translation for the locale given the 'key', 'num1', 'digit1', 'num2' and
- // 'digit2' arguments and 'param1' and 'param2' passed in
- R(key interface{}, num1 float64, digits1 uint64, num2 float64, digits2 uint64, param1, param2 string) (string, error)
-
- // VerifyTranslations checks to ensures that no plural rules have been
- // missed within the translations.
- VerifyTranslations() error
-}
-
-var _ Translator = new(translator)
-var _ locales.Translator = new(translator)
-
-type translator struct {
- locales.Translator
- translations map[interface{}]*transText
- cardinalTanslations map[interface{}][]*transText // array index is mapped to locales.PluralRule index + the locales.PluralRuleUnknown
- ordinalTanslations map[interface{}][]*transText
- rangeTanslations map[interface{}][]*transText
-}
-
-type transText struct {
- text string
- indexes []int
-}
-
-func newTranslator(trans locales.Translator) Translator {
- return &translator{
- Translator: trans,
- translations: make(map[interface{}]*transText), // translation text broken up by byte index
- cardinalTanslations: make(map[interface{}][]*transText),
- ordinalTanslations: make(map[interface{}][]*transText),
- rangeTanslations: make(map[interface{}][]*transText),
- }
-}
-
-// Add adds a normal translation for a particular language/locale
-// {#} is the only replacement type accepted and are ad infinitum
-// eg. one: '{0} day left' other: '{0} days left'
-func (t *translator) Add(key interface{}, text string, override bool) error {
-
- if _, ok := t.translations[key]; ok && !override {
- return &ErrConflictingTranslation{locale: t.Locale(), key: key, text: text}
- }
-
- lb := strings.Count(text, "{")
- rb := strings.Count(text, "}")
-
- if lb != rb {
- return &ErrMissingBracket{locale: t.Locale(), key: key, text: text}
- }
-
- trans := &transText{
- text: text,
- }
-
- var idx int
-
- for i := 0; i < lb; i++ {
- s := "{" + strconv.Itoa(i) + "}"
- idx = strings.Index(text, s)
- if idx == -1 {
- return &ErrBadParamSyntax{locale: t.Locale(), param: s, key: key, text: text}
- }
-
- trans.indexes = append(trans.indexes, idx)
- trans.indexes = append(trans.indexes, idx+len(s))
- }
-
- t.translations[key] = trans
-
- return nil
-}
-
-// AddCardinal adds a cardinal plural translation for a particular language/locale
-// {0} is the only replacement type accepted and only one variable is accepted as
-// multiple cannot be used for a plural rule determination, unless it is a range;
-// see AddRange below.
-// eg. in locale 'en' one: '{0} day left' other: '{0} days left'
-func (t *translator) AddCardinal(key interface{}, text string, rule locales.PluralRule, override bool) error {
-
- var verified bool
-
- // verify plural rule exists for locale
- for _, pr := range t.PluralsCardinal() {
- if pr == rule {
- verified = true
- break
- }
- }
-
- if !verified {
- return &ErrCardinalTranslation{text: fmt.Sprintf("error: cardinal plural rule '%s' does not exist for locale '%s' key: '%v' text: '%s'", rule, t.Locale(), key, text)}
- }
-
- tarr, ok := t.cardinalTanslations[key]
- if ok {
- // verify not adding a conflicting record
- if len(tarr) > 0 && tarr[rule] != nil && !override {
- return &ErrConflictingTranslation{locale: t.Locale(), key: key, rule: rule, text: text}
- }
-
- } else {
- tarr = make([]*transText, 7)
- t.cardinalTanslations[key] = tarr
- }
-
- trans := &transText{
- text: text,
- indexes: make([]int, 2),
- }
-
- tarr[rule] = trans
-
- idx := strings.Index(text, paramZero)
- if idx == -1 {
- tarr[rule] = nil
- return &ErrCardinalTranslation{text: fmt.Sprintf("error: parameter '%s' not found, may want to use 'Add' instead of 'AddCardinal'. locale: '%s' key: '%v' text: '%s'", paramZero, t.Locale(), key, text)}
- }
-
- trans.indexes[0] = idx
- trans.indexes[1] = idx + len(paramZero)
-
- return nil
-}
-
-// AddOrdinal adds an ordinal plural translation for a particular language/locale
-// {0} is the only replacement type accepted and only one variable is accepted as
-// multiple cannot be used for a plural rule determination, unless it is a range;
-// see AddRange below.
-// eg. in locale 'en' one: '{0}st day of spring' other: '{0}nd day of spring' - 1st, 2nd, 3rd...
-func (t *translator) AddOrdinal(key interface{}, text string, rule locales.PluralRule, override bool) error {
-
- var verified bool
-
- // verify plural rule exists for locale
- for _, pr := range t.PluralsOrdinal() {
- if pr == rule {
- verified = true
- break
- }
- }
-
- if !verified {
- return &ErrOrdinalTranslation{text: fmt.Sprintf("error: ordinal plural rule '%s' does not exist for locale '%s' key: '%v' text: '%s'", rule, t.Locale(), key, text)}
- }
-
- tarr, ok := t.ordinalTanslations[key]
- if ok {
- // verify not adding a conflicting record
- if len(tarr) > 0 && tarr[rule] != nil && !override {
- return &ErrConflictingTranslation{locale: t.Locale(), key: key, rule: rule, text: text}
- }
-
- } else {
- tarr = make([]*transText, 7)
- t.ordinalTanslations[key] = tarr
- }
-
- trans := &transText{
- text: text,
- indexes: make([]int, 2),
- }
-
- tarr[rule] = trans
-
- idx := strings.Index(text, paramZero)
- if idx == -1 {
- tarr[rule] = nil
- return &ErrOrdinalTranslation{text: fmt.Sprintf("error: parameter '%s' not found, may want to use 'Add' instead of 'AddOrdinal'. locale: '%s' key: '%v' text: '%s'", paramZero, t.Locale(), key, text)}
- }
-
- trans.indexes[0] = idx
- trans.indexes[1] = idx + len(paramZero)
-
- return nil
-}
-
-// AddRange adds a range plural translation for a particular language/locale
-// {0} and {1} are the only replacement types accepted and only these are accepted.
-// eg. in locale 'nl' one: '{0}-{1} day left' other: '{0}-{1} days left'
-func (t *translator) AddRange(key interface{}, text string, rule locales.PluralRule, override bool) error {
-
- var verified bool
-
- // verify plural rule exists for locale
- for _, pr := range t.PluralsRange() {
- if pr == rule {
- verified = true
- break
- }
- }
-
- if !verified {
- return &ErrRangeTranslation{text: fmt.Sprintf("error: range plural rule '%s' does not exist for locale '%s' key: '%v' text: '%s'", rule, t.Locale(), key, text)}
- }
-
- tarr, ok := t.rangeTanslations[key]
- if ok {
- // verify not adding a conflicting record
- if len(tarr) > 0 && tarr[rule] != nil && !override {
- return &ErrConflictingTranslation{locale: t.Locale(), key: key, rule: rule, text: text}
- }
-
- } else {
- tarr = make([]*transText, 7)
- t.rangeTanslations[key] = tarr
- }
-
- trans := &transText{
- text: text,
- indexes: make([]int, 4),
- }
-
- tarr[rule] = trans
-
- idx := strings.Index(text, paramZero)
- if idx == -1 {
- tarr[rule] = nil
- return &ErrRangeTranslation{text: fmt.Sprintf("error: parameter '%s' not found, are you sure you're adding a Range Translation? locale: '%s' key: '%v' text: '%s'", paramZero, t.Locale(), key, text)}
- }
-
- trans.indexes[0] = idx
- trans.indexes[1] = idx + len(paramZero)
-
- idx = strings.Index(text, paramOne)
- if idx == -1 {
- tarr[rule] = nil
- return &ErrRangeTranslation{text: fmt.Sprintf("error: parameter '%s' not found, a Range Translation requires two parameters. locale: '%s' key: '%v' text: '%s'", paramOne, t.Locale(), key, text)}
- }
-
- trans.indexes[2] = idx
- trans.indexes[3] = idx + len(paramOne)
-
- return nil
-}
-
-// T creates the translation for the locale given the 'key' and params passed in
-func (t *translator) T(key interface{}, params ...string) (string, error) {
-
- trans, ok := t.translations[key]
- if !ok {
- return unknownTranslation, ErrUnknowTranslation
- }
-
- b := make([]byte, 0, 64)
-
- var start, end, count int
-
- for i := 0; i < len(trans.indexes); i++ {
- end = trans.indexes[i]
- b = append(b, trans.text[start:end]...)
- b = append(b, params[count]...)
- i++
- start = trans.indexes[i]
- count++
- }
-
- b = append(b, trans.text[start:]...)
-
- return string(b), nil
-}
-
-// C creates the cardinal translation for the locale given the 'key', 'num' and 'digit' arguments and param passed in
-func (t *translator) C(key interface{}, num float64, digits uint64, param string) (string, error) {
-
- tarr, ok := t.cardinalTanslations[key]
- if !ok {
- return unknownTranslation, ErrUnknowTranslation
- }
-
- rule := t.CardinalPluralRule(num, digits)
-
- trans := tarr[rule]
-
- b := make([]byte, 0, 64)
- b = append(b, trans.text[:trans.indexes[0]]...)
- b = append(b, param...)
- b = append(b, trans.text[trans.indexes[1]:]...)
-
- return string(b), nil
-}
-
-// O creates the ordinal translation for the locale given the 'key', 'num' and 'digit' arguments and param passed in
-func (t *translator) O(key interface{}, num float64, digits uint64, param string) (string, error) {
-
- tarr, ok := t.ordinalTanslations[key]
- if !ok {
- return unknownTranslation, ErrUnknowTranslation
- }
-
- rule := t.OrdinalPluralRule(num, digits)
-
- trans := tarr[rule]
-
- b := make([]byte, 0, 64)
- b = append(b, trans.text[:trans.indexes[0]]...)
- b = append(b, param...)
- b = append(b, trans.text[trans.indexes[1]:]...)
-
- return string(b), nil
-}
-
-// R creates the range translation for the locale given the 'key', 'num1', 'digit1', 'num2' and 'digit2' arguments
-// and 'param1' and 'param2' passed in
-func (t *translator) R(key interface{}, num1 float64, digits1 uint64, num2 float64, digits2 uint64, param1, param2 string) (string, error) {
-
- tarr, ok := t.rangeTanslations[key]
- if !ok {
- return unknownTranslation, ErrUnknowTranslation
- }
-
- rule := t.RangePluralRule(num1, digits1, num2, digits2)
-
- trans := tarr[rule]
-
- b := make([]byte, 0, 64)
- b = append(b, trans.text[:trans.indexes[0]]...)
- b = append(b, param1...)
- b = append(b, trans.text[trans.indexes[1]:trans.indexes[2]]...)
- b = append(b, param2...)
- b = append(b, trans.text[trans.indexes[3]:]...)
-
- return string(b), nil
-}
-
-// VerifyTranslations checks to ensures that no plural rules have been
-// missed within the translations.
-func (t *translator) VerifyTranslations() error {
-
- for k, v := range t.cardinalTanslations {
-
- for _, rule := range t.PluralsCardinal() {
-
- if v[rule] == nil {
- return &ErrMissingPluralTranslation{locale: t.Locale(), translationType: "plural", rule: rule, key: k}
- }
- }
- }
-
- for k, v := range t.ordinalTanslations {
-
- for _, rule := range t.PluralsOrdinal() {
-
- if v[rule] == nil {
- return &ErrMissingPluralTranslation{locale: t.Locale(), translationType: "ordinal", rule: rule, key: k}
- }
- }
- }
-
- for k, v := range t.rangeTanslations {
-
- for _, rule := range t.PluralsRange() {
-
- if v[rule] == nil {
- return &ErrMissingPluralTranslation{locale: t.Locale(), translationType: "range", rule: rule, key: k}
- }
- }
- }
-
- return nil
-}
diff --git a/vendor/github.com/go-playground/universal-translator/universal_translator.go b/vendor/github.com/go-playground/universal-translator/universal_translator.go
deleted file mode 100644
index dbf707f5c..000000000
--- a/vendor/github.com/go-playground/universal-translator/universal_translator.go
+++ /dev/null
@@ -1,113 +0,0 @@
-package ut
-
-import (
- "strings"
-
- "github.com/go-playground/locales"
-)
-
-// UniversalTranslator holds all locale & translation data
-type UniversalTranslator struct {
- translators map[string]Translator
- fallback Translator
-}
-
-// New returns a new UniversalTranslator instance set with
-// the fallback locale and locales it should support
-func New(fallback locales.Translator, supportedLocales ...locales.Translator) *UniversalTranslator {
-
- t := &UniversalTranslator{
- translators: make(map[string]Translator),
- }
-
- for _, v := range supportedLocales {
-
- trans := newTranslator(v)
- t.translators[strings.ToLower(trans.Locale())] = trans
-
- if fallback.Locale() == v.Locale() {
- t.fallback = trans
- }
- }
-
- if t.fallback == nil && fallback != nil {
- t.fallback = newTranslator(fallback)
- }
-
- return t
-}
-
-// FindTranslator trys to find a Translator based on an array of locales
-// and returns the first one it can find, otherwise returns the
-// fallback translator.
-func (t *UniversalTranslator) FindTranslator(locales ...string) (trans Translator, found bool) {
-
- for _, locale := range locales {
-
- if trans, found = t.translators[strings.ToLower(locale)]; found {
- return
- }
- }
-
- return t.fallback, false
-}
-
-// GetTranslator returns the specified translator for the given locale,
-// or fallback if not found
-func (t *UniversalTranslator) GetTranslator(locale string) (trans Translator, found bool) {
-
- if trans, found = t.translators[strings.ToLower(locale)]; found {
- return
- }
-
- return t.fallback, false
-}
-
-// GetFallback returns the fallback locale
-func (t *UniversalTranslator) GetFallback() Translator {
- return t.fallback
-}
-
-// AddTranslator adds the supplied translator, if it already exists the override param
-// will be checked and if false an error will be returned, otherwise the translator will be
-// overridden; if the fallback matches the supplied translator it will be overridden as well
-// NOTE: this is normally only used when translator is embedded within a library
-func (t *UniversalTranslator) AddTranslator(translator locales.Translator, override bool) error {
-
- lc := strings.ToLower(translator.Locale())
- _, ok := t.translators[lc]
- if ok && !override {
- return &ErrExistingTranslator{locale: translator.Locale()}
- }
-
- trans := newTranslator(translator)
-
- if t.fallback.Locale() == translator.Locale() {
-
- // because it's optional to have a fallback, I don't impose that limitation
- // don't know why you wouldn't but...
- if !override {
- return &ErrExistingTranslator{locale: translator.Locale()}
- }
-
- t.fallback = trans
- }
-
- t.translators[lc] = trans
-
- return nil
-}
-
-// VerifyTranslations runs through all locales and identifies any issues
-// eg. missing plural rules for a locale
-func (t *UniversalTranslator) VerifyTranslations() (err error) {
-
- for _, trans := range t.translators {
- err = trans.VerifyTranslations()
- if err != nil {
- return
- }
- }
-
- return
-}
diff --git a/vendor/github.com/go-playground/validator/v10/.gitignore b/vendor/github.com/go-playground/validator/v10/.gitignore
deleted file mode 100644
index 6305e5290..000000000
--- a/vendor/github.com/go-playground/validator/v10/.gitignore
+++ /dev/null
@@ -1,32 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-bin
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
-*.test
-*.prof
-*.test
-*.out
-*.txt
-/**/*.DS_Store
-cover.html
-README.html
-.idea
diff --git a/vendor/github.com/go-playground/validator/v10/LICENSE b/vendor/github.com/go-playground/validator/v10/LICENSE
deleted file mode 100644
index 6a2ae9aa4..000000000
--- a/vendor/github.com/go-playground/validator/v10/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Dean Karn
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
diff --git a/vendor/github.com/go-playground/validator/v10/MAINTAINERS.md b/vendor/github.com/go-playground/validator/v10/MAINTAINERS.md
deleted file mode 100644
index b809c4ce1..000000000
--- a/vendor/github.com/go-playground/validator/v10/MAINTAINERS.md
+++ /dev/null
@@ -1,16 +0,0 @@
-## Maintainers Guide
-
-### Semantic Versioning
-Semantic versioning as defined [here](https://semver.org) must be strictly adhered to.
-
-### External Dependencies
-Any new external dependencies MUST:
-- Have a compatible LICENSE present.
-- Be actively maintained.
-- Be approved by @go-playground/admins
-
-### PR Merge Requirements
-- Up-to-date branch.
-- Passing tests and linting.
-- CODEOWNERS approval.
-- Tests that cover both the Happy and Unhappy paths. \ No newline at end of file
diff --git a/vendor/github.com/go-playground/validator/v10/Makefile b/vendor/github.com/go-playground/validator/v10/Makefile
deleted file mode 100644
index e097dfaf2..000000000
--- a/vendor/github.com/go-playground/validator/v10/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-GOCMD=go
-
-linters-install:
- @golangci-lint --version >/dev/null 2>&1 || { \
- echo "installing linting tools..."; \
- curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s v1.41.1; \
- }
-
-lint: linters-install
- golangci-lint run
-
-test:
- $(GOCMD) test -cover -race ./...
-
-bench:
- $(GOCMD) test -run=NONE -bench=. -benchmem ./...
-
-.PHONY: test lint linters-install
diff --git a/vendor/github.com/go-playground/validator/v10/README.md b/vendor/github.com/go-playground/validator/v10/README.md
deleted file mode 100644
index 25eadf026..000000000
--- a/vendor/github.com/go-playground/validator/v10/README.md
+++ /dev/null
@@ -1,379 +0,0 @@
-Package validator
-=================
-<img align="right" src="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.24.0-green.svg)
-[![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)
-[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator)
-[![GoDoc](https://godoc.org/github.com/go-playground/validator?status.svg)](https://pkg.go.dev/github.com/go-playground/validator/v10)
-![License](https://img.shields.io/dub/l/vibe-d.svg)
-
-Package validator implements value validations for structs and individual fields based on tags.
-
-It has the following **unique** features:
-
-- Cross Field and Cross Struct validations by using validation tags or custom validators.
-- Slice, Array and Map diving, which allows any or all levels of a multidimensional field to be validated.
-- Ability to dive into both map keys and values for validation
-- Handles type interface by determining it's underlying type prior to validation.
-- Handles custom field types such as sql driver Valuer see [Valuer](https://golang.org/src/database/sql/driver/types.go?s=1210:1293#L29)
-- Alias validation tags, which allows for mapping of several validations to a single tag for easier defining of validations on structs
-- Extraction of custom defined Field Name e.g. can specify to extract the JSON name while validating and have it available in the resulting FieldError
-- Customizable i18n aware error messages.
-- Default validator for the [gin](https://github.com/gin-gonic/gin) web framework; upgrading from v8 to v9 in gin see [here](https://github.com/go-playground/validator/tree/master/_examples/gin-upgrading-overriding)
-
-A Call for Maintainers
-----------------------
-
-Please read the discussiong started [here](https://github.com/go-playground/validator/discussions/1330) if you are interested in contributing/helping maintain this package.
-
-Installation
-------------
-
-Use go get.
-
- go get github.com/go-playground/validator/v10
-
-Then import the validator package into your own code.
-
- import "github.com/go-playground/validator/v10"
-
-Error Return Value
--------
-
-Validation functions return type error
-
-They return type error to avoid the issue discussed in the following, where err is always != nil:
-
-* http://stackoverflow.com/a/29138676/3158232
-* https://github.com/go-playground/validator/issues/134
-
-Validator returns only InvalidValidationError for bad validation input, nil or ValidationErrors as type error; so, in your code all you need to do is check if the error returned is not nil, and if it's not check if error is InvalidValidationError ( if necessary, most of the time it isn't ) type cast it to type ValidationErrors like so:
-
-```go
-err := validate.Struct(mystruct)
-validationErrors := err.(validator.ValidationErrors)
- ```
-
-Usage and documentation
-------
-
-Please see https://pkg.go.dev/github.com/go-playground/validator/v10 for detailed usage docs.
-
-##### Examples:
-
-- [Simple](https://github.com/go-playground/validator/blob/master/_examples/simple/main.go)
-- [Custom Field Types](https://github.com/go-playground/validator/blob/master/_examples/custom/main.go)
-- [Struct Level](https://github.com/go-playground/validator/blob/master/_examples/struct-level/main.go)
-- [Translations & Custom Errors](https://github.com/go-playground/validator/blob/master/_examples/translations/main.go)
-- [Gin upgrade and/or override validator](https://github.com/go-playground/validator/tree/v9/_examples/gin-upgrading-overriding)
-- [wash - an example application putting it all together](https://github.com/bluesuncorp/wash)
-
-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 | 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 |
-| gtfield | Field Greater Than Another Field |
-| ltcsfield | Less Than Another Relative Field |
-| ltecsfield | Less Than or Equal To Another Relative Field |
-| ltefield | Less Than or Equal To Another Field |
-| ltfield | Less Than Another Field |
-| necsfield | Field Does Not Equal Another Field (relative) |
-| nefield | Field Does Not Equal Another Field |
-
-### Network:
-
-| Tag | Description |
-| - | - |
-| cidr | Classless Inter-Domain Routing CIDR |
-| cidrv4 | Classless Inter-Domain Routing CIDRv4 |
-| cidrv6 | Classless Inter-Domain Routing CIDRv6 |
-| datauri | Data URL |
-| fqdn | Full Qualified Domain Name (FQDN) |
-| hostname | Hostname RFC 952 |
-| hostname_port | HostPort |
-| hostname_rfc1123 | Hostname RFC 1123 |
-| ip | Internet Protocol Address IP |
-| ip4_addr | Internet Protocol Address IPv4 |
-| ip6_addr | Internet Protocol Address IPv6 |
-| ip_addr | Internet Protocol Address IP |
-| ipv4 | Internet Protocol Address IPv4 |
-| ipv6 | Internet Protocol Address IPv6 |
-| mac | Media Access Control Address MAC |
-| tcp4_addr | Transmission Control Protocol Address TCPv4 |
-| tcp6_addr | Transmission Control Protocol Address TCPv6 |
-| tcp_addr | Transmission Control Protocol Address TCP |
-| udp4_addr | User Datagram Protocol Address UDPv4 |
-| udp6_addr | User Datagram Protocol Address UDPv6 |
-| udp_addr | User Datagram Protocol Address UDP |
-| 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 |
-
-### Strings:
-
-| Tag | Description |
-| - | - |
-| alpha | Alpha Only |
-| alphanum | Alphanumeric |
-| alphanumunicode | Alphanumeric Unicode |
-| alphaunicode | Alpha Unicode |
-| ascii | ASCII |
-| boolean | Boolean |
-| contains | Contains |
-| containsany | Contains Any |
-| containsrune | Contains Rune |
-| endsnotwith | Ends Not With |
-| endswith | Ends With |
-| excludes | Excludes |
-| excludesall | Excludes All |
-| excludesrune | Excludes Rune |
-| lowercase | Lowercase |
-| multibyte | Multi-Byte Characters |
-| number | Number |
-| numeric | Numeric |
-| printascii | Printable ASCII |
-| startsnotwith | Starts Not With |
-| startswith | Starts With |
-| uppercase | Uppercase |
-
-### Format:
-| Tag | Description |
-| - | - |
-| 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 |
-| mongodb_connection_string | MongoDB Connection String |
-| cron | Cron |
-| spicedb | SpiceDb ObjectID/Permission/Type |
-| datetime | Datetime |
-| e164 | e164 formatted phone number |
-| email | E-mail String
-| eth_addr | Ethereum Address |
-| hexadecimal | Hexadecimal String |
-| hexcolor | Hexcolor String |
-| hsl | HSL String |
-| hsla | HSLA String |
-| html | HTML Tags |
-| html_encoded | HTML Encoded |
-| isbn | International Standard Book Number |
-| isbn10 | International Standard Book Number 10 |
-| isbn13 | International Standard Book Number 13 |
-| issn | International Standard Serial Number |
-| iso3166_1_alpha2 | Two-letter country code (ISO 3166-1 alpha-2) |
-| iso3166_1_alpha3 | Three-letter country code (ISO 3166-1 alpha-3) |
-| iso3166_1_alpha_numeric | Numeric country code (ISO 3166-1 numeric) |
-| iso3166_2 | Country subdivision code (ISO 3166-2) |
-| iso4217 | Currency code (ISO 4217) |
-| json | JSON |
-| 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 |
-| rgba | RGBA String |
-| ssn | Social Security Number SSN |
-| timezone | Timezone |
-| uuid | Universally Unique Identifier UUID |
-| uuid3 | Universally Unique Identifier UUID v3 |
-| uuid3_rfc4122 | Universally Unique Identifier UUID v3 RFC4122 |
-| uuid4 | Universally Unique Identifier UUID v4 |
-| uuid4_rfc4122 | Universally Unique Identifier UUID v4 RFC4122 |
-| uuid5 | Universally Unique Identifier UUID v5 |
-| uuid5_rfc4122 | Universally Unique Identifier UUID v5 RFC4122 |
-| uuid_rfc4122 | Universally Unique Identifier UUID RFC4122 |
-| md4 | MD4 hash |
-| md5 | MD5 hash |
-| sha256 | SHA256 hash |
-| sha384 | SHA384 hash |
-| sha512 | SHA512 hash |
-| ripemd128 | RIPEMD-128 hash |
-| ripemd128 | RIPEMD-160 hash |
-| tiger128 | TIGER128 hash |
-| tiger160 | TIGER160 hash |
-| 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 | Existing Directory |
-| dirpath | Directory Path |
-| file | Existing File |
-| filepath | File Path |
-| image | Image |
-| isdefault | Is Default |
-| len | Length |
-| max | Maximum |
-| min | Minimum |
-| oneof | One Of |
-| required | Required |
-| required_if | Required If |
-| required_unless | Required Unless |
-| required_with | Required With |
-| required_with_all | Required With All |
-| required_without | Required Without |
-| required_without_all | Required Without All |
-| excluded_if | Excluded If |
-| excluded_unless | Excluded Unless |
-| excluded_with | Excluded With |
-| excluded_with_all | Excluded With All |
-| excluded_without | Excluded Without |
-| excluded_without_all | Excluded Without All |
-| unique | Unique |
-
-#### Aliases:
-| Tag | Description |
-| - | - |
-| iscolor | hexcolor\|rgb\|rgba\|hsl\|hsla |
-| country_code | iso3166_1_alpha2\|iso3166_1_alpha3\|iso3166_1_alpha_numeric |
-
-Benchmarks
-------
-###### Run on MacBook Pro Max M3
-```go
-go version go1.23.3 darwin/arm64
-goos: darwin
-goarch: arm64
-cpu: Apple M3 Max
-pkg: github.com/go-playground/validator/v10
-BenchmarkFieldSuccess-16 42461943 27.88 ns/op 0 B/op 0 allocs/op
-BenchmarkFieldSuccessParallel-16 486632887 2.289 ns/op 0 B/op 0 allocs/op
-BenchmarkFieldFailure-16 9566167 121.3 ns/op 200 B/op 4 allocs/op
-BenchmarkFieldFailureParallel-16 17551471 83.68 ns/op 200 B/op 4 allocs/op
-BenchmarkFieldArrayDiveSuccess-16 7602306 155.6 ns/op 97 B/op 5 allocs/op
-BenchmarkFieldArrayDiveSuccessParallel-16 20664610 59.80 ns/op 97 B/op 5 allocs/op
-BenchmarkFieldArrayDiveFailure-16 4659756 252.9 ns/op 301 B/op 10 allocs/op
-BenchmarkFieldArrayDiveFailureParallel-16 8010116 152.9 ns/op 301 B/op 10 allocs/op
-BenchmarkFieldMapDiveSuccess-16 2834575 421.2 ns/op 288 B/op 14 allocs/op
-BenchmarkFieldMapDiveSuccessParallel-16 7179700 171.8 ns/op 288 B/op 14 allocs/op
-BenchmarkFieldMapDiveFailure-16 3081728 384.4 ns/op 376 B/op 13 allocs/op
-BenchmarkFieldMapDiveFailureParallel-16 6058137 204.0 ns/op 377 B/op 13 allocs/op
-BenchmarkFieldMapDiveWithKeysSuccess-16 2544975 464.8 ns/op 288 B/op 14 allocs/op
-BenchmarkFieldMapDiveWithKeysSuccessParallel-16 6661954 181.4 ns/op 288 B/op 14 allocs/op
-BenchmarkFieldMapDiveWithKeysFailure-16 2435484 490.7 ns/op 553 B/op 16 allocs/op
-BenchmarkFieldMapDiveWithKeysFailureParallel-16 4249617 282.0 ns/op 554 B/op 16 allocs/op
-BenchmarkFieldCustomTypeSuccess-16 14943525 77.35 ns/op 32 B/op 2 allocs/op
-BenchmarkFieldCustomTypeSuccessParallel-16 64051954 20.61 ns/op 32 B/op 2 allocs/op
-BenchmarkFieldCustomTypeFailure-16 10721384 107.1 ns/op 184 B/op 3 allocs/op
-BenchmarkFieldCustomTypeFailureParallel-16 18714495 69.77 ns/op 184 B/op 3 allocs/op
-BenchmarkFieldOrTagSuccess-16 4063124 294.3 ns/op 16 B/op 1 allocs/op
-BenchmarkFieldOrTagSuccessParallel-16 31903756 41.22 ns/op 18 B/op 1 allocs/op
-BenchmarkFieldOrTagFailure-16 7748558 146.8 ns/op 216 B/op 5 allocs/op
-BenchmarkFieldOrTagFailureParallel-16 13139854 92.05 ns/op 216 B/op 5 allocs/op
-BenchmarkStructLevelValidationSuccess-16 16808389 70.25 ns/op 16 B/op 1 allocs/op
-BenchmarkStructLevelValidationSuccessParallel-16 90686955 14.47 ns/op 16 B/op 1 allocs/op
-BenchmarkStructLevelValidationFailure-16 5818791 200.2 ns/op 264 B/op 7 allocs/op
-BenchmarkStructLevelValidationFailureParallel-16 11115874 107.5 ns/op 264 B/op 7 allocs/op
-BenchmarkStructSimpleCustomTypeSuccess-16 7764956 151.9 ns/op 32 B/op 2 allocs/op
-BenchmarkStructSimpleCustomTypeSuccessParallel-16 52316265 30.37 ns/op 32 B/op 2 allocs/op
-BenchmarkStructSimpleCustomTypeFailure-16 4195429 277.2 ns/op 416 B/op 9 allocs/op
-BenchmarkStructSimpleCustomTypeFailureParallel-16 7305661 164.6 ns/op 432 B/op 10 allocs/op
-BenchmarkStructFilteredSuccess-16 6312625 186.1 ns/op 216 B/op 5 allocs/op
-BenchmarkStructFilteredSuccessParallel-16 13684459 93.42 ns/op 216 B/op 5 allocs/op
-BenchmarkStructFilteredFailure-16 6751482 171.2 ns/op 216 B/op 5 allocs/op
-BenchmarkStructFilteredFailureParallel-16 14146070 86.93 ns/op 216 B/op 5 allocs/op
-BenchmarkStructPartialSuccess-16 6544448 177.3 ns/op 224 B/op 4 allocs/op
-BenchmarkStructPartialSuccessParallel-16 13951946 88.73 ns/op 224 B/op 4 allocs/op
-BenchmarkStructPartialFailure-16 4075833 287.5 ns/op 440 B/op 9 allocs/op
-BenchmarkStructPartialFailureParallel-16 7490805 161.3 ns/op 440 B/op 9 allocs/op
-BenchmarkStructExceptSuccess-16 4107187 281.4 ns/op 424 B/op 8 allocs/op
-BenchmarkStructExceptSuccessParallel-16 15979173 80.86 ns/op 208 B/op 3 allocs/op
-BenchmarkStructExceptFailure-16 4434372 264.3 ns/op 424 B/op 8 allocs/op
-BenchmarkStructExceptFailureParallel-16 8081367 154.1 ns/op 424 B/op 8 allocs/op
-BenchmarkStructSimpleCrossFieldSuccess-16 6459542 183.4 ns/op 56 B/op 3 allocs/op
-BenchmarkStructSimpleCrossFieldSuccessParallel-16 41013781 37.95 ns/op 56 B/op 3 allocs/op
-BenchmarkStructSimpleCrossFieldFailure-16 4034998 292.1 ns/op 272 B/op 8 allocs/op
-BenchmarkStructSimpleCrossFieldFailureParallel-16 11348446 115.3 ns/op 272 B/op 8 allocs/op
-BenchmarkStructSimpleCrossStructCrossFieldSuccess-16 4448528 267.7 ns/op 64 B/op 4 allocs/op
-BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-16 26813619 48.33 ns/op 64 B/op 4 allocs/op
-BenchmarkStructSimpleCrossStructCrossFieldFailure-16 3090646 384.5 ns/op 288 B/op 9 allocs/op
-BenchmarkStructSimpleCrossStructCrossFieldFailureParallel-16 9870906 129.5 ns/op 288 B/op 9 allocs/op
-BenchmarkStructSimpleSuccess-16 10675562 109.5 ns/op 0 B/op 0 allocs/op
-BenchmarkStructSimpleSuccessParallel-16 131159784 8.932 ns/op 0 B/op 0 allocs/op
-BenchmarkStructSimpleFailure-16 4094979 286.6 ns/op 416 B/op 9 allocs/op
-BenchmarkStructSimpleFailureParallel-16 7606663 157.9 ns/op 416 B/op 9 allocs/op
-BenchmarkStructComplexSuccess-16 2073470 576.0 ns/op 224 B/op 5 allocs/op
-BenchmarkStructComplexSuccessParallel-16 7821831 161.3 ns/op 224 B/op 5 allocs/op
-BenchmarkStructComplexFailure-16 576358 2001 ns/op 3042 B/op 48 allocs/op
-BenchmarkStructComplexFailureParallel-16 1000000 1171 ns/op 3041 B/op 48 allocs/op
-BenchmarkOneof-16 22503973 52.82 ns/op 0 B/op 0 allocs/op
-BenchmarkOneofParallel-16 8538474 140.4 ns/op 0 B/op 0 allocs/op
-```
-
-Complementary Software
-----------------------
-
-Here is a list of software that complements using this library either pre or post validation.
-
-* [form](https://github.com/go-playground/form) - Decodes url.Values into Go value(s) and Encodes Go value(s) into url.Values. Dual Array and Full map support.
-* [mold](https://github.com/go-playground/mold) - A general library to help modify or set data within data structures and other objects
-
-How to Contribute
-------
-
-Make a pull request...
-
-Maintenance and support for SDK major versions
-----------------------------------------------
-
-See prior discussion [here](https://github.com/go-playground/validator/discussions/1342) for more details.
-
-This package is aligned with the [Go release policy](https://go.dev/doc/devel/release) in that support is guaranteed for
-the two most recent major versions.
-
-This does not mean the package will not work with older versions of Go, only that we reserve the right to increase the
-MSGV(Minimum Supported Go Version) when the need arises to address Security issues/patches, OS issues & support or newly
-introduced functionality that would greatly benefit the maintenance and/or usage of this package.
-
-If and when the MSGV is increased it will be done so in a minimum of a `Minor` release bump.
-
-License
--------
-Distributed under MIT License, please see license file within the code for more details.
-
-Maintainers
------------
-This project has grown large enough that more than one person is required to properly support the community.
-If you are interested in becoming a maintainer please reach out to me https://github.com/deankarn
diff --git a/vendor/github.com/go-playground/validator/v10/baked_in.go b/vendor/github.com/go-playground/validator/v10/baked_in.go
deleted file mode 100644
index 2f66c1836..000000000
--- a/vendor/github.com/go-playground/validator/v10/baked_in.go
+++ /dev/null
@@ -1,3046 +0,0 @@
-package validator
-
-import (
- "bytes"
- "context"
- "crypto/sha256"
- "encoding/hex"
- "encoding/json"
- "fmt"
- "io/fs"
- "net"
- "net/url"
- "os"
- "reflect"
- "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"
-)
-
-// Func accepts a FieldLevel interface for all validation needs. The return
-// value should be true when validation succeeds.
-type Func func(fl FieldLevel) bool
-
-// FuncCtx accepts a context.Context and FieldLevel interface for all
-// validation needs. The return value should be true when validation succeeds.
-type FuncCtx func(ctx context.Context, fl FieldLevel) bool
-
-// 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.
- }
- return func(ctx context.Context, fl FieldLevel) bool {
- return fn(fl)
- }
-}
-
-var (
- restrictedTags = map[string]struct{}{
- diveTag: {},
- keysTag: {},
- endKeysTag: {},
- structOnlyTag: {},
- omitempty: {},
- omitnil: {},
- skipValidationTag: {},
- utf8HexComma: {},
- utf8Pipe: {},
- noStructLevelTag: {},
- requiredTag: {},
- isdefault: {},
- }
-
- // bakedInAliases is a default mapping of a single validation tag that
- // defines a common or complex set of validation(s) to simplify
- // adding validation to structs.
- bakedInAliases = map[string]string{
- "iscolor": "hexcolor|rgb|rgba|hsl|hsla",
- "country_code": "iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric",
- "eu_country_code": "iso3166_1_alpha2_eu|iso3166_1_alpha3_eu|iso3166_1_alpha_numeric_eu",
- }
-
- // bakedInValidators is the default map of ValidationFunc
- // you can add, remove or even replace items to suite your needs,
- // or even disregard and use your own map if so desired.
- bakedInValidators = map[string]Func{
- "required": hasValue,
- "required_if": requiredIf,
- "required_unless": requiredUnless,
- "skip_unless": skipUnless,
- "required_with": requiredWith,
- "required_with_all": requiredWithAll,
- "required_without": requiredWithout,
- "required_without_all": requiredWithoutAll,
- "excluded_if": excludedIf,
- "excluded_unless": excludedUnless,
- "excluded_with": excludedWith,
- "excluded_with_all": excludedWithAll,
- "excluded_without": excludedWithout,
- "excluded_without_all": excludedWithoutAll,
- "isdefault": isDefault,
- "len": hasLengthOf,
- "min": hasMinOf,
- "max": hasMaxOf,
- "eq": isEq,
- "eq_ignore_case": isEqIgnoreCase,
- "ne": isNe,
- "ne_ignore_case": isNeIgnoreCase,
- "lt": isLt,
- "lte": isLte,
- "gt": isGt,
- "gte": isGte,
- "eqfield": isEqField,
- "eqcsfield": isEqCrossStructField,
- "necsfield": isNeCrossStructField,
- "gtcsfield": isGtCrossStructField,
- "gtecsfield": isGteCrossStructField,
- "ltcsfield": isLtCrossStructField,
- "ltecsfield": isLteCrossStructField,
- "nefield": isNeField,
- "gtefield": isGteField,
- "gtfield": isGtField,
- "ltefield": isLteField,
- "ltfield": isLtField,
- "fieldcontains": fieldContains,
- "fieldexcludes": fieldExcludes,
- "alpha": isAlpha,
- "alphanum": isAlphanum,
- "alphaunicode": isAlphaUnicode,
- "alphanumunicode": isAlphanumUnicode,
- "boolean": isBoolean,
- "numeric": isNumeric,
- "number": isNumber,
- "hexadecimal": isHexadecimal,
- "hexcolor": isHEXColor,
- "rgb": isRGB,
- "rgba": isRGBA,
- "hsl": isHSL,
- "hsla": isHSLA,
- "e164": isE164,
- "email": isEmail,
- "url": isURL,
- "http_url": isHttpURL,
- "uri": isURI,
- "urn_rfc2141": isUrnRFC2141, // RFC 2141
- "file": isFile,
- "filepath": isFilePath,
- "base32": isBase32,
- "base64": isBase64,
- "base64url": isBase64URL,
- "base64rawurl": isBase64RawURL,
- "contains": contains,
- "containsany": containsAny,
- "containsrune": containsRune,
- "excludes": excludes,
- "excludesall": excludesAll,
- "excludesrune": excludesRune,
- "startswith": startsWith,
- "endswith": endsWith,
- "startsnotwith": startsNotWith,
- "endsnotwith": endsNotWith,
- "image": isImage,
- "isbn": isISBN,
- "isbn10": isISBN10,
- "isbn13": isISBN13,
- "issn": isISSN,
- "eth_addr": isEthereumAddress,
- "eth_addr_checksum": isEthereumAddressChecksum,
- "btc_addr": isBitcoinAddress,
- "btc_addr_bech32": isBitcoinBech32Address,
- "uuid": isUUID,
- "uuid3": isUUID3,
- "uuid4": isUUID4,
- "uuid5": isUUID5,
- "uuid_rfc4122": isUUIDRFC4122,
- "uuid3_rfc4122": isUUID3RFC4122,
- "uuid4_rfc4122": isUUID4RFC4122,
- "uuid5_rfc4122": isUUID5RFC4122,
- "ulid": isULID,
- "md4": isMD4,
- "md5": isMD5,
- "sha256": isSHA256,
- "sha384": isSHA384,
- "sha512": isSHA512,
- "ripemd128": isRIPEMD128,
- "ripemd160": isRIPEMD160,
- "tiger128": isTIGER128,
- "tiger160": isTIGER160,
- "tiger192": isTIGER192,
- "ascii": isASCII,
- "printascii": isPrintableASCII,
- "multibyte": hasMultiByteCharacter,
- "datauri": isDataURI,
- "latitude": isLatitude,
- "longitude": isLongitude,
- "ssn": isSSN,
- "ipv4": isIPv4,
- "ipv6": isIPv6,
- "ip": isIP,
- "cidrv4": isCIDRv4,
- "cidrv6": isCIDRv6,
- "cidr": isCIDR,
- "tcp4_addr": isTCP4AddrResolvable,
- "tcp6_addr": isTCP6AddrResolvable,
- "tcp_addr": isTCPAddrResolvable,
- "udp4_addr": isUDP4AddrResolvable,
- "udp6_addr": isUDP6AddrResolvable,
- "udp_addr": isUDPAddrResolvable,
- "ip4_addr": isIP4AddrResolvable,
- "ip6_addr": isIP6AddrResolvable,
- "ip_addr": isIPAddrResolvable,
- "unix_addr": isUnixAddrResolvable,
- "mac": isMAC,
- "hostname": isHostnameRFC952, // RFC 952
- "hostname_rfc1123": isHostnameRFC1123, // RFC 1123
- "fqdn": isFQDN,
- "unique": isUnique,
- "oneof": isOneOf,
- "oneofci": isOneOfCI,
- "html": isHTML,
- "html_encoded": isHTMLEncoded,
- "url_encoded": isURLEncoded,
- "dir": isDir,
- "dirpath": isDirPath,
- "json": isJSON,
- "jwt": isJWT,
- "hostname_port": isHostnamePort,
- "port": isPort,
- "lowercase": isLowercase,
- "uppercase": isUppercase,
- "datetime": isDatetime,
- "timezone": isTimeZone,
- "iso3166_1_alpha2": isIso3166Alpha2,
- "iso3166_1_alpha2_eu": isIso3166Alpha2EU,
- "iso3166_1_alpha3": isIso3166Alpha3,
- "iso3166_1_alpha3_eu": isIso3166Alpha3EU,
- "iso3166_1_alpha_numeric": isIso3166AlphaNumeric,
- "iso3166_1_alpha_numeric_eu": isIso3166AlphaNumericEU,
- "iso3166_2": isIso31662,
- "iso4217": isIso4217,
- "iso4217_numeric": isIso4217Numeric,
- "bcp47_language_tag": isBCP47LanguageTag,
- "postcode_iso3166_alpha2": isPostcodeByIso3166Alpha2,
- "postcode_iso3166_alpha2_field": isPostcodeByIso3166Alpha2Field,
- "bic": isIsoBicFormat,
- "semver": isSemverFormat,
- "dns_rfc1035_label": isDnsRFC1035LabelFormat,
- "credit_card": isCreditCard,
- "cve": isCveFormat,
- "luhn_checksum": hasLuhnChecksum,
- "mongodb": isMongoDBObjectId,
- "mongodb_connection_string": isMongoDBConnectionString,
- "cron": isCron,
- "spicedb": isSpiceDB,
- }
-)
-
-var (
- oneofValsCache = map[string][]string{}
- oneofValsCacheRWLock = sync.RWMutex{}
-)
-
-func parseOneOfParam2(s string) []string {
- oneofValsCacheRWLock.RLock()
- vals, ok := oneofValsCache[s]
- oneofValsCacheRWLock.RUnlock()
- if !ok {
- oneofValsCacheRWLock.Lock()
- vals = splitParamsRegex().FindAllString(s, -1)
- for i := 0; i < len(vals); i++ {
- vals[i] = strings.Replace(vals[i], "'", "", -1)
- }
- oneofValsCache[s] = vals
- oneofValsCacheRWLock.Unlock()
- }
- return vals
-}
-
-func isURLEncoded(fl FieldLevel) bool {
- return uRLEncodedRegex().MatchString(fl.Field().String())
-}
-
-func isHTMLEncoded(fl FieldLevel) bool {
- return hTMLEncodedRegex().MatchString(fl.Field().String())
-}
-
-func isHTML(fl FieldLevel) bool {
- return hTMLRegex().MatchString(fl.Field().String())
-}
-
-func isOneOf(fl FieldLevel) bool {
- vals := parseOneOfParam2(fl.Param())
-
- field := fl.Field()
-
- var v string
- switch field.Kind() {
- case reflect.String:
- v = field.String()
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- v = strconv.FormatInt(field.Int(), 10)
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- v = strconv.FormatUint(field.Uint(), 10)
- default:
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
- }
- for i := 0; i < len(vals); i++ {
- if vals[i] == v {
- return true
- }
- }
- return false
-}
-
-// isOneOfCI is the validation function for validating if the current field's value is one of the provided string values (case insensitive).
-func isOneOfCI(fl FieldLevel) bool {
- vals := parseOneOfParam2(fl.Param())
- field := fl.Field()
-
- if field.Kind() != reflect.String {
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
- }
- v := field.String()
- for _, val := range vals {
- if strings.EqualFold(val, v) {
- return true
- }
- }
- return false
-}
-
-// isUnique is the validation function for validating if each array|slice|map value is unique
-func isUnique(fl FieldLevel) bool {
- field := fl.Field()
- param := fl.Param()
- v := reflect.ValueOf(struct{}{})
-
- switch field.Kind() {
- case reflect.Slice, reflect.Array:
- elem := field.Type().Elem()
- if elem.Kind() == reflect.Ptr {
- elem = elem.Elem()
- }
-
- if param == "" {
- m := reflect.MakeMap(reflect.MapOf(elem, v.Type()))
-
- for i := 0; i < field.Len(); i++ {
- m.SetMapIndex(reflect.Indirect(field.Index(i)), v)
- }
- return field.Len() == m.Len()
- }
-
- sf, ok := elem.FieldByName(param)
- if !ok {
- panic(fmt.Sprintf("Bad field name %s", param))
- }
-
- sfTyp := sf.Type
- if sfTyp.Kind() == reflect.Ptr {
- sfTyp = sfTyp.Elem()
- }
-
- m := reflect.MakeMap(reflect.MapOf(sfTyp, v.Type()))
- var fieldlen int
- for i := 0; i < field.Len(); i++ {
- key := reflect.Indirect(reflect.Indirect(field.Index(i)).FieldByName(param))
- if key.IsValid() {
- fieldlen++
- m.SetMapIndex(key, v)
- }
- }
- return fieldlen == m.Len()
- case reflect.Map:
- 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(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()))
- }
-}
-
-// isMAC is the validation function for validating if the field's value is a valid MAC address.
-func isMAC(fl FieldLevel) bool {
- _, err := net.ParseMAC(fl.Field().String())
-
- return err == nil
-}
-
-// isCIDRv4 is the validation function for validating if the field's value is a valid v4 CIDR address.
-func isCIDRv4(fl FieldLevel) bool {
- ip, net, err := net.ParseCIDR(fl.Field().String())
-
- return err == nil && ip.To4() != nil && net.IP.Equal(ip)
-}
-
-// isCIDRv6 is the validation function for validating if the field's value is a valid v6 CIDR address.
-func isCIDRv6(fl FieldLevel) bool {
- ip, _, err := net.ParseCIDR(fl.Field().String())
-
- return err == nil && ip.To4() == nil
-}
-
-// isCIDR is the validation function for validating if the field's value is a valid v4 or v6 CIDR address.
-func isCIDR(fl FieldLevel) bool {
- _, _, err := net.ParseCIDR(fl.Field().String())
-
- return err == nil
-}
-
-// isIPv4 is the validation function for validating if a value is a valid v4 IP address.
-func isIPv4(fl FieldLevel) bool {
- ip := net.ParseIP(fl.Field().String())
-
- return ip != nil && ip.To4() != nil
-}
-
-// isIPv6 is the validation function for validating if the field's value is a valid v6 IP address.
-func isIPv6(fl FieldLevel) bool {
- ip := net.ParseIP(fl.Field().String())
-
- return ip != nil && ip.To4() == nil
-}
-
-// isIP is the validation function for validating if the field's value is a valid v4 or v6 IP address.
-func isIP(fl FieldLevel) bool {
- ip := net.ParseIP(fl.Field().String())
-
- return ip != nil
-}
-
-// isSSN is the validation function for validating if the field's value is a valid SSN.
-func isSSN(fl FieldLevel) bool {
- field := fl.Field()
-
- if field.Len() != 11 {
- return false
- }
-
- return sSNRegex().MatchString(field.String())
-}
-
-// isLongitude is the validation function for validating if the field's value is a valid longitude coordinate.
-func isLongitude(fl FieldLevel) bool {
- field := fl.Field()
-
- var v string
- switch field.Kind() {
- case reflect.String:
- v = field.String()
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- v = strconv.FormatInt(field.Int(), 10)
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- v = strconv.FormatUint(field.Uint(), 10)
- case reflect.Float32:
- v = strconv.FormatFloat(field.Float(), 'f', -1, 32)
- case reflect.Float64:
- v = strconv.FormatFloat(field.Float(), 'f', -1, 64)
- default:
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
- }
-
- return longitudeRegex().MatchString(v)
-}
-
-// isLatitude is the validation function for validating if the field's value is a valid latitude coordinate.
-func isLatitude(fl FieldLevel) bool {
- field := fl.Field()
-
- var v string
- switch field.Kind() {
- case reflect.String:
- v = field.String()
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- v = strconv.FormatInt(field.Int(), 10)
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- v = strconv.FormatUint(field.Uint(), 10)
- case reflect.Float32:
- v = strconv.FormatFloat(field.Float(), 'f', -1, 32)
- case reflect.Float64:
- v = strconv.FormatFloat(field.Float(), 'f', -1, 64)
- default:
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
- }
-
- return latitudeRegex().MatchString(v)
-}
-
-// isDataURI is the validation function for validating if the field's value is a valid data URI.
-func isDataURI(fl FieldLevel) bool {
- uri := strings.SplitN(fl.Field().String(), ",", 2)
-
- if len(uri) != 2 {
- return false
- }
-
- if !dataURIRegex().MatchString(uri[0]) {
- return false
- }
-
- return base64Regex().MatchString(uri[1])
-}
-
-// hasMultiByteCharacter is the validation function for validating if the field's value has a multi byte character.
-func hasMultiByteCharacter(fl FieldLevel) bool {
- field := fl.Field()
-
- if field.Len() == 0 {
- return true
- }
-
- return multibyteRegex().MatchString(field.String())
-}
-
-// isPrintableASCII is the validation function for validating if the field's value is a valid printable ASCII character.
-func isPrintableASCII(fl FieldLevel) bool {
- return printableASCIIRegex().MatchString(fl.Field().String())
-}
-
-// isASCII is the validation function for validating if the field's value is a valid ASCII character.
-func isASCII(fl FieldLevel) bool {
- return aSCIIRegex().MatchString(fl.Field().String())
-}
-
-// isUUID5 is the validation function for validating if the field's value is a valid v5 UUID.
-func isUUID5(fl FieldLevel) bool {
- return fieldMatchesRegexByStringerValOrString(uUID5Regex, fl)
-}
-
-// isUUID4 is the validation function for validating if the field's value is a valid v4 UUID.
-func isUUID4(fl FieldLevel) bool {
- return fieldMatchesRegexByStringerValOrString(uUID4Regex, fl)
-}
-
-// isUUID3 is the validation function for validating if the field's value is a valid v3 UUID.
-func isUUID3(fl FieldLevel) bool {
- return fieldMatchesRegexByStringerValOrString(uUID3Regex, fl)
-}
-
-// isUUID is the validation function for validating if the field's value is a valid UUID of any version.
-func isUUID(fl FieldLevel) bool {
- return fieldMatchesRegexByStringerValOrString(uUIDRegex, fl)
-}
-
-// isUUID5RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v5 UUID.
-func isUUID5RFC4122(fl FieldLevel) bool {
- return fieldMatchesRegexByStringerValOrString(uUID5RFC4122Regex, fl)
-}
-
-// isUUID4RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v4 UUID.
-func isUUID4RFC4122(fl FieldLevel) bool {
- return fieldMatchesRegexByStringerValOrString(uUID4RFC4122Regex, fl)
-}
-
-// isUUID3RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v3 UUID.
-func isUUID3RFC4122(fl FieldLevel) bool {
- return fieldMatchesRegexByStringerValOrString(uUID3RFC4122Regex, fl)
-}
-
-// isUUIDRFC4122 is the validation function for validating if the field's value is a valid RFC4122 UUID of any version.
-func isUUIDRFC4122(fl FieldLevel) bool {
- return fieldMatchesRegexByStringerValOrString(uUIDRFC4122Regex, fl)
-}
-
-// isULID is the validation function for validating if the field's value is a valid ULID.
-func isULID(fl FieldLevel) bool {
- return fieldMatchesRegexByStringerValOrString(uLIDRegex, fl)
-}
-
-// isMD4 is the validation function for validating if the field's value is a valid MD4.
-func isMD4(fl FieldLevel) bool {
- return md4Regex().MatchString(fl.Field().String())
-}
-
-// isMD5 is the validation function for validating if the field's value is a valid MD5.
-func isMD5(fl FieldLevel) bool {
- return md5Regex().MatchString(fl.Field().String())
-}
-
-// isSHA256 is the validation function for validating if the field's value is a valid SHA256.
-func isSHA256(fl FieldLevel) bool {
- return sha256Regex().MatchString(fl.Field().String())
-}
-
-// isSHA384 is the validation function for validating if the field's value is a valid SHA384.
-func isSHA384(fl FieldLevel) bool {
- return sha384Regex().MatchString(fl.Field().String())
-}
-
-// isSHA512 is the validation function for validating if the field's value is a valid SHA512.
-func isSHA512(fl FieldLevel) bool {
- return sha512Regex().MatchString(fl.Field().String())
-}
-
-// isRIPEMD128 is the validation function for validating if the field's value is a valid PIPEMD128.
-func isRIPEMD128(fl FieldLevel) bool {
- return ripemd128Regex().MatchString(fl.Field().String())
-}
-
-// isRIPEMD160 is the validation function for validating if the field's value is a valid PIPEMD160.
-func isRIPEMD160(fl FieldLevel) bool {
- return ripemd160Regex().MatchString(fl.Field().String())
-}
-
-// isTIGER128 is the validation function for validating if the field's value is a valid TIGER128.
-func isTIGER128(fl FieldLevel) bool {
- return tiger128Regex().MatchString(fl.Field().String())
-}
-
-// isTIGER160 is the validation function for validating if the field's value is a valid TIGER160.
-func isTIGER160(fl FieldLevel) bool {
- return tiger160Regex().MatchString(fl.Field().String())
-}
-
-// isTIGER192 is the validation function for validating if the field's value is a valid isTIGER192.
-func isTIGER192(fl FieldLevel) bool {
- return tiger192Regex().MatchString(fl.Field().String())
-}
-
-// isISBN is the validation function for validating if the field's value is a valid v10 or v13 ISBN.
-func isISBN(fl FieldLevel) bool {
- return isISBN10(fl) || isISBN13(fl)
-}
-
-// isISBN13 is the validation function for validating if the field's value is a valid v13 ISBN.
-func isISBN13(fl FieldLevel) bool {
- s := strings.Replace(strings.Replace(fl.Field().String(), "-", "", 4), " ", "", 4)
-
- if !iSBN13Regex().MatchString(s) {
- return false
- }
-
- var checksum int32
- var i int32
-
- factor := []int32{1, 3}
-
- for i = 0; i < 12; i++ {
- checksum += factor[i%2] * int32(s[i]-'0')
- }
-
- return (int32(s[12]-'0'))-((10-(checksum%10))%10) == 0
-}
-
-// isISBN10 is the validation function for validating if the field's value is a valid v10 ISBN.
-func isISBN10(fl FieldLevel) bool {
- s := strings.Replace(strings.Replace(fl.Field().String(), "-", "", 3), " ", "", 3)
-
- if !iSBN10Regex().MatchString(s) {
- return false
- }
-
- var checksum int32
- var i int32
-
- for i = 0; i < 9; i++ {
- checksum += (i + 1) * int32(s[i]-'0')
- }
-
- if s[9] == 'X' {
- checksum += 10 * 10
- } else {
- checksum += 10 * int32(s[9]-'0')
- }
-
- return checksum%11 == 0
-}
-
-// isISSN is the validation function for validating if the field's value is a valid ISSN.
-func isISSN(fl FieldLevel) bool {
- s := fl.Field().String()
-
- if !iSSNRegex().MatchString(s) {
- return false
- }
- s = strings.ReplaceAll(s, "-", "")
-
- pos := 8
- checksum := 0
-
- for i := 0; i < 7; i++ {
- checksum += pos * int(s[i]-'0')
- pos--
- }
-
- if s[7] == 'X' {
- checksum += 10
- } else {
- checksum += int(s[7] - '0')
- }
-
- return checksum%11 == 0
-}
-
-// isEthereumAddress is the validation function for validating if the field's value is a valid Ethereum address.
-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 checksummed Ethereum address.
-func isEthereumAddressChecksum(fl FieldLevel) bool {
- address := fl.Field().String()
-
- if !ethAddressRegex().MatchString(address) {
- return false
- }
- // Checksum validation. Reference: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md
- address = address[2:] // Skip "0x" prefix.
- h := sha3.NewLegacyKeccak256()
- // hash.Hash's io.Writer implementation says it never returns an error. https://golang.org/pkg/hash/#Hash
- _, _ = h.Write([]byte(strings.ToLower(address)))
- hash := hex.EncodeToString(h.Sum(nil))
-
- for i := 0; i < len(address); i++ {
- if address[i] <= '9' { // Skip 0-9 digits: they don't have upper/lower-case.
- continue
- }
- if hash[i] > '7' && address[i] >= 'a' || hash[i] <= '7' && address[i] <= 'F' {
- return false
- }
- }
-
- return true
-}
-
-// isBitcoinAddress is the validation function for validating if the field's value is a valid btc address
-func isBitcoinAddress(fl FieldLevel) bool {
- address := fl.Field().String()
-
- if !btcAddressRegex().MatchString(address) {
- return false
- }
-
- alphabet := []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")
-
- decode := [25]byte{}
-
- for _, n := range []byte(address) {
- d := bytes.IndexByte(alphabet, n)
-
- for i := 24; i >= 0; i-- {
- d += 58 * int(decode[i])
- decode[i] = byte(d % 256)
- d /= 256
- }
- }
-
- h := sha256.New()
- _, _ = h.Write(decode[:21])
- d := h.Sum([]byte{})
- h = sha256.New()
- _, _ = h.Write(d)
-
- validchecksum := [4]byte{}
- computedchecksum := [4]byte{}
-
- copy(computedchecksum[:], h.Sum(d[:0]))
- copy(validchecksum[:], decode[21:])
-
- return validchecksum == computedchecksum
-}
-
-// isBitcoinBech32Address is the validation function for validating if the field's value is a valid bech32 btc address
-func isBitcoinBech32Address(fl FieldLevel) bool {
- address := fl.Field().String()
-
- if !btcLowerAddressRegexBech32().MatchString(address) && !btcUpperAddressRegexBech32().MatchString(address) {
- return false
- }
-
- am := len(address) % 8
-
- if am == 0 || am == 3 || am == 5 {
- return false
- }
-
- address = strings.ToLower(address)
-
- alphabet := "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
-
- hr := []int{3, 3, 0, 2, 3} // the human readable part will always be bc
- addr := address[3:]
- dp := make([]int, 0, len(addr))
-
- for _, c := range addr {
- dp = append(dp, strings.IndexRune(alphabet, c))
- }
-
- ver := dp[0]
-
- if ver < 0 || ver > 16 {
- return false
- }
-
- if ver == 0 {
- if len(address) != 42 && len(address) != 62 {
- return false
- }
- }
-
- values := append(hr, dp...)
-
- GEN := []int{0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3}
-
- p := 1
-
- for _, v := range values {
- b := p >> 25
- p = (p&0x1ffffff)<<5 ^ v
-
- for i := 0; i < 5; i++ {
- if (b>>uint(i))&1 == 1 {
- p ^= GEN[i]
- }
- }
- }
-
- if p != 1 {
- return false
- }
-
- b := uint(0)
- acc := 0
- mv := (1 << 5) - 1
- var sw []int
-
- for _, v := range dp[1 : len(dp)-6] {
- acc = (acc << 5) | v
- b += 5
- for b >= 8 {
- b -= 8
- sw = append(sw, (acc>>b)&mv)
- }
- }
-
- if len(sw) < 2 || len(sw) > 40 {
- return false
- }
-
- return true
-}
-
-// excludesRune is the validation function for validating that the field's value does not contain the rune specified within the param.
-func excludesRune(fl FieldLevel) bool {
- return !containsRune(fl)
-}
-
-// excludesAll is the validation function for validating that the field's value does not contain any of the characters specified within the param.
-func excludesAll(fl FieldLevel) bool {
- return !containsAny(fl)
-}
-
-// excludes is the validation function for validating that the field's value does not contain the text specified within the param.
-func excludes(fl FieldLevel) bool {
- return !contains(fl)
-}
-
-// containsRune is the validation function for validating that the field's value contains the rune specified within the param.
-func containsRune(fl FieldLevel) bool {
- r, _ := utf8.DecodeRuneInString(fl.Param())
-
- return strings.ContainsRune(fl.Field().String(), r)
-}
-
-// containsAny is the validation function for validating that the field's value contains any of the characters specified within the param.
-func containsAny(fl FieldLevel) bool {
- return strings.ContainsAny(fl.Field().String(), fl.Param())
-}
-
-// contains is the validation function for validating that the field's value contains the text specified within the param.
-func contains(fl FieldLevel) bool {
- return strings.Contains(fl.Field().String(), fl.Param())
-}
-
-// startsWith is the validation function for validating that the field's value starts with the text specified within the param.
-func startsWith(fl FieldLevel) bool {
- return strings.HasPrefix(fl.Field().String(), fl.Param())
-}
-
-// endsWith is the validation function for validating that the field's value ends with the text specified within the param.
-func endsWith(fl FieldLevel) bool {
- return strings.HasSuffix(fl.Field().String(), fl.Param())
-}
-
-// startsNotWith is the validation function for validating that the field's value does not start with the text specified within the param.
-func startsNotWith(fl FieldLevel) bool {
- return !startsWith(fl)
-}
-
-// endsNotWith is the validation function for validating that the field's value does not end with the text specified within the param.
-func endsNotWith(fl FieldLevel) bool {
- return !endsWith(fl)
-}
-
-// fieldContains is the validation function for validating if the current field's value contains the field specified by the param's value.
-func fieldContains(fl FieldLevel) bool {
- field := fl.Field()
-
- currentField, _, ok := fl.GetStructFieldOK()
-
- if !ok {
- return false
- }
-
- return strings.Contains(field.String(), currentField.String())
-}
-
-// fieldExcludes is the validation function for validating if the current field's value excludes the field specified by the param's value.
-func fieldExcludes(fl FieldLevel) bool {
- field := fl.Field()
-
- currentField, _, ok := fl.GetStructFieldOK()
- if !ok {
- return true
- }
-
- return !strings.Contains(field.String(), currentField.String())
-}
-
-// isNeField is the validation function for validating if the current field's value is not equal to the field specified by the param's value.
-func isNeField(fl FieldLevel) bool {
- field := fl.Field()
- kind := field.Kind()
-
- currentField, currentKind, ok := fl.GetStructFieldOK()
-
- if !ok || currentKind != kind {
- return true
- }
-
- switch kind {
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return field.Int() != currentField.Int()
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return field.Uint() != currentField.Uint()
-
- case reflect.Float32, reflect.Float64:
- return field.Float() != currentField.Float()
-
- case reflect.Slice, reflect.Map, reflect.Array:
- return int64(field.Len()) != int64(currentField.Len())
-
- case reflect.Bool:
- return field.Bool() != currentField.Bool()
-
- case reflect.Struct:
-
- fieldType := field.Type()
-
- if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {
-
- t := currentField.Interface().(time.Time)
- fieldTime := field.Interface().(time.Time)
-
- return !fieldTime.Equal(t)
- }
-
- // Not Same underlying type i.e. struct and time
- if fieldType != currentField.Type() {
- return true
- }
- }
-
- // default reflect.String:
- return field.String() != currentField.String()
-}
-
-// isNe is the validation function for validating that the field's value does not equal the provided param value.
-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()
- kind := field.Kind()
-
- topField, topKind, ok := fl.GetStructFieldOK()
- if !ok || topKind != kind {
- return false
- }
-
- switch kind {
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return field.Int() <= topField.Int()
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return field.Uint() <= topField.Uint()
-
- case reflect.Float32, reflect.Float64:
- return field.Float() <= topField.Float()
-
- case reflect.Slice, reflect.Map, reflect.Array:
- return int64(field.Len()) <= int64(topField.Len())
-
- case reflect.Struct:
-
- fieldType := field.Type()
-
- if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {
-
- fieldTime := field.Convert(timeType).Interface().(time.Time)
- topTime := topField.Convert(timeType).Interface().(time.Time)
-
- return fieldTime.Before(topTime) || fieldTime.Equal(topTime)
- }
-
- // Not Same underlying type i.e. struct and time
- if fieldType != topField.Type() {
- return false
- }
- }
-
- // default reflect.String:
- return field.String() <= topField.String()
-}
-
-// isLtCrossStructField is the validation function for validating if the current field's value is less than the field, within a separate struct, specified by the param's value.
-// NOTE: This is exposed for use within your own custom functions and not intended to be called directly.
-func isLtCrossStructField(fl FieldLevel) bool {
- field := fl.Field()
- kind := field.Kind()
-
- topField, topKind, ok := fl.GetStructFieldOK()
- if !ok || topKind != kind {
- return false
- }
-
- switch kind {
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return field.Int() < topField.Int()
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return field.Uint() < topField.Uint()
-
- case reflect.Float32, reflect.Float64:
- return field.Float() < topField.Float()
-
- case reflect.Slice, reflect.Map, reflect.Array:
- return int64(field.Len()) < int64(topField.Len())
-
- case reflect.Struct:
-
- fieldType := field.Type()
-
- if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {
-
- fieldTime := field.Convert(timeType).Interface().(time.Time)
- topTime := topField.Convert(timeType).Interface().(time.Time)
-
- return fieldTime.Before(topTime)
- }
-
- // Not Same underlying type i.e. struct and time
- if fieldType != topField.Type() {
- return false
- }
- }
-
- // default reflect.String:
- return field.String() < topField.String()
-}
-
-// isGteCrossStructField is the validation function for validating if the current field's value is greater than or equal to the field, within a separate struct, specified by the param's value.
-func isGteCrossStructField(fl FieldLevel) bool {
- field := fl.Field()
- kind := field.Kind()
-
- topField, topKind, ok := fl.GetStructFieldOK()
- if !ok || topKind != kind {
- return false
- }
-
- switch kind {
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return field.Int() >= topField.Int()
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return field.Uint() >= topField.Uint()
-
- case reflect.Float32, reflect.Float64:
- return field.Float() >= topField.Float()
-
- case reflect.Slice, reflect.Map, reflect.Array:
- return int64(field.Len()) >= int64(topField.Len())
-
- case reflect.Struct:
-
- fieldType := field.Type()
-
- if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {
-
- fieldTime := field.Convert(timeType).Interface().(time.Time)
- topTime := topField.Convert(timeType).Interface().(time.Time)
-
- return fieldTime.After(topTime) || fieldTime.Equal(topTime)
- }
-
- // Not Same underlying type i.e. struct and time
- if fieldType != topField.Type() {
- return false
- }
- }
-
- // default reflect.String:
- return field.String() >= topField.String()
-}
-
-// isGtCrossStructField is the validation function for validating if the current field's value is greater than the field, within a separate struct, specified by the param's value.
-func isGtCrossStructField(fl FieldLevel) bool {
- field := fl.Field()
- kind := field.Kind()
-
- topField, topKind, ok := fl.GetStructFieldOK()
- if !ok || topKind != kind {
- return false
- }
-
- switch kind {
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return field.Int() > topField.Int()
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return field.Uint() > topField.Uint()
-
- case reflect.Float32, reflect.Float64:
- return field.Float() > topField.Float()
-
- case reflect.Slice, reflect.Map, reflect.Array:
- return int64(field.Len()) > int64(topField.Len())
-
- case reflect.Struct:
-
- fieldType := field.Type()
-
- if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {
-
- fieldTime := field.Convert(timeType).Interface().(time.Time)
- topTime := topField.Convert(timeType).Interface().(time.Time)
-
- return fieldTime.After(topTime)
- }
-
- // Not Same underlying type i.e. struct and time
- if fieldType != topField.Type() {
- return false
- }
- }
-
- // default reflect.String:
- return field.String() > topField.String()
-}
-
-// isNeCrossStructField is the validation function for validating that the current field's value is not equal to the field, within a separate struct, specified by the param's value.
-func isNeCrossStructField(fl FieldLevel) bool {
- field := fl.Field()
- kind := field.Kind()
-
- topField, currentKind, ok := fl.GetStructFieldOK()
- if !ok || currentKind != kind {
- return true
- }
-
- switch kind {
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return topField.Int() != field.Int()
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return topField.Uint() != field.Uint()
-
- case reflect.Float32, reflect.Float64:
- return topField.Float() != field.Float()
-
- case reflect.Slice, reflect.Map, reflect.Array:
- return int64(topField.Len()) != int64(field.Len())
-
- case reflect.Bool:
- return topField.Bool() != field.Bool()
-
- case reflect.Struct:
-
- fieldType := field.Type()
-
- if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {
-
- t := field.Convert(timeType).Interface().(time.Time)
- fieldTime := topField.Convert(timeType).Interface().(time.Time)
-
- return !fieldTime.Equal(t)
- }
-
- // Not Same underlying type i.e. struct and time
- if fieldType != topField.Type() {
- return true
- }
- }
-
- // default reflect.String:
- return topField.String() != field.String()
-}
-
-// isEqCrossStructField is the validation function for validating that the current field's value is equal to the field, within a separate struct, specified by the param's value.
-func isEqCrossStructField(fl FieldLevel) bool {
- field := fl.Field()
- kind := field.Kind()
-
- topField, topKind, ok := fl.GetStructFieldOK()
- if !ok || topKind != kind {
- return false
- }
-
- switch kind {
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return topField.Int() == field.Int()
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return topField.Uint() == field.Uint()
-
- case reflect.Float32, reflect.Float64:
- return topField.Float() == field.Float()
-
- case reflect.Slice, reflect.Map, reflect.Array:
- return int64(topField.Len()) == int64(field.Len())
-
- case reflect.Bool:
- return topField.Bool() == field.Bool()
-
- case reflect.Struct:
-
- fieldType := field.Type()
-
- if fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {
-
- t := field.Convert(timeType).Interface().(time.Time)
- fieldTime := topField.Convert(timeType).Interface().(time.Time)
-
- return fieldTime.Equal(t)
- }
-
- // Not Same underlying type i.e. struct and time
- if fieldType != topField.Type() {
- return false
- }
- }
-
- // default reflect.String:
- return topField.String() == field.String()
-}
-
-// isEqField is the validation function for validating if the current field's value is equal to the field specified by the param's value.
-func isEqField(fl FieldLevel) bool {
- field := fl.Field()
- kind := field.Kind()
-
- currentField, currentKind, ok := fl.GetStructFieldOK()
- if !ok || currentKind != kind {
- return false
- }
-
- switch kind {
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return field.Int() == currentField.Int()
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return field.Uint() == currentField.Uint()
-
- case reflect.Float32, reflect.Float64:
- return field.Float() == currentField.Float()
-
- case reflect.Slice, reflect.Map, reflect.Array:
- return int64(field.Len()) == int64(currentField.Len())
-
- case reflect.Bool:
- return field.Bool() == currentField.Bool()
-
- case reflect.Struct:
-
- fieldType := field.Type()
-
- if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {
-
- t := currentField.Convert(timeType).Interface().(time.Time)
- fieldTime := field.Convert(timeType).Interface().(time.Time)
-
- return fieldTime.Equal(t)
- }
-
- // Not Same underlying type i.e. struct and time
- if fieldType != currentField.Type() {
- return false
- }
- }
-
- // default reflect.String:
- return field.String() == currentField.String()
-}
-
-// isEq is the validation function for validating if the current field's value is equal to the param's value.
-func isEq(fl FieldLevel) bool {
- field := fl.Field()
- param := fl.Param()
-
- switch field.Kind() {
-
- case reflect.String:
- return field.String() == param
-
- case reflect.Slice, reflect.Map, reflect.Array:
- p := asInt(param)
-
- return int64(field.Len()) == p
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- p := asIntFromType(field.Type(), param)
-
- return field.Int() == p
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- p := asUint(param)
-
- return field.Uint() == p
-
- case reflect.Float32:
- p := asFloat32(param)
-
- return field.Float() == p
-
- case reflect.Float64:
- p := asFloat64(param)
-
- return field.Float() == p
-
- case reflect.Bool:
- p := asBool(param)
-
- return field.Bool() == p
- }
-
- 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 {
- field := fl.Field()
- param := fl.Param()
-
- postcodeRegexInit.Do(initPostcodes)
- reg, found := postCodeRegexDict[param]
- if !found {
- return false
- }
-
- return reg.MatchString(field.String())
-}
-
-// isPostcodeByIso3166Alpha2Field validates by field which represents for a value of country code in iso 3166 alpha 2
-// example: `postcode_iso3166_alpha2_field=CountryCode`
-func isPostcodeByIso3166Alpha2Field(fl FieldLevel) bool {
- field := fl.Field()
- params := parseOneOfParam2(fl.Param())
-
- if len(params) != 1 {
- return false
- }
-
- currentField, kind, _, found := fl.GetStructFieldOKAdvanced2(fl.Parent(), params[0])
- if !found {
- return false
- }
-
- if kind != reflect.String {
- panic(fmt.Sprintf("Bad field type %T", currentField.Interface()))
- }
-
- reg, found := postCodeRegexDict[currentField.String()]
- if !found {
- return false
- }
-
- return reg.MatchString(field.String())
-}
-
-// isBase32 is the validation function for validating if the current field's value is a valid base 32.
-func isBase32(fl FieldLevel) bool {
- return base32Regex().MatchString(fl.Field().String())
-}
-
-// isBase64 is the validation function for validating if the current field's value is a valid base 64.
-func isBase64(fl FieldLevel) bool {
- return base64Regex().MatchString(fl.Field().String())
-}
-
-// isBase64URL is the validation function for validating if the current field's value is a valid base64 URL safe string.
-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()
-
- switch field.Kind() {
- case reflect.String:
-
- 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
- }
-
- _, err := url.ParseRequestURI(s)
-
- return err == nil
- }
-
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
-}
-
-// isFileURL is the helper function for validating if the `path` valid file URL as per RFC8089
-func isFileURL(path string) bool {
- if !strings.HasPrefix(path, "file:/") {
- return false
- }
- _, err := url.ParseRequestURI(path)
- return err == nil
-}
-
-// isURL is the validation function for validating if the current field's value is a valid URL.
-func isURL(fl FieldLevel) bool {
- field := fl.Field()
-
- switch field.Kind() {
- case reflect.String:
-
- s := strings.ToLower(field.String())
-
- if len(s) == 0 {
- return false
- }
-
- if isFileURL(s) {
- return true
- }
-
- 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()
-
- switch field.Kind() {
- case reflect.String:
-
- str := field.String()
-
- _, match := urn.Parse([]byte(str))
-
- return match
- }
-
- 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 existing file path.
-func isFile(fl FieldLevel) bool {
- field := fl.Field()
-
- switch field.Kind() {
- case reflect.String:
- fileInfo, err := os.Stat(field.String())
- if err != nil {
- return false
- }
-
- return !fileInfo.IsDir()
- }
-
- 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())
-}
-
-// isEmail is the validation function for validating if the current field's value is a valid email address.
-func isEmail(fl FieldLevel) bool {
- return emailRegex().MatchString(fl.Field().String())
-}
-
-// isHSLA is the validation function for validating if the current field's value is a valid HSLA color.
-func isHSLA(fl FieldLevel) bool {
- return hslaRegex().MatchString(fl.Field().String())
-}
-
-// isHSL is the validation function for validating if the current field's value is a valid HSL color.
-func isHSL(fl FieldLevel) bool {
- return hslRegex().MatchString(fl.Field().String())
-}
-
-// isRGBA is the validation function for validating if the current field's value is a valid RGBA color.
-func isRGBA(fl FieldLevel) bool {
- return rgbaRegex().MatchString(fl.Field().String())
-}
-
-// isRGB is the validation function for validating if the current field's value is a valid RGB color.
-func isRGB(fl FieldLevel) bool {
- return rgbRegex().MatchString(fl.Field().String())
-}
-
-// isHEXColor is the validation function for validating if the current field's value is a valid HEX color.
-func isHEXColor(fl FieldLevel) bool {
- return hexColorRegex().MatchString(fl.Field().String())
-}
-
-// isHexadecimal is the validation function for validating if the current field's value is a valid hexadecimal.
-func isHexadecimal(fl FieldLevel) bool {
- return hexadecimalRegex().MatchString(fl.Field().String())
-}
-
-// isNumber is the validation function for validating if the current field's value is a valid number.
-func isNumber(fl FieldLevel) bool {
- switch fl.Field().Kind() {
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64:
- return true
- default:
- return numberRegex().MatchString(fl.Field().String())
- }
-}
-
-// isNumeric is the validation function for validating if the current field's value is a valid numeric value.
-func isNumeric(fl FieldLevel) bool {
- switch fl.Field().Kind() {
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64:
- return true
- default:
- return numericRegex().MatchString(fl.Field().String())
- }
-}
-
-// isAlphanum is the validation function for validating if the current field's value is a valid alphanumeric value.
-func isAlphanum(fl FieldLevel) bool {
- return alphaNumericRegex().MatchString(fl.Field().String())
-}
-
-// isAlpha is the validation function for validating if the current field's value is a valid alpha value.
-func isAlpha(fl FieldLevel) bool {
- return alphaRegex().MatchString(fl.Field().String())
-}
-
-// isAlphanumUnicode is the validation function for validating if the current field's value is a valid alphanumeric unicode value.
-func isAlphanumUnicode(fl FieldLevel) bool {
- return alphaUnicodeNumericRegex().MatchString(fl.Field().String())
-}
-
-// isAlphaUnicode is the validation function for validating if the current field's value is a valid alpha unicode value.
-func isAlphaUnicode(fl FieldLevel) bool {
- return alphaUnicodeRegex().MatchString(fl.Field().String())
-}
-
-// isBoolean is the validation function for validating if the current field's value is a valid boolean value or can be safely converted to a boolean value.
-func isBoolean(fl FieldLevel) bool {
- switch fl.Field().Kind() {
- case reflect.Bool:
- return true
- default:
- _, err := strconv.ParseBool(fl.Field().String())
- return err == nil
- }
-}
-
-// isDefault is the opposite of required aka hasValue
-func isDefault(fl FieldLevel) bool {
- return !hasValue(fl)
-}
-
-// hasValue is the validation function for validating if the current field's value is not the default static value.
-func hasValue(fl FieldLevel) bool {
- field := fl.Field()
- switch field.Kind() {
- case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func:
- return !field.IsNil()
- default:
- if fl.(*validate).fldIsPointer && field.Interface() != nil {
- return true
- }
- return field.IsValid() && !field.IsZero()
- }
-}
-
-// requireCheckFieldKind is a func for check field kind
-func requireCheckFieldKind(fl FieldLevel, param string, defaultNotFoundValue bool) bool {
- field := fl.Field()
- kind := field.Kind()
- var nullable, found bool
- if len(param) > 0 {
- field, kind, nullable, found = fl.GetStructFieldOKAdvanced2(fl.Parent(), param)
- if !found {
- return defaultNotFoundValue
- }
- }
- switch kind {
- case reflect.Invalid:
- return defaultNotFoundValue
- case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func:
- return field.IsNil()
- default:
- if nullable && field.Interface() != nil {
- return false
- }
- return field.IsValid() && field.IsZero()
- }
-}
-
-// requireCheckFieldValue is a func for check field value
-func requireCheckFieldValue(
- fl FieldLevel, param string, value string, defaultNotFoundValue bool,
-) bool {
- field, kind, _, found := fl.GetStructFieldOKAdvanced2(fl.Parent(), param)
- if !found {
- return defaultNotFoundValue
- }
-
- switch kind {
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return field.Int() == asInt(value)
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return field.Uint() == asUint(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)
-
- case reflect.Bool:
- return field.Bool() == (value == "true")
-
- case reflect.Ptr:
- if field.IsNil() {
- return value == "nil"
- }
- // Handle non-nil pointers
- return requireCheckFieldValue(fl, param, value, defaultNotFoundValue)
- }
-
- // default reflect.String:
- return field.String() == value
-}
-
-// requiredIf is the validation function
-// The field under validation must be present and not empty only if all the other specified fields are equal to the value following with the specified field.
-func requiredIf(fl FieldLevel) bool {
- params := parseOneOfParam2(fl.Param())
- if len(params)%2 != 0 {
- panic(fmt.Sprintf("Bad param number for required_if %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)
-}
-
-// excludedIf is the validation function
-// The field under validation must not be present or is empty only if all the other specified fields are equal to the value following with the specified field.
-func excludedIf(fl FieldLevel) bool {
- params := parseOneOfParam2(fl.Param())
- if len(params)%2 != 0 {
- panic(fmt.Sprintf("Bad param number for excluded_if %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)
-}
-
-// requiredUnless 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 requiredUnless(fl FieldLevel) bool {
- params := parseOneOfParam2(fl.Param())
- if len(params)%2 != 0 {
- panic(fmt.Sprintf("Bad param number for required_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)
-}
-
-// 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 {
- params := parseOneOfParam2(fl.Param())
- if len(params)%2 != 0 {
- panic(fmt.Sprintf("Bad param number for excluded_unless %s", fl.FieldName()))
- }
- for i := 0; i < len(params); i += 2 {
- if !requireCheckFieldValue(fl, params[i], params[i+1], false) {
- return !hasValue(fl)
- }
- }
- return true
-}
-
-// excludedWith is the validation function
-// The field under validation must not be present or is empty if any of the other specified fields are present.
-func excludedWith(fl FieldLevel) bool {
- params := parseOneOfParam2(fl.Param())
- for _, param := range params {
- if !requireCheckFieldKind(fl, param, true) {
- return !hasValue(fl)
- }
- }
- return true
-}
-
-// requiredWith is the validation function
-// The field under validation must be present and not empty only if any of the other specified fields are present.
-func requiredWith(fl FieldLevel) bool {
- params := parseOneOfParam2(fl.Param())
- for _, param := range params {
- if !requireCheckFieldKind(fl, param, true) {
- return hasValue(fl)
- }
- }
- return true
-}
-
-// excludedWithAll is the validation function
-// The field under validation must not be present or is empty if all of the other specified fields are present.
-func excludedWithAll(fl FieldLevel) bool {
- params := parseOneOfParam2(fl.Param())
- for _, param := range params {
- if requireCheckFieldKind(fl, param, true) {
- return true
- }
- }
- return !hasValue(fl)
-}
-
-// requiredWithAll is the validation function
-// The field under validation must be present and not empty only if all of the other specified fields are present.
-func requiredWithAll(fl FieldLevel) bool {
- params := parseOneOfParam2(fl.Param())
- for _, param := range params {
- if requireCheckFieldKind(fl, param, true) {
- return true
- }
- }
- return hasValue(fl)
-}
-
-// excludedWithout is the validation function
-// The field under validation must not be present or is empty when any of the other specified fields are not present.
-func excludedWithout(fl FieldLevel) bool {
- if requireCheckFieldKind(fl, strings.TrimSpace(fl.Param()), true) {
- return !hasValue(fl)
- }
- return true
-}
-
-// requiredWithout is the validation function
-// The field under validation must be present and not empty only when any of the other specified fields are not present.
-func requiredWithout(fl FieldLevel) bool {
- if requireCheckFieldKind(fl, strings.TrimSpace(fl.Param()), true) {
- return hasValue(fl)
- }
- return true
-}
-
-// excludedWithoutAll is the validation function
-// The field under validation must not be present or is empty when all of the other specified fields are not present.
-func excludedWithoutAll(fl FieldLevel) bool {
- params := parseOneOfParam2(fl.Param())
- for _, param := range params {
- if !requireCheckFieldKind(fl, param, true) {
- return true
- }
- }
- return !hasValue(fl)
-}
-
-// requiredWithoutAll is the validation function
-// The field under validation must be present and not empty only when all of the other specified fields are not present.
-func requiredWithoutAll(fl FieldLevel) bool {
- params := parseOneOfParam2(fl.Param())
- for _, param := range params {
- if !requireCheckFieldKind(fl, param, true) {
- return true
- }
- }
- return hasValue(fl)
-}
-
-// isGteField is the validation function for validating if the current field's value is greater than or equal to the field specified by the param's value.
-func isGteField(fl FieldLevel) bool {
- field := fl.Field()
- kind := field.Kind()
-
- currentField, currentKind, ok := fl.GetStructFieldOK()
- if !ok || currentKind != kind {
- return false
- }
-
- switch kind {
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-
- return field.Int() >= currentField.Int()
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-
- return field.Uint() >= currentField.Uint()
-
- case reflect.Float32, reflect.Float64:
-
- return field.Float() >= currentField.Float()
-
- case reflect.Struct:
-
- fieldType := field.Type()
-
- if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {
-
- t := currentField.Convert(timeType).Interface().(time.Time)
- fieldTime := field.Convert(timeType).Interface().(time.Time)
-
- return fieldTime.After(t) || fieldTime.Equal(t)
- }
-
- // Not Same underlying type i.e. struct and time
- if fieldType != currentField.Type() {
- return false
- }
- }
-
- // default reflect.String
- return len(field.String()) >= len(currentField.String())
-}
-
-// isGtField is the validation function for validating if the current field's value is greater than the field specified by the param's value.
-func isGtField(fl FieldLevel) bool {
- field := fl.Field()
- kind := field.Kind()
-
- currentField, currentKind, ok := fl.GetStructFieldOK()
- if !ok || currentKind != kind {
- return false
- }
-
- switch kind {
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-
- return field.Int() > currentField.Int()
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-
- return field.Uint() > currentField.Uint()
-
- case reflect.Float32, reflect.Float64:
-
- return field.Float() > currentField.Float()
-
- case reflect.Struct:
-
- fieldType := field.Type()
-
- if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {
-
- t := currentField.Convert(timeType).Interface().(time.Time)
- fieldTime := field.Convert(timeType).Interface().(time.Time)
-
- return fieldTime.After(t)
- }
-
- // Not Same underlying type i.e. struct and time
- if fieldType != currentField.Type() {
- return false
- }
- }
-
- // default reflect.String
- return len(field.String()) > len(currentField.String())
-}
-
-// isGte is the validation function for validating if the current field's value is greater than or equal to the param's value.
-func isGte(fl FieldLevel) bool {
- field := fl.Field()
- param := fl.Param()
-
- switch field.Kind() {
-
- case reflect.String:
- p := asInt(param)
-
- return int64(utf8.RuneCountInString(field.String())) >= p
-
- case reflect.Slice, reflect.Map, reflect.Array:
- p := asInt(param)
-
- return int64(field.Len()) >= p
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- p := asIntFromType(field.Type(), param)
-
- return field.Int() >= p
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- p := asUint(param)
-
- return field.Uint() >= p
-
- 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) {
-
- now := time.Now().UTC()
- t := field.Convert(timeType).Interface().(time.Time)
-
- return t.After(now) || t.Equal(now)
- }
- }
-
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
-}
-
-// isGt is the validation function for validating if the current field's value is greater than the param's value.
-func isGt(fl FieldLevel) bool {
- field := fl.Field()
- param := fl.Param()
-
- switch field.Kind() {
-
- case reflect.String:
- p := asInt(param)
-
- return int64(utf8.RuneCountInString(field.String())) > p
-
- case reflect.Slice, reflect.Map, reflect.Array:
- p := asInt(param)
-
- return int64(field.Len()) > p
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- p := asIntFromType(field.Type(), param)
-
- return field.Int() > p
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- p := asUint(param)
-
- return field.Uint() > p
-
- 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) {
-
- return field.Convert(timeType).Interface().(time.Time).After(time.Now().UTC())
- }
- }
-
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
-}
-
-// hasLengthOf is the validation function for validating if the current field's value is equal to the param's value.
-func hasLengthOf(fl FieldLevel) bool {
- field := fl.Field()
- param := fl.Param()
-
- switch field.Kind() {
-
- case reflect.String:
- p := asInt(param)
-
- return int64(utf8.RuneCountInString(field.String())) == p
-
- case reflect.Slice, reflect.Map, reflect.Array:
- p := asInt(param)
-
- return int64(field.Len()) == p
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- p := asIntFromType(field.Type(), param)
-
- return field.Int() == p
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- p := asUint(param)
-
- return field.Uint() == p
-
- case reflect.Float32:
- p := asFloat32(param)
-
- return field.Float() == p
-
- case reflect.Float64:
- p := asFloat64(param)
-
- return field.Float() == p
- }
-
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
-}
-
-// hasMinOf is the validation function for validating if the current field's value is greater than or equal to the param's value.
-func hasMinOf(fl FieldLevel) bool {
- return isGte(fl)
-}
-
-// isLteField is the validation function for validating if the current field's value is less than or equal to the field specified by the param's value.
-func isLteField(fl FieldLevel) bool {
- field := fl.Field()
- kind := field.Kind()
-
- currentField, currentKind, ok := fl.GetStructFieldOK()
- if !ok || currentKind != kind {
- return false
- }
-
- switch kind {
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-
- return field.Int() <= currentField.Int()
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-
- return field.Uint() <= currentField.Uint()
-
- case reflect.Float32, reflect.Float64:
-
- return field.Float() <= currentField.Float()
-
- case reflect.Struct:
-
- fieldType := field.Type()
-
- if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {
-
- t := currentField.Convert(timeType).Interface().(time.Time)
- fieldTime := field.Convert(timeType).Interface().(time.Time)
-
- return fieldTime.Before(t) || fieldTime.Equal(t)
- }
-
- // Not Same underlying type i.e. struct and time
- if fieldType != currentField.Type() {
- return false
- }
- }
-
- // default reflect.String
- return len(field.String()) <= len(currentField.String())
-}
-
-// isLtField is the validation function for validating if the current field's value is less than the field specified by the param's value.
-func isLtField(fl FieldLevel) bool {
- field := fl.Field()
- kind := field.Kind()
-
- currentField, currentKind, ok := fl.GetStructFieldOK()
- if !ok || currentKind != kind {
- return false
- }
-
- switch kind {
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-
- return field.Int() < currentField.Int()
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-
- return field.Uint() < currentField.Uint()
-
- case reflect.Float32, reflect.Float64:
-
- return field.Float() < currentField.Float()
-
- case reflect.Struct:
-
- fieldType := field.Type()
-
- if fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {
-
- t := currentField.Convert(timeType).Interface().(time.Time)
- fieldTime := field.Convert(timeType).Interface().(time.Time)
-
- return fieldTime.Before(t)
- }
-
- // Not Same underlying type i.e. struct and time
- if fieldType != currentField.Type() {
- return false
- }
- }
-
- // default reflect.String
- return len(field.String()) < len(currentField.String())
-}
-
-// isLte is the validation function for validating if the current field's value is less than or equal to the param's value.
-func isLte(fl FieldLevel) bool {
- field := fl.Field()
- param := fl.Param()
-
- switch field.Kind() {
-
- case reflect.String:
- p := asInt(param)
-
- return int64(utf8.RuneCountInString(field.String())) <= p
-
- case reflect.Slice, reflect.Map, reflect.Array:
- p := asInt(param)
-
- return int64(field.Len()) <= p
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- p := asIntFromType(field.Type(), param)
-
- return field.Int() <= p
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- p := asUint(param)
-
- return field.Uint() <= p
-
- 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) {
-
- now := time.Now().UTC()
- t := field.Convert(timeType).Interface().(time.Time)
-
- return t.Before(now) || t.Equal(now)
- }
- }
-
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
-}
-
-// isLt is the validation function for validating if the current field's value is less than the param's value.
-func isLt(fl FieldLevel) bool {
- field := fl.Field()
- param := fl.Param()
-
- switch field.Kind() {
-
- case reflect.String:
- p := asInt(param)
-
- return int64(utf8.RuneCountInString(field.String())) < p
-
- case reflect.Slice, reflect.Map, reflect.Array:
- p := asInt(param)
-
- return int64(field.Len()) < p
-
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- p := asIntFromType(field.Type(), param)
-
- return field.Int() < p
-
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- p := asUint(param)
-
- return field.Uint() < p
-
- 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) {
-
- return field.Convert(timeType).Interface().(time.Time).Before(time.Now().UTC())
- }
- }
-
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
-}
-
-// hasMaxOf is the validation function for validating if the current field's value is less than or equal to the param's value.
-func hasMaxOf(fl FieldLevel) bool {
- return isLte(fl)
-}
-
-// isTCP4AddrResolvable is the validation function for validating if the field's value is a resolvable tcp4 address.
-func isTCP4AddrResolvable(fl FieldLevel) bool {
- if !isIP4Addr(fl) {
- return false
- }
-
- _, err := net.ResolveTCPAddr("tcp4", fl.Field().String())
- return err == nil
-}
-
-// isTCP6AddrResolvable is the validation function for validating if the field's value is a resolvable tcp6 address.
-func isTCP6AddrResolvable(fl FieldLevel) bool {
- if !isIP6Addr(fl) {
- return false
- }
-
- _, err := net.ResolveTCPAddr("tcp6", fl.Field().String())
-
- return err == nil
-}
-
-// isTCPAddrResolvable is the validation function for validating if the field's value is a resolvable tcp address.
-func isTCPAddrResolvable(fl FieldLevel) bool {
- if !isIP4Addr(fl) && !isIP6Addr(fl) {
- return false
- }
-
- _, err := net.ResolveTCPAddr("tcp", fl.Field().String())
-
- return err == nil
-}
-
-// isUDP4AddrResolvable is the validation function for validating if the field's value is a resolvable udp4 address.
-func isUDP4AddrResolvable(fl FieldLevel) bool {
- if !isIP4Addr(fl) {
- return false
- }
-
- _, err := net.ResolveUDPAddr("udp4", fl.Field().String())
-
- return err == nil
-}
-
-// isUDP6AddrResolvable is the validation function for validating if the field's value is a resolvable udp6 address.
-func isUDP6AddrResolvable(fl FieldLevel) bool {
- if !isIP6Addr(fl) {
- return false
- }
-
- _, err := net.ResolveUDPAddr("udp6", fl.Field().String())
-
- return err == nil
-}
-
-// isUDPAddrResolvable is the validation function for validating if the field's value is a resolvable udp address.
-func isUDPAddrResolvable(fl FieldLevel) bool {
- if !isIP4Addr(fl) && !isIP6Addr(fl) {
- return false
- }
-
- _, err := net.ResolveUDPAddr("udp", fl.Field().String())
-
- return err == nil
-}
-
-// isIP4AddrResolvable is the validation function for validating if the field's value is a resolvable ip4 address.
-func isIP4AddrResolvable(fl FieldLevel) bool {
- if !isIPv4(fl) {
- return false
- }
-
- _, err := net.ResolveIPAddr("ip4", fl.Field().String())
-
- return err == nil
-}
-
-// isIP6AddrResolvable is the validation function for validating if the field's value is a resolvable ip6 address.
-func isIP6AddrResolvable(fl FieldLevel) bool {
- if !isIPv6(fl) {
- return false
- }
-
- _, err := net.ResolveIPAddr("ip6", fl.Field().String())
-
- return err == nil
-}
-
-// isIPAddrResolvable is the validation function for validating if the field's value is a resolvable ip address.
-func isIPAddrResolvable(fl FieldLevel) bool {
- if !isIP(fl) {
- return false
- }
-
- _, err := net.ResolveIPAddr("ip", fl.Field().String())
-
- return err == nil
-}
-
-// isUnixAddrResolvable is the validation function for validating if the field's value is a resolvable unix address.
-func isUnixAddrResolvable(fl FieldLevel) bool {
- _, err := net.ResolveUnixAddr("unix", fl.Field().String())
-
- return err == nil
-}
-
-func isIP4Addr(fl FieldLevel) bool {
- val := fl.Field().String()
-
- if idx := strings.LastIndex(val, ":"); idx != -1 {
- val = val[0:idx]
- }
-
- ip := net.ParseIP(val)
-
- return ip != nil && ip.To4() != nil
-}
-
-func isIP6Addr(fl FieldLevel) bool {
- val := fl.Field().String()
-
- if idx := strings.LastIndex(val, ":"); idx != -1 {
- if idx != 0 && val[idx-1:idx] == "]" {
- val = val[1 : idx-1]
- }
- }
-
- ip := net.ParseIP(val)
-
- return ip != nil && ip.To4() == nil
-}
-
-func isHostnameRFC952(fl FieldLevel) bool {
- return hostnameRegexRFC952().MatchString(fl.Field().String())
-}
-
-func isHostnameRFC1123(fl FieldLevel) bool {
- return hostnameRegexRFC1123().MatchString(fl.Field().String())
-}
-
-func isFQDN(fl FieldLevel) bool {
- val := fl.Field().String()
-
- if val == "" {
- return false
- }
-
- return fqdnRegexRFC1123().MatchString(val)
-}
-
-// 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()
-
- if field.Kind() == reflect.String {
- fileInfo, err := os.Stat(field.String())
- if err != nil {
- return false
- }
-
- return fileInfo.IsDir()
- }
-
- 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()
-
- 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()))
-}
-
-// isJWT is the validation function for validating if the current field's value is a valid JWT string.
-func isJWT(fl FieldLevel) bool {
- return jWTRegex().MatchString(fl.Field().String())
-}
-
-// isHostnamePort validates a <dns>:<port> combination for fields typically used for socket address.
-func isHostnamePort(fl FieldLevel) bool {
- val := fl.Field().String()
- host, port, err := net.SplitHostPort(val)
- if err != nil {
- return false
- }
- // Port must be a iny <= 65535.
- if portNum, err := strconv.ParseInt(
- port, 10, 32,
- ); err != nil || portNum > 65535 || portNum < 1 {
- return false
- }
-
- // If host is specified, it should match a DNS name
- if host != "" {
- return hostnameRegexRFC1123().MatchString(host)
- }
- return true
-}
-
-// IsPort validates if the current field's value represents a valid port
-func isPort(fl FieldLevel) bool {
- val := fl.Field().Uint()
-
- return val >= 1 && val <= 65535
-}
-
-// isLowercase is the validation function for validating if the current field's value is a lowercase string.
-func isLowercase(fl FieldLevel) bool {
- field := fl.Field()
-
- if field.Kind() == reflect.String {
- if field.String() == "" {
- return false
- }
- return field.String() == strings.ToLower(field.String())
- }
-
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
-}
-
-// isUppercase is the validation function for validating if the current field's value is an uppercase string.
-func isUppercase(fl FieldLevel) bool {
- field := fl.Field()
-
- if field.Kind() == reflect.String {
- if field.String() == "" {
- return false
- }
- return field.String() == strings.ToUpper(field.String())
- }
-
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
-}
-
-// isDatetime is the validation function for validating if the current field's value is a valid datetime string.
-func isDatetime(fl FieldLevel) bool {
- field := fl.Field()
- param := fl.Param()
-
- if field.Kind() == reflect.String {
- _, err := time.Parse(param, field.String())
-
- return err == nil
- }
-
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
-}
-
-// isTimeZone is the validation function for validating if the current field's value is a valid time zone string.
-func isTimeZone(fl FieldLevel) bool {
- field := fl.Field()
-
- if field.Kind() == reflect.String {
- // empty value is converted to UTC by time.LoadLocation but disallow it as it is not a valid time zone name
- if field.String() == "" {
- return false
- }
-
- // Local value is converted to the current system time zone by time.LoadLocation but disallow it as it is not a valid time zone name
- if strings.ToLower(field.String()) == "local" {
- return false
- }
-
- _, err := time.LoadLocation(field.String())
- return err == nil
- }
-
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
-}
-
-// isIso3166Alpha2 is the validation function for validating if the current field's value is a valid iso3166-1 alpha-2 country code.
-func isIso3166Alpha2(fl FieldLevel) bool {
- _, ok := iso3166_1_alpha2[fl.Field().String()]
- return ok
-}
-
-// isIso3166Alpha2EU is the validation function for validating if the current field's value is a valid iso3166-1 alpha-2 European Union country code.
-func isIso3166Alpha2EU(fl FieldLevel) bool {
- _, ok := iso3166_1_alpha2_eu[fl.Field().String()]
- return ok
-}
-
-// 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 {
- _, ok := iso3166_1_alpha3[fl.Field().String()]
- return ok
-}
-
-// isIso3166Alpha3EU is the validation function for validating if the current field's value is a valid iso3166-1 alpha-3 European Union country code.
-func isIso3166Alpha3EU(fl FieldLevel) bool {
- _, ok := iso3166_1_alpha3_eu[fl.Field().String()]
- return ok
-}
-
-// 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()
-
- var code int
- switch field.Kind() {
- case reflect.String:
- i, err := strconv.Atoi(field.String())
- if err != nil {
- return false
- }
- code = i % 1000
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- code = int(field.Int() % 1000)
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- code = int(field.Uint() % 1000)
- default:
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
- }
-
- _, ok := iso3166_1_alpha_numeric[code]
- return ok
-}
-
-// isIso3166AlphaNumericEU is the validation function for validating if the current field's value is a valid iso3166-1 alpha-numeric European Union country code.
-func isIso3166AlphaNumericEU(fl FieldLevel) bool {
- field := fl.Field()
-
- var code int
- switch field.Kind() {
- case reflect.String:
- i, err := strconv.Atoi(field.String())
- if err != nil {
- return false
- }
- code = i % 1000
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- code = int(field.Int() % 1000)
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- code = int(field.Uint() % 1000)
- default:
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
- }
-
- _, ok := iso3166_1_alpha_numeric_eu[code]
- return ok
-}
-
-// isIso31662 is the validation function for validating if the current field's value is a valid iso3166-2 code.
-func isIso31662(fl FieldLevel) bool {
- _, ok := iso3166_2[fl.Field().String()]
- return ok
-}
-
-// isIso4217 is the validation function for validating if the current field's value is a valid iso4217 currency code.
-func isIso4217(fl FieldLevel) bool {
- _, ok := iso4217[fl.Field().String()]
- return ok
-}
-
-// isIso4217Numeric is the validation function for validating if the current field's value is a valid iso4217 numeric currency code.
-func isIso4217Numeric(fl FieldLevel) bool {
- field := fl.Field()
-
- var code int
- switch field.Kind() {
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- code = int(field.Int())
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- code = int(field.Uint())
- default:
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
- }
-
- _, ok := iso4217_numeric[code]
- return ok
-}
-
-// isBCP47LanguageTag is the validation function for validating if the current field's value is a valid BCP 47 language tag, as parsed by language.Parse
-func isBCP47LanguageTag(fl FieldLevel) bool {
- field := fl.Field()
-
- if field.Kind() == reflect.String {
- _, err := language.Parse(field.String())
- return err == nil
- }
-
- panic(fmt.Sprintf("Bad field type %T", field.Interface()))
-}
-
-// isIsoBicFormat is the validation function for validating if the current field's value is a valid Business Identifier Code (SWIFT code), defined in ISO 9362
-func isIsoBicFormat(fl FieldLevel) bool {
- bicString := fl.Field().String()
-
- return bicRegex().MatchString(bicString)
-}
-
-// isSemverFormat is the validation function for validating if the current field's value is a valid semver version, defined in Semantic Versioning 2.0.0
-func isSemverFormat(fl FieldLevel) bool {
- semverString := fl.Field().String()
-
- 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.
-func isDnsRFC1035LabelFormat(fl FieldLevel) bool {
- val := fl.Field().String()
- 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
-}
-
-// isMongoDBObjectId is the validation function for validating if the current field's value is valid MongoDB ObjectID
-func isMongoDBObjectId(fl FieldLevel) bool {
- val := fl.Field().String()
- return mongodbIdRegex().MatchString(val)
-}
-
-// isMongoDBConnectionString is the validation function for validating if the current field's value is valid MongoDB Connection String
-func isMongoDBConnectionString(fl FieldLevel) bool {
- val := fl.Field().String()
- return mongodbConnectionRegex().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()
- var creditCard bytes.Buffer
- segments := strings.Split(val, " ")
- for _, segment := range segments {
- if len(segment) < 3 {
- return false
- }
- creditCard.WriteString(segment)
- }
-
- ccDigits := strings.Split(creditCard.String(), "")
- size := len(ccDigits)
- if size < 12 || size > 19 {
- return false
- }
-
- 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)
-}
diff --git a/vendor/github.com/go-playground/validator/v10/cache.go b/vendor/github.com/go-playground/validator/v10/cache.go
deleted file mode 100644
index 2063e1b79..000000000
--- a/vendor/github.com/go-playground/validator/v10/cache.go
+++ /dev/null
@@ -1,332 +0,0 @@
-package validator
-
-import (
- "fmt"
- "reflect"
- "strings"
- "sync"
- "sync/atomic"
-)
-
-type tagType uint8
-
-const (
- typeDefault tagType = iota
- typeOmitEmpty
- typeIsDefault
- typeNoStructLevel
- typeStructOnly
- typeDive
- typeOr
- typeKeys
- typeEndKeys
- typeOmitNil
-)
-
-const (
- invalidValidation = "Invalid validation tag on field '%s'"
- undefinedValidation = "Undefined validation function '%s' on field '%s'"
- keysTagNotDefined = "'" + endKeysTag + "' tag encountered without a corresponding '" + keysTag + "' tag"
-)
-
-type structCache struct {
- lock sync.Mutex
- m atomic.Value // map[reflect.Type]*cStruct
-}
-
-func (sc *structCache) Get(key reflect.Type) (c *cStruct, found bool) {
- c, found = sc.m.Load().(map[reflect.Type]*cStruct)[key]
- return
-}
-
-func (sc *structCache) Set(key reflect.Type, value *cStruct) {
- m := sc.m.Load().(map[reflect.Type]*cStruct)
- nm := make(map[reflect.Type]*cStruct, len(m)+1)
- for k, v := range m {
- nm[k] = v
- }
- nm[key] = value
- sc.m.Store(nm)
-}
-
-type tagCache struct {
- lock sync.Mutex
- m atomic.Value // map[string]*cTag
-}
-
-func (tc *tagCache) Get(key string) (c *cTag, found bool) {
- c, found = tc.m.Load().(map[string]*cTag)[key]
- return
-}
-
-func (tc *tagCache) Set(key string, value *cTag) {
- m := tc.m.Load().(map[string]*cTag)
- nm := make(map[string]*cTag, len(m)+1)
- for k, v := range m {
- nm[k] = v
- }
- nm[key] = value
- tc.m.Store(nm)
-}
-
-type cStruct struct {
- name string
- fields []*cField
- fn StructLevelFuncCtx
-}
-
-type cField struct {
- idx int
- name string
- altName string
- namesEqual bool
- cTags *cTag
-}
-
-type cTag struct {
- tag string
- aliasTag string
- actualAliasTag string
- param string
- keys *cTag // only populated when using tag's 'keys' and 'endkeys' for map key validation
- next *cTag
- fn FuncCtx
- typeof tagType
- hasTag bool
- hasAlias bool
- hasParam bool // true if parameter used eg. eq= where the equal sign has been set
- isBlockEnd bool // indicates the current tag represents the last validation in the block
- runValidationWhenNil bool
-}
-
-func (v *Validate) extractStructCache(current reflect.Value, sName string) *cStruct {
- v.structCache.lock.Lock()
- defer v.structCache.lock.Unlock() // leave as defer! because if inner panics, it will never get unlocked otherwise!
-
- typ := current.Type()
-
- // could have been multiple trying to access, but once first is done this ensures struct
- // isn't parsed again.
- cs, ok := v.structCache.Get(typ)
- if ok {
- return cs
- }
-
- cs = &cStruct{name: sName, fields: make([]*cField, 0), fn: v.structLevelFuncs[typ]}
-
- numFields := current.NumField()
- rules := v.rules[typ]
-
- var ctag *cTag
- var fld reflect.StructField
- var tag string
- var customName string
-
- for i := 0; i < numFields; i++ {
-
- fld = typ.Field(i)
-
- if !v.privateFieldValidation && !fld.Anonymous && len(fld.PkgPath) > 0 {
- continue
- }
-
- if rtag, ok := rules[fld.Name]; ok {
- tag = rtag
- } else {
- tag = fld.Tag.Get(v.tagName)
- }
-
- if tag == skipValidationTag {
- continue
- }
-
- customName = fld.Name
-
- if v.hasTagNameFunc {
- name := v.tagNameFunc(fld)
- if len(name) > 0 {
- customName = name
- }
- }
-
- // NOTE: cannot use shared tag cache, because tags may be equal, but things like alias may be different
- // and so only struct level caching can be used instead of combined with Field tag caching
-
- if len(tag) > 0 {
- ctag, _ = v.parseFieldTagsRecursive(tag, fld.Name, "", false)
- } else {
- // even if field doesn't have validations need cTag for traversing to potential inner/nested
- // elements of the field.
- ctag = new(cTag)
- }
-
- cs.fields = append(cs.fields, &cField{
- idx: i,
- name: fld.Name,
- altName: customName,
- cTags: ctag,
- namesEqual: fld.Name == customName,
- })
- }
- v.structCache.Set(typ, cs)
- return cs
-}
-
-func (v *Validate) parseFieldTagsRecursive(tag string, fieldName string, alias string, hasAlias bool) (firstCtag *cTag, current *cTag) {
- var t string
- noAlias := len(alias) == 0
- tags := strings.Split(tag, tagSeparator)
-
- for i := 0; i < len(tags); i++ {
- t = tags[i]
- if noAlias {
- alias = t
- }
-
- // check map for alias and process new tags, otherwise process as usual
- if tagsVal, found := v.aliases[t]; found {
- if i == 0 {
- firstCtag, current = v.parseFieldTagsRecursive(tagsVal, fieldName, t, true)
- } else {
- next, curr := v.parseFieldTagsRecursive(tagsVal, fieldName, t, true)
- current.next, current = next, curr
-
- }
- continue
- }
-
- var prevTag tagType
-
- if i == 0 {
- current = &cTag{aliasTag: alias, hasAlias: hasAlias, hasTag: true, typeof: typeDefault}
- firstCtag = current
- } else {
- prevTag = current.typeof
- current.next = &cTag{aliasTag: alias, hasAlias: hasAlias, hasTag: true}
- current = current.next
- }
-
- switch t {
- case diveTag:
- current.typeof = typeDive
- continue
-
- case keysTag:
- current.typeof = typeKeys
-
- if i == 0 || prevTag != typeDive {
- panic(fmt.Sprintf("'%s' tag must be immediately preceded by the '%s' tag", keysTag, diveTag))
- }
-
- current.typeof = typeKeys
-
- // need to pass along only keys tag
- // need to increment i to skip over the keys tags
- b := make([]byte, 0, 64)
-
- i++
-
- for ; i < len(tags); i++ {
-
- b = append(b, tags[i]...)
- b = append(b, ',')
-
- if tags[i] == endKeysTag {
- break
- }
- }
-
- current.keys, _ = v.parseFieldTagsRecursive(string(b[:len(b)-1]), fieldName, "", false)
- continue
-
- case endKeysTag:
- current.typeof = typeEndKeys
-
- // if there are more in tags then there was no keysTag defined
- // and an error should be thrown
- if i != len(tags)-1 {
- panic(keysTagNotDefined)
- }
- return
-
- case omitempty:
- current.typeof = typeOmitEmpty
- continue
-
- case omitnil:
- current.typeof = typeOmitNil
- continue
-
- case structOnlyTag:
- current.typeof = typeStructOnly
- continue
-
- case noStructLevelTag:
- current.typeof = typeNoStructLevel
- continue
-
- default:
- if t == isdefault {
- current.typeof = typeIsDefault
- }
- // if a pipe character is needed within the param you must use the utf8Pipe representation "0x7C"
- orVals := strings.Split(t, orSeparator)
-
- for j := 0; j < len(orVals); j++ {
- vals := strings.SplitN(orVals[j], tagKeySeparator, 2)
- if noAlias {
- alias = vals[0]
- current.aliasTag = alias
- } else {
- current.actualAliasTag = t
- }
-
- if j > 0 {
- current.next = &cTag{aliasTag: alias, actualAliasTag: current.actualAliasTag, hasAlias: hasAlias, hasTag: true}
- current = current.next
- }
- current.hasParam = len(vals) > 1
-
- current.tag = vals[0]
- if len(current.tag) == 0 {
- panic(strings.TrimSpace(fmt.Sprintf(invalidValidation, fieldName)))
- }
-
- if wrapper, ok := v.validations[current.tag]; ok {
- current.fn = wrapper.fn
- current.runValidationWhenNil = wrapper.runValidationOnNil
- } else {
- panic(strings.TrimSpace(fmt.Sprintf(undefinedValidation, current.tag, fieldName)))
- }
-
- if len(orVals) > 1 {
- current.typeof = typeOr
- }
-
- if len(vals) > 1 {
- current.param = strings.Replace(strings.Replace(vals[1], utf8HexComma, ",", -1), utf8Pipe, "|", -1)
- }
- }
- current.isBlockEnd = true
- }
- }
- return
-}
-
-func (v *Validate) fetchCacheTag(tag string) *cTag {
- // find cached tag
- ctag, found := v.tagCache.Get(tag)
- if !found {
- v.tagCache.lock.Lock()
- defer v.tagCache.lock.Unlock()
-
- // could have been multiple trying to access, but once first is done this ensures tag
- // isn't parsed again.
- ctag, found = v.tagCache.Get(tag)
- if !found {
- ctag, _ = v.parseFieldTagsRecursive(tag, "", "", false)
- v.tagCache.Set(tag, ctag)
- }
- }
- return ctag
-}
diff --git a/vendor/github.com/go-playground/validator/v10/country_codes.go b/vendor/github.com/go-playground/validator/v10/country_codes.go
deleted file mode 100644
index b5f10d3c1..000000000
--- a/vendor/github.com/go-playground/validator/v10/country_codes.go
+++ /dev/null
@@ -1,1177 +0,0 @@
-package validator
-
-var iso3166_1_alpha2 = map[string]struct{}{
- // see: https://www.iso.org/iso-3166-country-codes.html
- "AF": {}, "AX": {}, "AL": {}, "DZ": {}, "AS": {},
- "AD": {}, "AO": {}, "AI": {}, "AQ": {}, "AG": {},
- "AR": {}, "AM": {}, "AW": {}, "AU": {}, "AT": {},
- "AZ": {}, "BS": {}, "BH": {}, "BD": {}, "BB": {},
- "BY": {}, "BE": {}, "BZ": {}, "BJ": {}, "BM": {},
- "BT": {}, "BO": {}, "BQ": {}, "BA": {}, "BW": {},
- "BV": {}, "BR": {}, "IO": {}, "BN": {}, "BG": {},
- "BF": {}, "BI": {}, "KH": {}, "CM": {}, "CA": {},
- "CV": {}, "KY": {}, "CF": {}, "TD": {}, "CL": {},
- "CN": {}, "CX": {}, "CC": {}, "CO": {}, "KM": {},
- "CG": {}, "CD": {}, "CK": {}, "CR": {}, "CI": {},
- "HR": {}, "CU": {}, "CW": {}, "CY": {}, "CZ": {},
- "DK": {}, "DJ": {}, "DM": {}, "DO": {}, "EC": {},
- "EG": {}, "SV": {}, "GQ": {}, "ER": {}, "EE": {},
- "ET": {}, "FK": {}, "FO": {}, "FJ": {}, "FI": {},
- "FR": {}, "GF": {}, "PF": {}, "TF": {}, "GA": {},
- "GM": {}, "GE": {}, "DE": {}, "GH": {}, "GI": {},
- "GR": {}, "GL": {}, "GD": {}, "GP": {}, "GU": {},
- "GT": {}, "GG": {}, "GN": {}, "GW": {}, "GY": {},
- "HT": {}, "HM": {}, "VA": {}, "HN": {}, "HK": {},
- "HU": {}, "IS": {}, "IN": {}, "ID": {}, "IR": {},
- "IQ": {}, "IE": {}, "IM": {}, "IL": {}, "IT": {},
- "JM": {}, "JP": {}, "JE": {}, "JO": {}, "KZ": {},
- "KE": {}, "KI": {}, "KP": {}, "KR": {}, "KW": {},
- "KG": {}, "LA": {}, "LV": {}, "LB": {}, "LS": {},
- "LR": {}, "LY": {}, "LI": {}, "LT": {}, "LU": {},
- "MO": {}, "MK": {}, "MG": {}, "MW": {}, "MY": {},
- "MV": {}, "ML": {}, "MT": {}, "MH": {}, "MQ": {},
- "MR": {}, "MU": {}, "YT": {}, "MX": {}, "FM": {},
- "MD": {}, "MC": {}, "MN": {}, "ME": {}, "MS": {},
- "MA": {}, "MZ": {}, "MM": {}, "NA": {}, "NR": {},
- "NP": {}, "NL": {}, "NC": {}, "NZ": {}, "NI": {},
- "NE": {}, "NG": {}, "NU": {}, "NF": {}, "MP": {},
- "NO": {}, "OM": {}, "PK": {}, "PW": {}, "PS": {},
- "PA": {}, "PG": {}, "PY": {}, "PE": {}, "PH": {},
- "PN": {}, "PL": {}, "PT": {}, "PR": {}, "QA": {},
- "RE": {}, "RO": {}, "RU": {}, "RW": {}, "BL": {},
- "SH": {}, "KN": {}, "LC": {}, "MF": {}, "PM": {},
- "VC": {}, "WS": {}, "SM": {}, "ST": {}, "SA": {},
- "SN": {}, "RS": {}, "SC": {}, "SL": {}, "SG": {},
- "SX": {}, "SK": {}, "SI": {}, "SB": {}, "SO": {},
- "ZA": {}, "GS": {}, "SS": {}, "ES": {}, "LK": {},
- "SD": {}, "SR": {}, "SJ": {}, "SZ": {}, "SE": {},
- "CH": {}, "SY": {}, "TW": {}, "TJ": {}, "TZ": {},
- "TH": {}, "TL": {}, "TG": {}, "TK": {}, "TO": {},
- "TT": {}, "TN": {}, "TR": {}, "TM": {}, "TC": {},
- "TV": {}, "UG": {}, "UA": {}, "AE": {}, "GB": {},
- "US": {}, "UM": {}, "UY": {}, "UZ": {}, "VU": {},
- "VE": {}, "VN": {}, "VG": {}, "VI": {}, "WF": {},
- "EH": {}, "YE": {}, "ZM": {}, "ZW": {}, "XK": {},
-}
-
-var iso3166_1_alpha2_eu = map[string]struct{}{
- "AT": {}, "BE": {}, "BG": {}, "HR": {}, "CY": {},
- "CZ": {}, "DK": {}, "EE": {}, "FI": {}, "FR": {},
- "DE": {}, "GR": {}, "HU": {}, "IE": {}, "IT": {},
- "LV": {}, "LT": {}, "LU": {}, "MT": {}, "NL": {},
- "PL": {}, "PT": {}, "RO": {}, "SK": {}, "SI": {},
- "ES": {}, "SE": {},
-}
-
-var iso3166_1_alpha3 = map[string]struct{}{
- // see: https://www.iso.org/iso-3166-country-codes.html
- "AFG": {}, "ALB": {}, "DZA": {}, "ASM": {}, "AND": {},
- "AGO": {}, "AIA": {}, "ATA": {}, "ATG": {}, "ARG": {},
- "ARM": {}, "ABW": {}, "AUS": {}, "AUT": {}, "AZE": {},
- "BHS": {}, "BHR": {}, "BGD": {}, "BRB": {}, "BLR": {},
- "BEL": {}, "BLZ": {}, "BEN": {}, "BMU": {}, "BTN": {},
- "BOL": {}, "BES": {}, "BIH": {}, "BWA": {}, "BVT": {},
- "BRA": {}, "IOT": {}, "BRN": {}, "BGR": {}, "BFA": {},
- "BDI": {}, "CPV": {}, "KHM": {}, "CMR": {}, "CAN": {},
- "CYM": {}, "CAF": {}, "TCD": {}, "CHL": {}, "CHN": {},
- "CXR": {}, "CCK": {}, "COL": {}, "COM": {}, "COD": {},
- "COG": {}, "COK": {}, "CRI": {}, "HRV": {}, "CUB": {},
- "CUW": {}, "CYP": {}, "CZE": {}, "CIV": {}, "DNK": {},
- "DJI": {}, "DMA": {}, "DOM": {}, "ECU": {}, "EGY": {},
- "SLV": {}, "GNQ": {}, "ERI": {}, "EST": {}, "SWZ": {},
- "ETH": {}, "FLK": {}, "FRO": {}, "FJI": {}, "FIN": {},
- "FRA": {}, "GUF": {}, "PYF": {}, "ATF": {}, "GAB": {},
- "GMB": {}, "GEO": {}, "DEU": {}, "GHA": {}, "GIB": {},
- "GRC": {}, "GRL": {}, "GRD": {}, "GLP": {}, "GUM": {},
- "GTM": {}, "GGY": {}, "GIN": {}, "GNB": {}, "GUY": {},
- "HTI": {}, "HMD": {}, "VAT": {}, "HND": {}, "HKG": {},
- "HUN": {}, "ISL": {}, "IND": {}, "IDN": {}, "IRN": {},
- "IRQ": {}, "IRL": {}, "IMN": {}, "ISR": {}, "ITA": {},
- "JAM": {}, "JPN": {}, "JEY": {}, "JOR": {}, "KAZ": {},
- "KEN": {}, "KIR": {}, "PRK": {}, "KOR": {}, "KWT": {},
- "KGZ": {}, "LAO": {}, "LVA": {}, "LBN": {}, "LSO": {},
- "LBR": {}, "LBY": {}, "LIE": {}, "LTU": {}, "LUX": {},
- "MAC": {}, "MDG": {}, "MWI": {}, "MYS": {}, "MDV": {},
- "MLI": {}, "MLT": {}, "MHL": {}, "MTQ": {}, "MRT": {},
- "MUS": {}, "MYT": {}, "MEX": {}, "FSM": {}, "MDA": {},
- "MCO": {}, "MNG": {}, "MNE": {}, "MSR": {}, "MAR": {},
- "MOZ": {}, "MMR": {}, "NAM": {}, "NRU": {}, "NPL": {},
- "NLD": {}, "NCL": {}, "NZL": {}, "NIC": {}, "NER": {},
- "NGA": {}, "NIU": {}, "NFK": {}, "MKD": {}, "MNP": {},
- "NOR": {}, "OMN": {}, "PAK": {}, "PLW": {}, "PSE": {},
- "PAN": {}, "PNG": {}, "PRY": {}, "PER": {}, "PHL": {},
- "PCN": {}, "POL": {}, "PRT": {}, "PRI": {}, "QAT": {},
- "ROU": {}, "RUS": {}, "RWA": {}, "REU": {}, "BLM": {},
- "SHN": {}, "KNA": {}, "LCA": {}, "MAF": {}, "SPM": {},
- "VCT": {}, "WSM": {}, "SMR": {}, "STP": {}, "SAU": {},
- "SEN": {}, "SRB": {}, "SYC": {}, "SLE": {}, "SGP": {},
- "SXM": {}, "SVK": {}, "SVN": {}, "SLB": {}, "SOM": {},
- "ZAF": {}, "SGS": {}, "SSD": {}, "ESP": {}, "LKA": {},
- "SDN": {}, "SUR": {}, "SJM": {}, "SWE": {}, "CHE": {},
- "SYR": {}, "TWN": {}, "TJK": {}, "TZA": {}, "THA": {},
- "TLS": {}, "TGO": {}, "TKL": {}, "TON": {}, "TTO": {},
- "TUN": {}, "TUR": {}, "TKM": {}, "TCA": {}, "TUV": {},
- "UGA": {}, "UKR": {}, "ARE": {}, "GBR": {}, "UMI": {},
- "USA": {}, "URY": {}, "UZB": {}, "VUT": {}, "VEN": {},
- "VNM": {}, "VGB": {}, "VIR": {}, "WLF": {}, "ESH": {},
- "YEM": {}, "ZMB": {}, "ZWE": {}, "ALA": {}, "UNK": {},
-}
-
-var iso3166_1_alpha3_eu = map[string]struct{}{
- "AUT": {}, "BEL": {}, "BGR": {}, "HRV": {}, "CYP": {},
- "CZE": {}, "DNK": {}, "EST": {}, "FIN": {}, "FRA": {},
- "DEU": {}, "GRC": {}, "HUN": {}, "IRL": {}, "ITA": {},
- "LVA": {}, "LTU": {}, "LUX": {}, "MLT": {}, "NLD": {},
- "POL": {}, "PRT": {}, "ROU": {}, "SVK": {}, "SVN": {},
- "ESP": {}, "SWE": {},
-}
-var iso3166_1_alpha_numeric = map[int]struct{}{
- // see: https://www.iso.org/iso-3166-country-codes.html
- 4: {}, 8: {}, 12: {}, 16: {}, 20: {},
- 24: {}, 660: {}, 10: {}, 28: {}, 32: {},
- 51: {}, 533: {}, 36: {}, 40: {}, 31: {},
- 44: {}, 48: {}, 50: {}, 52: {}, 112: {},
- 56: {}, 84: {}, 204: {}, 60: {}, 64: {},
- 68: {}, 535: {}, 70: {}, 72: {}, 74: {},
- 76: {}, 86: {}, 96: {}, 100: {}, 854: {},
- 108: {}, 132: {}, 116: {}, 120: {}, 124: {},
- 136: {}, 140: {}, 148: {}, 152: {}, 156: {},
- 162: {}, 166: {}, 170: {}, 174: {}, 180: {},
- 178: {}, 184: {}, 188: {}, 191: {}, 192: {},
- 531: {}, 196: {}, 203: {}, 384: {}, 208: {},
- 262: {}, 212: {}, 214: {}, 218: {}, 818: {},
- 222: {}, 226: {}, 232: {}, 233: {}, 748: {},
- 231: {}, 238: {}, 234: {}, 242: {}, 246: {},
- 250: {}, 254: {}, 258: {}, 260: {}, 266: {},
- 270: {}, 268: {}, 276: {}, 288: {}, 292: {},
- 300: {}, 304: {}, 308: {}, 312: {}, 316: {},
- 320: {}, 831: {}, 324: {}, 624: {}, 328: {},
- 332: {}, 334: {}, 336: {}, 340: {}, 344: {},
- 348: {}, 352: {}, 356: {}, 360: {}, 364: {},
- 368: {}, 372: {}, 833: {}, 376: {}, 380: {},
- 388: {}, 392: {}, 832: {}, 400: {}, 398: {},
- 404: {}, 296: {}, 408: {}, 410: {}, 414: {},
- 417: {}, 418: {}, 428: {}, 422: {}, 426: {},
- 430: {}, 434: {}, 438: {}, 440: {}, 442: {},
- 446: {}, 450: {}, 454: {}, 458: {}, 462: {},
- 466: {}, 470: {}, 584: {}, 474: {}, 478: {},
- 480: {}, 175: {}, 484: {}, 583: {}, 498: {},
- 492: {}, 496: {}, 499: {}, 500: {}, 504: {},
- 508: {}, 104: {}, 516: {}, 520: {}, 524: {},
- 528: {}, 540: {}, 554: {}, 558: {}, 562: {},
- 566: {}, 570: {}, 574: {}, 807: {}, 580: {},
- 578: {}, 512: {}, 586: {}, 585: {}, 275: {},
- 591: {}, 598: {}, 600: {}, 604: {}, 608: {},
- 612: {}, 616: {}, 620: {}, 630: {}, 634: {},
- 642: {}, 643: {}, 646: {}, 638: {}, 652: {},
- 654: {}, 659: {}, 662: {}, 663: {}, 666: {},
- 670: {}, 882: {}, 674: {}, 678: {}, 682: {},
- 686: {}, 688: {}, 690: {}, 694: {}, 702: {},
- 534: {}, 703: {}, 705: {}, 90: {}, 706: {},
- 710: {}, 239: {}, 728: {}, 724: {}, 144: {},
- 729: {}, 740: {}, 744: {}, 752: {}, 756: {},
- 760: {}, 158: {}, 762: {}, 834: {}, 764: {},
- 626: {}, 768: {}, 772: {}, 776: {}, 780: {},
- 788: {}, 792: {}, 795: {}, 796: {}, 798: {},
- 800: {}, 804: {}, 784: {}, 826: {}, 581: {},
- 840: {}, 858: {}, 860: {}, 548: {}, 862: {},
- 704: {}, 92: {}, 850: {}, 876: {}, 732: {},
- 887: {}, 894: {}, 716: {}, 248: {}, 153: {},
-}
-
-var iso3166_1_alpha_numeric_eu = map[int]struct{}{
- 40: {}, 56: {}, 100: {}, 191: {}, 196: {},
- 200: {}, 208: {}, 233: {}, 246: {}, 250: {},
- 276: {}, 300: {}, 348: {}, 372: {}, 380: {},
- 428: {}, 440: {}, 442: {}, 470: {}, 528: {},
- 616: {}, 620: {}, 642: {}, 703: {}, 705: {},
- 724: {}, 752: {},
-}
-
-var iso3166_2 = map[string]struct{}{
- "AD-02": {}, "AD-03": {}, "AD-04": {}, "AD-05": {}, "AD-06": {},
- "AD-07": {}, "AD-08": {}, "AE-AJ": {}, "AE-AZ": {}, "AE-DU": {},
- "AE-FU": {}, "AE-RK": {}, "AE-SH": {}, "AE-UQ": {}, "AF-BAL": {},
- "AF-BAM": {}, "AF-BDG": {}, "AF-BDS": {}, "AF-BGL": {}, "AF-DAY": {},
- "AF-FRA": {}, "AF-FYB": {}, "AF-GHA": {}, "AF-GHO": {}, "AF-HEL": {},
- "AF-HER": {}, "AF-JOW": {}, "AF-KAB": {}, "AF-KAN": {}, "AF-KAP": {},
- "AF-KDZ": {}, "AF-KHO": {}, "AF-KNR": {}, "AF-LAG": {}, "AF-LOG": {},
- "AF-NAN": {}, "AF-NIM": {}, "AF-NUR": {}, "AF-PAN": {}, "AF-PAR": {},
- "AF-PIA": {}, "AF-PKA": {}, "AF-SAM": {}, "AF-SAR": {}, "AF-TAK": {},
- "AF-URU": {}, "AF-WAR": {}, "AF-ZAB": {}, "AG-03": {}, "AG-04": {},
- "AG-05": {}, "AG-06": {}, "AG-07": {}, "AG-08": {}, "AG-10": {},
- "AG-11": {}, "AL-01": {}, "AL-02": {}, "AL-03": {}, "AL-04": {},
- "AL-05": {}, "AL-06": {}, "AL-07": {}, "AL-08": {}, "AL-09": {},
- "AL-10": {}, "AL-11": {}, "AL-12": {}, "AL-BR": {}, "AL-BU": {},
- "AL-DI": {}, "AL-DL": {}, "AL-DR": {}, "AL-DV": {}, "AL-EL": {},
- "AL-ER": {}, "AL-FR": {}, "AL-GJ": {}, "AL-GR": {}, "AL-HA": {},
- "AL-KA": {}, "AL-KB": {}, "AL-KC": {}, "AL-KO": {}, "AL-KR": {},
- "AL-KU": {}, "AL-LB": {}, "AL-LE": {}, "AL-LU": {}, "AL-MK": {},
- "AL-MM": {}, "AL-MR": {}, "AL-MT": {}, "AL-PG": {}, "AL-PQ": {},
- "AL-PR": {}, "AL-PU": {}, "AL-SH": {}, "AL-SK": {}, "AL-SR": {},
- "AL-TE": {}, "AL-TP": {}, "AL-TR": {}, "AL-VL": {}, "AM-AG": {},
- "AM-AR": {}, "AM-AV": {}, "AM-ER": {}, "AM-GR": {}, "AM-KT": {},
- "AM-LO": {}, "AM-SH": {}, "AM-SU": {}, "AM-TV": {}, "AM-VD": {},
- "AO-BGO": {}, "AO-BGU": {}, "AO-BIE": {}, "AO-CAB": {}, "AO-CCU": {},
- "AO-CNN": {}, "AO-CNO": {}, "AO-CUS": {}, "AO-HUA": {}, "AO-HUI": {},
- "AO-LNO": {}, "AO-LSU": {}, "AO-LUA": {}, "AO-MAL": {}, "AO-MOX": {},
- "AO-NAM": {}, "AO-UIG": {}, "AO-ZAI": {}, "AR-A": {}, "AR-B": {},
- "AR-C": {}, "AR-D": {}, "AR-E": {}, "AR-F": {}, "AR-G": {}, "AR-H": {},
- "AR-J": {}, "AR-K": {}, "AR-L": {}, "AR-M": {}, "AR-N": {},
- "AR-P": {}, "AR-Q": {}, "AR-R": {}, "AR-S": {}, "AR-T": {},
- "AR-U": {}, "AR-V": {}, "AR-W": {}, "AR-X": {}, "AR-Y": {},
- "AR-Z": {}, "AT-1": {}, "AT-2": {}, "AT-3": {}, "AT-4": {},
- "AT-5": {}, "AT-6": {}, "AT-7": {}, "AT-8": {}, "AT-9": {},
- "AU-ACT": {}, "AU-NSW": {}, "AU-NT": {}, "AU-QLD": {}, "AU-SA": {},
- "AU-TAS": {}, "AU-VIC": {}, "AU-WA": {}, "AZ-ABS": {}, "AZ-AGA": {},
- "AZ-AGC": {}, "AZ-AGM": {}, "AZ-AGS": {}, "AZ-AGU": {}, "AZ-AST": {},
- "AZ-BA": {}, "AZ-BAB": {}, "AZ-BAL": {}, "AZ-BAR": {}, "AZ-BEY": {},
- "AZ-BIL": {}, "AZ-CAB": {}, "AZ-CAL": {}, "AZ-CUL": {}, "AZ-DAS": {},
- "AZ-FUZ": {}, "AZ-GA": {}, "AZ-GAD": {}, "AZ-GOR": {}, "AZ-GOY": {},
- "AZ-GYG": {}, "AZ-HAC": {}, "AZ-IMI": {}, "AZ-ISM": {}, "AZ-KAL": {},
- "AZ-KAN": {}, "AZ-KUR": {}, "AZ-LA": {}, "AZ-LAC": {}, "AZ-LAN": {},
- "AZ-LER": {}, "AZ-MAS": {}, "AZ-MI": {}, "AZ-NA": {}, "AZ-NEF": {},
- "AZ-NV": {}, "AZ-NX": {}, "AZ-OGU": {}, "AZ-ORD": {}, "AZ-QAB": {},
- "AZ-QAX": {}, "AZ-QAZ": {}, "AZ-QBA": {}, "AZ-QBI": {}, "AZ-QOB": {},
- "AZ-QUS": {}, "AZ-SA": {}, "AZ-SAB": {}, "AZ-SAD": {}, "AZ-SAH": {},
- "AZ-SAK": {}, "AZ-SAL": {}, "AZ-SAR": {}, "AZ-SAT": {}, "AZ-SBN": {},
- "AZ-SIY": {}, "AZ-SKR": {}, "AZ-SM": {}, "AZ-SMI": {}, "AZ-SMX": {},
- "AZ-SR": {}, "AZ-SUS": {}, "AZ-TAR": {}, "AZ-TOV": {}, "AZ-UCA": {},
- "AZ-XA": {}, "AZ-XAC": {}, "AZ-XCI": {}, "AZ-XIZ": {}, "AZ-XVD": {},
- "AZ-YAR": {}, "AZ-YE": {}, "AZ-YEV": {}, "AZ-ZAN": {}, "AZ-ZAQ": {},
- "AZ-ZAR": {}, "BA-01": {}, "BA-02": {}, "BA-03": {}, "BA-04": {},
- "BA-05": {}, "BA-06": {}, "BA-07": {}, "BA-08": {}, "BA-09": {},
- "BA-10": {}, "BA-BIH": {}, "BA-BRC": {}, "BA-SRP": {}, "BB-01": {},
- "BB-02": {}, "BB-03": {}, "BB-04": {}, "BB-05": {}, "BB-06": {},
- "BB-07": {}, "BB-08": {}, "BB-09": {}, "BB-10": {}, "BB-11": {},
- "BD-01": {}, "BD-02": {}, "BD-03": {}, "BD-04": {}, "BD-05": {},
- "BD-06": {}, "BD-07": {}, "BD-08": {}, "BD-09": {}, "BD-10": {},
- "BD-11": {}, "BD-12": {}, "BD-13": {}, "BD-14": {}, "BD-15": {},
- "BD-16": {}, "BD-17": {}, "BD-18": {}, "BD-19": {}, "BD-20": {},
- "BD-21": {}, "BD-22": {}, "BD-23": {}, "BD-24": {}, "BD-25": {},
- "BD-26": {}, "BD-27": {}, "BD-28": {}, "BD-29": {}, "BD-30": {},
- "BD-31": {}, "BD-32": {}, "BD-33": {}, "BD-34": {}, "BD-35": {},
- "BD-36": {}, "BD-37": {}, "BD-38": {}, "BD-39": {}, "BD-40": {},
- "BD-41": {}, "BD-42": {}, "BD-43": {}, "BD-44": {}, "BD-45": {},
- "BD-46": {}, "BD-47": {}, "BD-48": {}, "BD-49": {}, "BD-50": {},
- "BD-51": {}, "BD-52": {}, "BD-53": {}, "BD-54": {}, "BD-55": {},
- "BD-56": {}, "BD-57": {}, "BD-58": {}, "BD-59": {}, "BD-60": {},
- "BD-61": {}, "BD-62": {}, "BD-63": {}, "BD-64": {}, "BD-A": {},
- "BD-B": {}, "BD-C": {}, "BD-D": {}, "BD-E": {}, "BD-F": {},
- "BD-G": {}, "BE-BRU": {}, "BE-VAN": {}, "BE-VBR": {}, "BE-VLG": {},
- "BE-VLI": {}, "BE-VOV": {}, "BE-VWV": {}, "BE-WAL": {}, "BE-WBR": {},
- "BE-WHT": {}, "BE-WLG": {}, "BE-WLX": {}, "BE-WNA": {}, "BF-01": {},
- "BF-02": {}, "BF-03": {}, "BF-04": {}, "BF-05": {}, "BF-06": {},
- "BF-07": {}, "BF-08": {}, "BF-09": {}, "BF-10": {}, "BF-11": {},
- "BF-12": {}, "BF-13": {}, "BF-BAL": {}, "BF-BAM": {}, "BF-BAN": {},
- "BF-BAZ": {}, "BF-BGR": {}, "BF-BLG": {}, "BF-BLK": {}, "BF-COM": {},
- "BF-GAN": {}, "BF-GNA": {}, "BF-GOU": {}, "BF-HOU": {}, "BF-IOB": {},
- "BF-KAD": {}, "BF-KEN": {}, "BF-KMD": {}, "BF-KMP": {}, "BF-KOP": {},
- "BF-KOS": {}, "BF-KOT": {}, "BF-KOW": {}, "BF-LER": {}, "BF-LOR": {},
- "BF-MOU": {}, "BF-NAM": {}, "BF-NAO": {}, "BF-NAY": {}, "BF-NOU": {},
- "BF-OUB": {}, "BF-OUD": {}, "BF-PAS": {}, "BF-PON": {}, "BF-SEN": {},
- "BF-SIS": {}, "BF-SMT": {}, "BF-SNG": {}, "BF-SOM": {}, "BF-SOR": {},
- "BF-TAP": {}, "BF-TUI": {}, "BF-YAG": {}, "BF-YAT": {}, "BF-ZIR": {},
- "BF-ZON": {}, "BF-ZOU": {}, "BG-01": {}, "BG-02": {}, "BG-03": {},
- "BG-04": {}, "BG-05": {}, "BG-06": {}, "BG-07": {}, "BG-08": {},
- "BG-09": {}, "BG-10": {}, "BG-11": {}, "BG-12": {}, "BG-13": {},
- "BG-14": {}, "BG-15": {}, "BG-16": {}, "BG-17": {}, "BG-18": {},
- "BG-19": {}, "BG-20": {}, "BG-21": {}, "BG-22": {}, "BG-23": {},
- "BG-24": {}, "BG-25": {}, "BG-26": {}, "BG-27": {}, "BG-28": {},
- "BH-13": {}, "BH-14": {}, "BH-15": {}, "BH-16": {}, "BH-17": {},
- "BI-BB": {}, "BI-BL": {}, "BI-BM": {}, "BI-BR": {}, "BI-CA": {},
- "BI-CI": {}, "BI-GI": {}, "BI-KI": {}, "BI-KR": {}, "BI-KY": {},
- "BI-MA": {}, "BI-MU": {}, "BI-MW": {}, "BI-NG": {}, "BI-RM": {}, "BI-RT": {},
- "BI-RY": {}, "BJ-AK": {}, "BJ-AL": {}, "BJ-AQ": {}, "BJ-BO": {},
- "BJ-CO": {}, "BJ-DO": {}, "BJ-KO": {}, "BJ-LI": {}, "BJ-MO": {},
- "BJ-OU": {}, "BJ-PL": {}, "BJ-ZO": {}, "BN-BE": {}, "BN-BM": {},
- "BN-TE": {}, "BN-TU": {}, "BO-B": {}, "BO-C": {}, "BO-H": {},
- "BO-L": {}, "BO-N": {}, "BO-O": {}, "BO-P": {}, "BO-S": {},
- "BO-T": {}, "BQ-BO": {}, "BQ-SA": {}, "BQ-SE": {}, "BR-AC": {},
- "BR-AL": {}, "BR-AM": {}, "BR-AP": {}, "BR-BA": {}, "BR-CE": {},
- "BR-DF": {}, "BR-ES": {}, "BR-FN": {}, "BR-GO": {}, "BR-MA": {},
- "BR-MG": {}, "BR-MS": {}, "BR-MT": {}, "BR-PA": {}, "BR-PB": {},
- "BR-PE": {}, "BR-PI": {}, "BR-PR": {}, "BR-RJ": {}, "BR-RN": {},
- "BR-RO": {}, "BR-RR": {}, "BR-RS": {}, "BR-SC": {}, "BR-SE": {},
- "BR-SP": {}, "BR-TO": {}, "BS-AK": {}, "BS-BI": {}, "BS-BP": {},
- "BS-BY": {}, "BS-CE": {}, "BS-CI": {}, "BS-CK": {}, "BS-CO": {},
- "BS-CS": {}, "BS-EG": {}, "BS-EX": {}, "BS-FP": {}, "BS-GC": {},
- "BS-HI": {}, "BS-HT": {}, "BS-IN": {}, "BS-LI": {}, "BS-MC": {},
- "BS-MG": {}, "BS-MI": {}, "BS-NE": {}, "BS-NO": {}, "BS-NP": {}, "BS-NS": {},
- "BS-RC": {}, "BS-RI": {}, "BS-SA": {}, "BS-SE": {}, "BS-SO": {},
- "BS-SS": {}, "BS-SW": {}, "BS-WG": {}, "BT-11": {}, "BT-12": {},
- "BT-13": {}, "BT-14": {}, "BT-15": {}, "BT-21": {}, "BT-22": {},
- "BT-23": {}, "BT-24": {}, "BT-31": {}, "BT-32": {}, "BT-33": {},
- "BT-34": {}, "BT-41": {}, "BT-42": {}, "BT-43": {}, "BT-44": {},
- "BT-45": {}, "BT-GA": {}, "BT-TY": {}, "BW-CE": {}, "BW-CH": {}, "BW-GH": {},
- "BW-KG": {}, "BW-KL": {}, "BW-KW": {}, "BW-NE": {}, "BW-NW": {},
- "BW-SE": {}, "BW-SO": {}, "BY-BR": {}, "BY-HM": {}, "BY-HO": {},
- "BY-HR": {}, "BY-MA": {}, "BY-MI": {}, "BY-VI": {}, "BZ-BZ": {},
- "BZ-CY": {}, "BZ-CZL": {}, "BZ-OW": {}, "BZ-SC": {}, "BZ-TOL": {},
- "CA-AB": {}, "CA-BC": {}, "CA-MB": {}, "CA-NB": {}, "CA-NL": {},
- "CA-NS": {}, "CA-NT": {}, "CA-NU": {}, "CA-ON": {}, "CA-PE": {},
- "CA-QC": {}, "CA-SK": {}, "CA-YT": {}, "CD-BC": {}, "CD-BN": {},
- "CD-EQ": {}, "CD-HK": {}, "CD-IT": {}, "CD-KA": {}, "CD-KC": {}, "CD-KE": {}, "CD-KG": {}, "CD-KN": {},
- "CD-KW": {}, "CD-KS": {}, "CD-LU": {}, "CD-MA": {}, "CD-NK": {}, "CD-OR": {}, "CD-SA": {}, "CD-SK": {},
- "CD-TA": {}, "CD-TO": {}, "CF-AC": {}, "CF-BB": {}, "CF-BGF": {}, "CF-BK": {}, "CF-HK": {}, "CF-HM": {},
- "CF-HS": {}, "CF-KB": {}, "CF-KG": {}, "CF-LB": {}, "CF-MB": {},
- "CF-MP": {}, "CF-NM": {}, "CF-OP": {}, "CF-SE": {}, "CF-UK": {},
- "CF-VK": {}, "CG-11": {}, "CG-12": {}, "CG-13": {}, "CG-14": {},
- "CG-15": {}, "CG-16": {}, "CG-2": {}, "CG-5": {}, "CG-7": {}, "CG-8": {},
- "CG-9": {}, "CG-BZV": {}, "CH-AG": {}, "CH-AI": {}, "CH-AR": {},
- "CH-BE": {}, "CH-BL": {}, "CH-BS": {}, "CH-FR": {}, "CH-GE": {},
- "CH-GL": {}, "CH-GR": {}, "CH-JU": {}, "CH-LU": {}, "CH-NE": {},
- "CH-NW": {}, "CH-OW": {}, "CH-SG": {}, "CH-SH": {}, "CH-SO": {},
- "CH-SZ": {}, "CH-TG": {}, "CH-TI": {}, "CH-UR": {}, "CH-VD": {},
- "CH-VS": {}, "CH-ZG": {}, "CH-ZH": {}, "CI-AB": {}, "CI-BS": {},
- "CI-CM": {}, "CI-DN": {}, "CI-GD": {}, "CI-LC": {}, "CI-LG": {},
- "CI-MG": {}, "CI-SM": {}, "CI-SV": {}, "CI-VB": {}, "CI-WR": {},
- "CI-YM": {}, "CI-ZZ": {}, "CL-AI": {}, "CL-AN": {}, "CL-AP": {},
- "CL-AR": {}, "CL-AT": {}, "CL-BI": {}, "CL-CO": {}, "CL-LI": {},
- "CL-LL": {}, "CL-LR": {}, "CL-MA": {}, "CL-ML": {}, "CL-NB": {}, "CL-RM": {},
- "CL-TA": {}, "CL-VS": {}, "CM-AD": {}, "CM-CE": {}, "CM-EN": {},
- "CM-ES": {}, "CM-LT": {}, "CM-NO": {}, "CM-NW": {}, "CM-OU": {},
- "CM-SU": {}, "CM-SW": {}, "CN-AH": {}, "CN-BJ": {}, "CN-CQ": {},
- "CN-FJ": {}, "CN-GS": {}, "CN-GD": {}, "CN-GX": {}, "CN-GZ": {},
- "CN-HI": {}, "CN-HE": {}, "CN-HL": {}, "CN-HA": {}, "CN-HB": {},
- "CN-HN": {}, "CN-JS": {}, "CN-JX": {}, "CN-JL": {}, "CN-LN": {},
- "CN-NM": {}, "CN-NX": {}, "CN-QH": {}, "CN-SN": {}, "CN-SD": {}, "CN-SH": {},
- "CN-SX": {}, "CN-SC": {}, "CN-TJ": {}, "CN-XJ": {}, "CN-XZ": {}, "CN-YN": {},
- "CN-ZJ": {}, "CO-AMA": {}, "CO-ANT": {}, "CO-ARA": {}, "CO-ATL": {},
- "CO-BOL": {}, "CO-BOY": {}, "CO-CAL": {}, "CO-CAQ": {}, "CO-CAS": {},
- "CO-CAU": {}, "CO-CES": {}, "CO-CHO": {}, "CO-COR": {}, "CO-CUN": {},
- "CO-DC": {}, "CO-GUA": {}, "CO-GUV": {}, "CO-HUI": {}, "CO-LAG": {},
- "CO-MAG": {}, "CO-MET": {}, "CO-NAR": {}, "CO-NSA": {}, "CO-PUT": {},
- "CO-QUI": {}, "CO-RIS": {}, "CO-SAN": {}, "CO-SAP": {}, "CO-SUC": {},
- "CO-TOL": {}, "CO-VAC": {}, "CO-VAU": {}, "CO-VID": {}, "CR-A": {},
- "CR-C": {}, "CR-G": {}, "CR-H": {}, "CR-L": {}, "CR-P": {},
- "CR-SJ": {}, "CU-01": {}, "CU-02": {}, "CU-03": {}, "CU-04": {},
- "CU-05": {}, "CU-06": {}, "CU-07": {}, "CU-08": {}, "CU-09": {},
- "CU-10": {}, "CU-11": {}, "CU-12": {}, "CU-13": {}, "CU-14": {}, "CU-15": {},
- "CU-16": {}, "CU-99": {}, "CV-B": {}, "CV-BR": {}, "CV-BV": {}, "CV-CA": {},
- "CV-CF": {}, "CV-CR": {}, "CV-MA": {}, "CV-MO": {}, "CV-PA": {},
- "CV-PN": {}, "CV-PR": {}, "CV-RB": {}, "CV-RG": {}, "CV-RS": {},
- "CV-S": {}, "CV-SD": {}, "CV-SF": {}, "CV-SL": {}, "CV-SM": {},
- "CV-SO": {}, "CV-SS": {}, "CV-SV": {}, "CV-TA": {}, "CV-TS": {},
- "CY-01": {}, "CY-02": {}, "CY-03": {}, "CY-04": {}, "CY-05": {},
- "CY-06": {}, "CZ-10": {}, "CZ-101": {}, "CZ-102": {}, "CZ-103": {},
- "CZ-104": {}, "CZ-105": {}, "CZ-106": {}, "CZ-107": {}, "CZ-108": {},
- "CZ-109": {}, "CZ-110": {}, "CZ-111": {}, "CZ-112": {}, "CZ-113": {},
- "CZ-114": {}, "CZ-115": {}, "CZ-116": {}, "CZ-117": {}, "CZ-118": {},
- "CZ-119": {}, "CZ-120": {}, "CZ-121": {}, "CZ-122": {}, "CZ-20": {},
- "CZ-201": {}, "CZ-202": {}, "CZ-203": {}, "CZ-204": {}, "CZ-205": {},
- "CZ-206": {}, "CZ-207": {}, "CZ-208": {}, "CZ-209": {}, "CZ-20A": {},
- "CZ-20B": {}, "CZ-20C": {}, "CZ-31": {}, "CZ-311": {}, "CZ-312": {},
- "CZ-313": {}, "CZ-314": {}, "CZ-315": {}, "CZ-316": {}, "CZ-317": {},
- "CZ-32": {}, "CZ-321": {}, "CZ-322": {}, "CZ-323": {}, "CZ-324": {},
- "CZ-325": {}, "CZ-326": {}, "CZ-327": {}, "CZ-41": {}, "CZ-411": {},
- "CZ-412": {}, "CZ-413": {}, "CZ-42": {}, "CZ-421": {}, "CZ-422": {},
- "CZ-423": {}, "CZ-424": {}, "CZ-425": {}, "CZ-426": {}, "CZ-427": {},
- "CZ-51": {}, "CZ-511": {}, "CZ-512": {}, "CZ-513": {}, "CZ-514": {},
- "CZ-52": {}, "CZ-521": {}, "CZ-522": {}, "CZ-523": {}, "CZ-524": {},
- "CZ-525": {}, "CZ-53": {}, "CZ-531": {}, "CZ-532": {}, "CZ-533": {},
- "CZ-534": {}, "CZ-63": {}, "CZ-631": {}, "CZ-632": {}, "CZ-633": {},
- "CZ-634": {}, "CZ-635": {}, "CZ-64": {}, "CZ-641": {}, "CZ-642": {},
- "CZ-643": {}, "CZ-644": {}, "CZ-645": {}, "CZ-646": {}, "CZ-647": {},
- "CZ-71": {}, "CZ-711": {}, "CZ-712": {}, "CZ-713": {}, "CZ-714": {},
- "CZ-715": {}, "CZ-72": {}, "CZ-721": {}, "CZ-722": {}, "CZ-723": {},
- "CZ-724": {}, "CZ-80": {}, "CZ-801": {}, "CZ-802": {}, "CZ-803": {},
- "CZ-804": {}, "CZ-805": {}, "CZ-806": {}, "DE-BB": {}, "DE-BE": {},
- "DE-BW": {}, "DE-BY": {}, "DE-HB": {}, "DE-HE": {}, "DE-HH": {},
- "DE-MV": {}, "DE-NI": {}, "DE-NW": {}, "DE-RP": {}, "DE-SH": {},
- "DE-SL": {}, "DE-SN": {}, "DE-ST": {}, "DE-TH": {}, "DJ-AR": {},
- "DJ-AS": {}, "DJ-DI": {}, "DJ-DJ": {}, "DJ-OB": {}, "DJ-TA": {},
- "DK-81": {}, "DK-82": {}, "DK-83": {}, "DK-84": {}, "DK-85": {},
- "DM-01": {}, "DM-02": {}, "DM-03": {}, "DM-04": {}, "DM-05": {},
- "DM-06": {}, "DM-07": {}, "DM-08": {}, "DM-09": {}, "DM-10": {},
- "DO-01": {}, "DO-02": {}, "DO-03": {}, "DO-04": {}, "DO-05": {},
- "DO-06": {}, "DO-07": {}, "DO-08": {}, "DO-09": {}, "DO-10": {},
- "DO-11": {}, "DO-12": {}, "DO-13": {}, "DO-14": {}, "DO-15": {},
- "DO-16": {}, "DO-17": {}, "DO-18": {}, "DO-19": {}, "DO-20": {},
- "DO-21": {}, "DO-22": {}, "DO-23": {}, "DO-24": {}, "DO-25": {},
- "DO-26": {}, "DO-27": {}, "DO-28": {}, "DO-29": {}, "DO-30": {}, "DO-31": {},
- "DZ-01": {}, "DZ-02": {}, "DZ-03": {}, "DZ-04": {}, "DZ-05": {},
- "DZ-06": {}, "DZ-07": {}, "DZ-08": {}, "DZ-09": {}, "DZ-10": {},
- "DZ-11": {}, "DZ-12": {}, "DZ-13": {}, "DZ-14": {}, "DZ-15": {},
- "DZ-16": {}, "DZ-17": {}, "DZ-18": {}, "DZ-19": {}, "DZ-20": {},
- "DZ-21": {}, "DZ-22": {}, "DZ-23": {}, "DZ-24": {}, "DZ-25": {},
- "DZ-26": {}, "DZ-27": {}, "DZ-28": {}, "DZ-29": {}, "DZ-30": {},
- "DZ-31": {}, "DZ-32": {}, "DZ-33": {}, "DZ-34": {}, "DZ-35": {},
- "DZ-36": {}, "DZ-37": {}, "DZ-38": {}, "DZ-39": {}, "DZ-40": {},
- "DZ-41": {}, "DZ-42": {}, "DZ-43": {}, "DZ-44": {}, "DZ-45": {},
- "DZ-46": {}, "DZ-47": {}, "DZ-48": {}, "DZ-49": {}, "DZ-51": {},
- "DZ-53": {}, "DZ-55": {}, "DZ-56": {}, "DZ-57": {}, "EC-A": {}, "EC-B": {},
- "EC-C": {}, "EC-D": {}, "EC-E": {}, "EC-F": {}, "EC-G": {},
- "EC-H": {}, "EC-I": {}, "EC-L": {}, "EC-M": {}, "EC-N": {},
- "EC-O": {}, "EC-P": {}, "EC-R": {}, "EC-S": {}, "EC-SD": {},
- "EC-SE": {}, "EC-T": {}, "EC-U": {}, "EC-W": {}, "EC-X": {},
- "EC-Y": {}, "EC-Z": {}, "EE-37": {}, "EE-39": {}, "EE-44": {}, "EE-45": {},
- "EE-49": {}, "EE-50": {}, "EE-51": {}, "EE-52": {}, "EE-56": {}, "EE-57": {},
- "EE-59": {}, "EE-60": {}, "EE-64": {}, "EE-65": {}, "EE-67": {}, "EE-68": {},
- "EE-70": {}, "EE-71": {}, "EE-74": {}, "EE-78": {}, "EE-79": {}, "EE-81": {}, "EE-82": {},
- "EE-84": {}, "EE-86": {}, "EE-87": {}, "EG-ALX": {}, "EG-ASN": {}, "EG-AST": {},
- "EG-BA": {}, "EG-BH": {}, "EG-BNS": {}, "EG-C": {}, "EG-DK": {},
- "EG-DT": {}, "EG-FYM": {}, "EG-GH": {}, "EG-GZ": {}, "EG-HU": {},
- "EG-IS": {}, "EG-JS": {}, "EG-KB": {}, "EG-KFS": {}, "EG-KN": {},
- "EG-LX": {}, "EG-MN": {}, "EG-MNF": {}, "EG-MT": {}, "EG-PTS": {}, "EG-SHG": {},
- "EG-SHR": {}, "EG-SIN": {}, "EG-SU": {}, "EG-SUZ": {}, "EG-WAD": {},
- "ER-AN": {}, "ER-DK": {}, "ER-DU": {}, "ER-GB": {}, "ER-MA": {},
- "ER-SK": {}, "ES-A": {}, "ES-AB": {}, "ES-AL": {}, "ES-AN": {},
- "ES-AR": {}, "ES-AS": {}, "ES-AV": {}, "ES-B": {}, "ES-BA": {},
- "ES-BI": {}, "ES-BU": {}, "ES-C": {}, "ES-CA": {}, "ES-CB": {},
- "ES-CC": {}, "ES-CE": {}, "ES-CL": {}, "ES-CM": {}, "ES-CN": {},
- "ES-CO": {}, "ES-CR": {}, "ES-CS": {}, "ES-CT": {}, "ES-CU": {},
- "ES-EX": {}, "ES-GA": {}, "ES-GC": {}, "ES-GI": {}, "ES-GR": {},
- "ES-GU": {}, "ES-H": {}, "ES-HU": {}, "ES-IB": {}, "ES-J": {},
- "ES-L": {}, "ES-LE": {}, "ES-LO": {}, "ES-LU": {}, "ES-M": {},
- "ES-MA": {}, "ES-MC": {}, "ES-MD": {}, "ES-ML": {}, "ES-MU": {},
- "ES-NA": {}, "ES-NC": {}, "ES-O": {}, "ES-OR": {}, "ES-P": {},
- "ES-PM": {}, "ES-PO": {}, "ES-PV": {}, "ES-RI": {}, "ES-S": {},
- "ES-SA": {}, "ES-SE": {}, "ES-SG": {}, "ES-SO": {}, "ES-SS": {},
- "ES-T": {}, "ES-TE": {}, "ES-TF": {}, "ES-TO": {}, "ES-V": {},
- "ES-VA": {}, "ES-VC": {}, "ES-VI": {}, "ES-Z": {}, "ES-ZA": {},
- "ET-AA": {}, "ET-AF": {}, "ET-AM": {}, "ET-BE": {}, "ET-DD": {},
- "ET-GA": {}, "ET-HA": {}, "ET-OR": {}, "ET-SN": {}, "ET-SO": {},
- "ET-TI": {}, "FI-01": {}, "FI-02": {}, "FI-03": {}, "FI-04": {},
- "FI-05": {}, "FI-06": {}, "FI-07": {}, "FI-08": {}, "FI-09": {},
- "FI-10": {}, "FI-11": {}, "FI-12": {}, "FI-13": {}, "FI-14": {},
- "FI-15": {}, "FI-16": {}, "FI-17": {}, "FI-18": {}, "FI-19": {},
- "FJ-C": {}, "FJ-E": {}, "FJ-N": {}, "FJ-R": {}, "FJ-W": {},
- "FM-KSA": {}, "FM-PNI": {}, "FM-TRK": {}, "FM-YAP": {}, "FR-01": {},
- "FR-02": {}, "FR-03": {}, "FR-04": {}, "FR-05": {}, "FR-06": {},
- "FR-07": {}, "FR-08": {}, "FR-09": {}, "FR-10": {}, "FR-11": {},
- "FR-12": {}, "FR-13": {}, "FR-14": {}, "FR-15": {}, "FR-16": {},
- "FR-17": {}, "FR-18": {}, "FR-19": {}, "FR-20R": {}, "FR-21": {}, "FR-22": {},
- "FR-23": {}, "FR-24": {}, "FR-25": {}, "FR-26": {}, "FR-27": {},
- "FR-28": {}, "FR-29": {}, "FR-2A": {}, "FR-2B": {}, "FR-30": {},
- "FR-31": {}, "FR-32": {}, "FR-33": {}, "FR-34": {}, "FR-35": {},
- "FR-36": {}, "FR-37": {}, "FR-38": {}, "FR-39": {}, "FR-40": {},
- "FR-41": {}, "FR-42": {}, "FR-43": {}, "FR-44": {}, "FR-45": {},
- "FR-46": {}, "FR-47": {}, "FR-48": {}, "FR-49": {}, "FR-50": {},
- "FR-51": {}, "FR-52": {}, "FR-53": {}, "FR-54": {}, "FR-55": {},
- "FR-56": {}, "FR-57": {}, "FR-58": {}, "FR-59": {}, "FR-60": {},
- "FR-61": {}, "FR-62": {}, "FR-63": {}, "FR-64": {}, "FR-65": {},
- "FR-66": {}, "FR-67": {}, "FR-68": {}, "FR-69": {}, "FR-70": {},
- "FR-71": {}, "FR-72": {}, "FR-73": {}, "FR-74": {}, "FR-75": {},
- "FR-76": {}, "FR-77": {}, "FR-78": {}, "FR-79": {}, "FR-80": {},
- "FR-81": {}, "FR-82": {}, "FR-83": {}, "FR-84": {}, "FR-85": {},
- "FR-86": {}, "FR-87": {}, "FR-88": {}, "FR-89": {}, "FR-90": {},
- "FR-91": {}, "FR-92": {}, "FR-93": {}, "FR-94": {}, "FR-95": {},
- "FR-ARA": {}, "FR-BFC": {}, "FR-BL": {}, "FR-BRE": {}, "FR-COR": {},
- "FR-CP": {}, "FR-CVL": {}, "FR-GES": {}, "FR-GF": {}, "FR-GP": {},
- "FR-GUA": {}, "FR-HDF": {}, "FR-IDF": {}, "FR-LRE": {}, "FR-MAY": {},
- "FR-MF": {}, "FR-MQ": {}, "FR-NAQ": {}, "FR-NC": {}, "FR-NOR": {},
- "FR-OCC": {}, "FR-PAC": {}, "FR-PDL": {}, "FR-PF": {}, "FR-PM": {},
- "FR-RE": {}, "FR-TF": {}, "FR-WF": {}, "FR-YT": {}, "GA-1": {},
- "GA-2": {}, "GA-3": {}, "GA-4": {}, "GA-5": {}, "GA-6": {},
- "GA-7": {}, "GA-8": {}, "GA-9": {}, "GB-ABC": {}, "GB-ABD": {},
- "GB-ABE": {}, "GB-AGB": {}, "GB-AGY": {}, "GB-AND": {}, "GB-ANN": {},
- "GB-ANS": {}, "GB-BAS": {}, "GB-BBD": {}, "GB-BDF": {}, "GB-BDG": {},
- "GB-BEN": {}, "GB-BEX": {}, "GB-BFS": {}, "GB-BGE": {}, "GB-BGW": {},
- "GB-BIR": {}, "GB-BKM": {}, "GB-BMH": {}, "GB-BNE": {}, "GB-BNH": {},
- "GB-BNS": {}, "GB-BOL": {}, "GB-BPL": {}, "GB-BRC": {}, "GB-BRD": {},
- "GB-BRY": {}, "GB-BST": {}, "GB-BUR": {}, "GB-CAM": {}, "GB-CAY": {},
- "GB-CBF": {}, "GB-CCG": {}, "GB-CGN": {}, "GB-CHE": {}, "GB-CHW": {},
- "GB-CLD": {}, "GB-CLK": {}, "GB-CMA": {}, "GB-CMD": {}, "GB-CMN": {},
- "GB-CON": {}, "GB-COV": {}, "GB-CRF": {}, "GB-CRY": {}, "GB-CWY": {},
- "GB-DAL": {}, "GB-DBY": {}, "GB-DEN": {}, "GB-DER": {}, "GB-DEV": {},
- "GB-DGY": {}, "GB-DNC": {}, "GB-DND": {}, "GB-DOR": {}, "GB-DRS": {},
- "GB-DUD": {}, "GB-DUR": {}, "GB-EAL": {}, "GB-EAW": {}, "GB-EAY": {},
- "GB-EDH": {}, "GB-EDU": {}, "GB-ELN": {}, "GB-ELS": {}, "GB-ENF": {},
- "GB-ENG": {}, "GB-ERW": {}, "GB-ERY": {}, "GB-ESS": {}, "GB-ESX": {},
- "GB-FAL": {}, "GB-FIF": {}, "GB-FLN": {}, "GB-FMO": {}, "GB-GAT": {},
- "GB-GBN": {}, "GB-GLG": {}, "GB-GLS": {}, "GB-GRE": {}, "GB-GWN": {},
- "GB-HAL": {}, "GB-HAM": {}, "GB-HAV": {}, "GB-HCK": {}, "GB-HEF": {},
- "GB-HIL": {}, "GB-HLD": {}, "GB-HMF": {}, "GB-HNS": {}, "GB-HPL": {},
- "GB-HRT": {}, "GB-HRW": {}, "GB-HRY": {}, "GB-IOS": {}, "GB-IOW": {},
- "GB-ISL": {}, "GB-IVC": {}, "GB-KEC": {}, "GB-KEN": {}, "GB-KHL": {},
- "GB-KIR": {}, "GB-KTT": {}, "GB-KWL": {}, "GB-LAN": {}, "GB-LBC": {},
- "GB-LBH": {}, "GB-LCE": {}, "GB-LDS": {}, "GB-LEC": {}, "GB-LEW": {},
- "GB-LIN": {}, "GB-LIV": {}, "GB-LND": {}, "GB-LUT": {}, "GB-MAN": {},
- "GB-MDB": {}, "GB-MDW": {}, "GB-MEA": {}, "GB-MIK": {}, "GD-01": {},
- "GB-MLN": {}, "GB-MON": {}, "GB-MRT": {}, "GB-MRY": {}, "GB-MTY": {},
- "GB-MUL": {}, "GB-NAY": {}, "GB-NBL": {}, "GB-NEL": {}, "GB-NET": {},
- "GB-NFK": {}, "GB-NGM": {}, "GB-NIR": {}, "GB-NLK": {}, "GB-NLN": {},
- "GB-NMD": {}, "GB-NSM": {}, "GB-NTH": {}, "GB-NTL": {}, "GB-NTT": {},
- "GB-NTY": {}, "GB-NWM": {}, "GB-NWP": {}, "GB-NYK": {}, "GB-OLD": {},
- "GB-ORK": {}, "GB-OXF": {}, "GB-PEM": {}, "GB-PKN": {}, "GB-PLY": {},
- "GB-POL": {}, "GB-POR": {}, "GB-POW": {}, "GB-PTE": {}, "GB-RCC": {},
- "GB-RCH": {}, "GB-RCT": {}, "GB-RDB": {}, "GB-RDG": {}, "GB-RFW": {},
- "GB-RIC": {}, "GB-ROT": {}, "GB-RUT": {}, "GB-SAW": {}, "GB-SAY": {},
- "GB-SCB": {}, "GB-SCT": {}, "GB-SFK": {}, "GB-SFT": {}, "GB-SGC": {},
- "GB-SHF": {}, "GB-SHN": {}, "GB-SHR": {}, "GB-SKP": {}, "GB-SLF": {},
- "GB-SLG": {}, "GB-SLK": {}, "GB-SND": {}, "GB-SOL": {}, "GB-SOM": {},
- "GB-SOS": {}, "GB-SRY": {}, "GB-STE": {}, "GB-STG": {}, "GB-STH": {},
- "GB-STN": {}, "GB-STS": {}, "GB-STT": {}, "GB-STY": {}, "GB-SWA": {},
- "GB-SWD": {}, "GB-SWK": {}, "GB-TAM": {}, "GB-TFW": {}, "GB-THR": {},
- "GB-TOB": {}, "GB-TOF": {}, "GB-TRF": {}, "GB-TWH": {}, "GB-UKM": {},
- "GB-VGL": {}, "GB-WAR": {}, "GB-WBK": {}, "GB-WDU": {}, "GB-WFT": {},
- "GB-WGN": {}, "GB-WIL": {}, "GB-WKF": {}, "GB-WLL": {}, "GB-WLN": {},
- "GB-WLS": {}, "GB-WLV": {}, "GB-WND": {}, "GB-WNM": {}, "GB-WOK": {},
- "GB-WOR": {}, "GB-WRL": {}, "GB-WRT": {}, "GB-WRX": {}, "GB-WSM": {},
- "GB-WSX": {}, "GB-YOR": {}, "GB-ZET": {}, "GD-02": {}, "GD-03": {},
- "GD-04": {}, "GD-05": {}, "GD-06": {}, "GD-10": {}, "GE-AB": {},
- "GE-AJ": {}, "GE-GU": {}, "GE-IM": {}, "GE-KA": {}, "GE-KK": {},
- "GE-MM": {}, "GE-RL": {}, "GE-SJ": {}, "GE-SK": {}, "GE-SZ": {},
- "GE-TB": {}, "GH-AA": {}, "GH-AH": {}, "GH-AF": {}, "GH-BA": {}, "GH-BO": {}, "GH-BE": {}, "GH-CP": {},
- "GH-EP": {}, "GH-NP": {}, "GH-TV": {}, "GH-UE": {}, "GH-UW": {},
- "GH-WP": {}, "GL-AV": {}, "GL-KU": {}, "GL-QA": {}, "GL-QT": {}, "GL-QE": {}, "GL-SM": {},
- "GM-B": {}, "GM-L": {}, "GM-M": {}, "GM-N": {}, "GM-U": {},
- "GM-W": {}, "GN-B": {}, "GN-BE": {}, "GN-BF": {}, "GN-BK": {},
- "GN-C": {}, "GN-CO": {}, "GN-D": {}, "GN-DB": {}, "GN-DI": {},
- "GN-DL": {}, "GN-DU": {}, "GN-F": {}, "GN-FA": {}, "GN-FO": {},
- "GN-FR": {}, "GN-GA": {}, "GN-GU": {}, "GN-K": {}, "GN-KA": {},
- "GN-KB": {}, "GN-KD": {}, "GN-KE": {}, "GN-KN": {}, "GN-KO": {},
- "GN-KS": {}, "GN-L": {}, "GN-LA": {}, "GN-LE": {}, "GN-LO": {},
- "GN-M": {}, "GN-MC": {}, "GN-MD": {}, "GN-ML": {}, "GN-MM": {},
- "GN-N": {}, "GN-NZ": {}, "GN-PI": {}, "GN-SI": {}, "GN-TE": {},
- "GN-TO": {}, "GN-YO": {}, "GQ-AN": {}, "GQ-BN": {}, "GQ-BS": {},
- "GQ-C": {}, "GQ-CS": {}, "GQ-I": {}, "GQ-KN": {}, "GQ-LI": {},
- "GQ-WN": {}, "GR-01": {}, "GR-03": {}, "GR-04": {}, "GR-05": {},
- "GR-06": {}, "GR-07": {}, "GR-11": {}, "GR-12": {}, "GR-13": {},
- "GR-14": {}, "GR-15": {}, "GR-16": {}, "GR-17": {}, "GR-21": {},
- "GR-22": {}, "GR-23": {}, "GR-24": {}, "GR-31": {}, "GR-32": {},
- "GR-33": {}, "GR-34": {}, "GR-41": {}, "GR-42": {}, "GR-43": {},
- "GR-44": {}, "GR-51": {}, "GR-52": {}, "GR-53": {}, "GR-54": {},
- "GR-55": {}, "GR-56": {}, "GR-57": {}, "GR-58": {}, "GR-59": {},
- "GR-61": {}, "GR-62": {}, "GR-63": {}, "GR-64": {}, "GR-69": {},
- "GR-71": {}, "GR-72": {}, "GR-73": {}, "GR-81": {}, "GR-82": {},
- "GR-83": {}, "GR-84": {}, "GR-85": {}, "GR-91": {}, "GR-92": {},
- "GR-93": {}, "GR-94": {}, "GR-A": {}, "GR-A1": {}, "GR-B": {},
- "GR-C": {}, "GR-D": {}, "GR-E": {}, "GR-F": {}, "GR-G": {},
- "GR-H": {}, "GR-I": {}, "GR-J": {}, "GR-K": {}, "GR-L": {},
- "GR-M": {}, "GT-01": {}, "GT-02": {}, "GT-03": {}, "GT-04": {},
- "GT-05": {}, "GT-06": {}, "GT-07": {}, "GT-08": {}, "GT-09": {},
- "GT-10": {}, "GT-11": {}, "GT-12": {}, "GT-13": {}, "GT-14": {},
- "GT-15": {}, "GT-16": {}, "GT-17": {}, "GT-18": {}, "GT-19": {},
- "GT-20": {}, "GT-21": {}, "GT-22": {}, "GW-BA": {}, "GW-BL": {},
- "GW-BM": {}, "GW-BS": {}, "GW-CA": {}, "GW-GA": {}, "GW-L": {},
- "GW-N": {}, "GW-OI": {}, "GW-QU": {}, "GW-S": {}, "GW-TO": {},
- "GY-BA": {}, "GY-CU": {}, "GY-DE": {}, "GY-EB": {}, "GY-ES": {},
- "GY-MA": {}, "GY-PM": {}, "GY-PT": {}, "GY-UD": {}, "GY-UT": {},
- "HN-AT": {}, "HN-CH": {}, "HN-CL": {}, "HN-CM": {}, "HN-CP": {},
- "HN-CR": {}, "HN-EP": {}, "HN-FM": {}, "HN-GD": {}, "HN-IB": {},
- "HN-IN": {}, "HN-LE": {}, "HN-LP": {}, "HN-OC": {}, "HN-OL": {},
- "HN-SB": {}, "HN-VA": {}, "HN-YO": {}, "HR-01": {}, "HR-02": {},
- "HR-03": {}, "HR-04": {}, "HR-05": {}, "HR-06": {}, "HR-07": {},
- "HR-08": {}, "HR-09": {}, "HR-10": {}, "HR-11": {}, "HR-12": {},
- "HR-13": {}, "HR-14": {}, "HR-15": {}, "HR-16": {}, "HR-17": {},
- "HR-18": {}, "HR-19": {}, "HR-20": {}, "HR-21": {}, "HT-AR": {},
- "HT-CE": {}, "HT-GA": {}, "HT-ND": {}, "HT-NE": {}, "HT-NO": {}, "HT-NI": {},
- "HT-OU": {}, "HT-SD": {}, "HT-SE": {}, "HU-BA": {}, "HU-BC": {},
- "HU-BE": {}, "HU-BK": {}, "HU-BU": {}, "HU-BZ": {}, "HU-CS": {},
- "HU-DE": {}, "HU-DU": {}, "HU-EG": {}, "HU-ER": {}, "HU-FE": {},
- "HU-GS": {}, "HU-GY": {}, "HU-HB": {}, "HU-HE": {}, "HU-HV": {},
- "HU-JN": {}, "HU-KE": {}, "HU-KM": {}, "HU-KV": {}, "HU-MI": {},
- "HU-NK": {}, "HU-NO": {}, "HU-NY": {}, "HU-PE": {}, "HU-PS": {},
- "HU-SD": {}, "HU-SF": {}, "HU-SH": {}, "HU-SK": {}, "HU-SN": {},
- "HU-SO": {}, "HU-SS": {}, "HU-ST": {}, "HU-SZ": {}, "HU-TB": {},
- "HU-TO": {}, "HU-VA": {}, "HU-VE": {}, "HU-VM": {}, "HU-ZA": {},
- "HU-ZE": {}, "ID-AC": {}, "ID-BA": {}, "ID-BB": {}, "ID-BE": {},
- "ID-BT": {}, "ID-GO": {}, "ID-IJ": {}, "ID-JA": {}, "ID-JB": {},
- "ID-JI": {}, "ID-JK": {}, "ID-JT": {}, "ID-JW": {}, "ID-KA": {},
- "ID-KB": {}, "ID-KI": {}, "ID-KU": {}, "ID-KR": {}, "ID-KS": {},
- "ID-KT": {}, "ID-LA": {}, "ID-MA": {}, "ID-ML": {}, "ID-MU": {},
- "ID-NB": {}, "ID-NT": {}, "ID-NU": {}, "ID-PA": {}, "ID-PB": {},
- "ID-PE": {}, "ID-PP": {}, "ID-PS": {}, "ID-PT": {}, "ID-RI": {},
- "ID-SA": {}, "ID-SB": {}, "ID-SG": {}, "ID-SL": {}, "ID-SM": {},
- "ID-SN": {}, "ID-SR": {}, "ID-SS": {}, "ID-ST": {}, "ID-SU": {},
- "ID-YO": {}, "IE-C": {}, "IE-CE": {}, "IE-CN": {}, "IE-CO": {},
- "IE-CW": {}, "IE-D": {}, "IE-DL": {}, "IE-G": {}, "IE-KE": {},
- "IE-KK": {}, "IE-KY": {}, "IE-L": {}, "IE-LD": {}, "IE-LH": {},
- "IE-LK": {}, "IE-LM": {}, "IE-LS": {}, "IE-M": {}, "IE-MH": {},
- "IE-MN": {}, "IE-MO": {}, "IE-OY": {}, "IE-RN": {}, "IE-SO": {},
- "IE-TA": {}, "IE-U": {}, "IE-WD": {}, "IE-WH": {}, "IE-WW": {},
- "IE-WX": {}, "IL-D": {}, "IL-HA": {}, "IL-JM": {}, "IL-M": {},
- "IL-TA": {}, "IL-Z": {}, "IN-AN": {}, "IN-AP": {}, "IN-AR": {},
- "IN-AS": {}, "IN-BR": {}, "IN-CH": {}, "IN-CT": {}, "IN-DH": {},
- "IN-DL": {}, "IN-DN": {}, "IN-GA": {}, "IN-GJ": {}, "IN-HP": {},
- "IN-HR": {}, "IN-JH": {}, "IN-JK": {}, "IN-KA": {}, "IN-KL": {},
- "IN-LD": {}, "IN-MH": {}, "IN-ML": {}, "IN-MN": {}, "IN-MP": {},
- "IN-MZ": {}, "IN-NL": {}, "IN-TG": {}, "IN-OR": {}, "IN-PB": {}, "IN-PY": {},
- "IN-RJ": {}, "IN-SK": {}, "IN-TN": {}, "IN-TR": {}, "IN-UP": {},
- "IN-UT": {}, "IN-WB": {}, "IQ-AN": {}, "IQ-AR": {}, "IQ-BA": {},
- "IQ-BB": {}, "IQ-BG": {}, "IQ-DA": {}, "IQ-DI": {}, "IQ-DQ": {},
- "IQ-KA": {}, "IQ-KI": {}, "IQ-MA": {}, "IQ-MU": {}, "IQ-NA": {}, "IQ-NI": {},
- "IQ-QA": {}, "IQ-SD": {}, "IQ-SW": {}, "IQ-SU": {}, "IQ-TS": {}, "IQ-WA": {},
- "IR-00": {}, "IR-01": {}, "IR-02": {}, "IR-03": {}, "IR-04": {}, "IR-05": {},
- "IR-06": {}, "IR-07": {}, "IR-08": {}, "IR-09": {}, "IR-10": {}, "IR-11": {},
- "IR-12": {}, "IR-13": {}, "IR-14": {}, "IR-15": {}, "IR-16": {},
- "IR-17": {}, "IR-18": {}, "IR-19": {}, "IR-20": {}, "IR-21": {},
- "IR-22": {}, "IR-23": {}, "IR-24": {}, "IR-25": {}, "IR-26": {},
- "IR-27": {}, "IR-28": {}, "IR-29": {}, "IR-30": {}, "IR-31": {},
- "IS-0": {}, "IS-1": {}, "IS-2": {}, "IS-3": {}, "IS-4": {},
- "IS-5": {}, "IS-6": {}, "IS-7": {}, "IS-8": {}, "IT-21": {},
- "IT-23": {}, "IT-25": {}, "IT-32": {}, "IT-34": {}, "IT-36": {},
- "IT-42": {}, "IT-45": {}, "IT-52": {}, "IT-55": {}, "IT-57": {},
- "IT-62": {}, "IT-65": {}, "IT-67": {}, "IT-72": {}, "IT-75": {},
- "IT-77": {}, "IT-78": {}, "IT-82": {}, "IT-88": {}, "IT-AG": {},
- "IT-AL": {}, "IT-AN": {}, "IT-AO": {}, "IT-AP": {}, "IT-AQ": {},
- "IT-AR": {}, "IT-AT": {}, "IT-AV": {}, "IT-BA": {}, "IT-BG": {},
- "IT-BI": {}, "IT-BL": {}, "IT-BN": {}, "IT-BO": {}, "IT-BR": {},
- "IT-BS": {}, "IT-BT": {}, "IT-BZ": {}, "IT-CA": {}, "IT-CB": {},
- "IT-CE": {}, "IT-CH": {}, "IT-CI": {}, "IT-CL": {}, "IT-CN": {},
- "IT-CO": {}, "IT-CR": {}, "IT-CS": {}, "IT-CT": {}, "IT-CZ": {},
- "IT-EN": {}, "IT-FC": {}, "IT-FE": {}, "IT-FG": {}, "IT-FI": {},
- "IT-FM": {}, "IT-FR": {}, "IT-GE": {}, "IT-GO": {}, "IT-GR": {},
- "IT-IM": {}, "IT-IS": {}, "IT-KR": {}, "IT-LC": {}, "IT-LE": {},
- "IT-LI": {}, "IT-LO": {}, "IT-LT": {}, "IT-LU": {}, "IT-MB": {},
- "IT-MC": {}, "IT-ME": {}, "IT-MI": {}, "IT-MN": {}, "IT-MO": {},
- "IT-MS": {}, "IT-MT": {}, "IT-NA": {}, "IT-NO": {}, "IT-NU": {},
- "IT-OG": {}, "IT-OR": {}, "IT-OT": {}, "IT-PA": {}, "IT-PC": {},
- "IT-PD": {}, "IT-PE": {}, "IT-PG": {}, "IT-PI": {}, "IT-PN": {},
- "IT-PO": {}, "IT-PR": {}, "IT-PT": {}, "IT-PU": {}, "IT-PV": {},
- "IT-PZ": {}, "IT-RA": {}, "IT-RC": {}, "IT-RE": {}, "IT-RG": {},
- "IT-RI": {}, "IT-RM": {}, "IT-RN": {}, "IT-RO": {}, "IT-SA": {},
- "IT-SI": {}, "IT-SO": {}, "IT-SP": {}, "IT-SR": {}, "IT-SS": {},
- "IT-SV": {}, "IT-TA": {}, "IT-TE": {}, "IT-TN": {}, "IT-TO": {},
- "IT-TP": {}, "IT-TR": {}, "IT-TS": {}, "IT-TV": {}, "IT-UD": {},
- "IT-VA": {}, "IT-VB": {}, "IT-VC": {}, "IT-VE": {}, "IT-VI": {},
- "IT-VR": {}, "IT-VS": {}, "IT-VT": {}, "IT-VV": {}, "JM-01": {},
- "JM-02": {}, "JM-03": {}, "JM-04": {}, "JM-05": {}, "JM-06": {},
- "JM-07": {}, "JM-08": {}, "JM-09": {}, "JM-10": {}, "JM-11": {},
- "JM-12": {}, "JM-13": {}, "JM-14": {}, "JO-AJ": {}, "JO-AM": {},
- "JO-AQ": {}, "JO-AT": {}, "JO-AZ": {}, "JO-BA": {}, "JO-IR": {},
- "JO-JA": {}, "JO-KA": {}, "JO-MA": {}, "JO-MD": {}, "JO-MN": {},
- "JP-01": {}, "JP-02": {}, "JP-03": {}, "JP-04": {}, "JP-05": {},
- "JP-06": {}, "JP-07": {}, "JP-08": {}, "JP-09": {}, "JP-10": {},
- "JP-11": {}, "JP-12": {}, "JP-13": {}, "JP-14": {}, "JP-15": {},
- "JP-16": {}, "JP-17": {}, "JP-18": {}, "JP-19": {}, "JP-20": {},
- "JP-21": {}, "JP-22": {}, "JP-23": {}, "JP-24": {}, "JP-25": {},
- "JP-26": {}, "JP-27": {}, "JP-28": {}, "JP-29": {}, "JP-30": {},
- "JP-31": {}, "JP-32": {}, "JP-33": {}, "JP-34": {}, "JP-35": {},
- "JP-36": {}, "JP-37": {}, "JP-38": {}, "JP-39": {}, "JP-40": {},
- "JP-41": {}, "JP-42": {}, "JP-43": {}, "JP-44": {}, "JP-45": {},
- "JP-46": {}, "JP-47": {}, "KE-01": {}, "KE-02": {}, "KE-03": {},
- "KE-04": {}, "KE-05": {}, "KE-06": {}, "KE-07": {}, "KE-08": {},
- "KE-09": {}, "KE-10": {}, "KE-11": {}, "KE-12": {}, "KE-13": {},
- "KE-14": {}, "KE-15": {}, "KE-16": {}, "KE-17": {}, "KE-18": {},
- "KE-19": {}, "KE-20": {}, "KE-21": {}, "KE-22": {}, "KE-23": {},
- "KE-24": {}, "KE-25": {}, "KE-26": {}, "KE-27": {}, "KE-28": {},
- "KE-29": {}, "KE-30": {}, "KE-31": {}, "KE-32": {}, "KE-33": {},
- "KE-34": {}, "KE-35": {}, "KE-36": {}, "KE-37": {}, "KE-38": {},
- "KE-39": {}, "KE-40": {}, "KE-41": {}, "KE-42": {}, "KE-43": {},
- "KE-44": {}, "KE-45": {}, "KE-46": {}, "KE-47": {}, "KG-B": {},
- "KG-C": {}, "KG-GB": {}, "KG-GO": {}, "KG-J": {}, "KG-N": {}, "KG-O": {},
- "KG-T": {}, "KG-Y": {}, "KH-1": {}, "KH-10": {}, "KH-11": {},
- "KH-12": {}, "KH-13": {}, "KH-14": {}, "KH-15": {}, "KH-16": {},
- "KH-17": {}, "KH-18": {}, "KH-19": {}, "KH-2": {}, "KH-20": {},
- "KH-21": {}, "KH-22": {}, "KH-23": {}, "KH-24": {}, "KH-3": {},
- "KH-4": {}, "KH-5": {}, "KH-6": {}, "KH-7": {}, "KH-8": {},
- "KH-9": {}, "KI-G": {}, "KI-L": {}, "KI-P": {}, "KM-A": {},
- "KM-G": {}, "KM-M": {}, "KN-01": {}, "KN-02": {}, "KN-03": {},
- "KN-04": {}, "KN-05": {}, "KN-06": {}, "KN-07": {}, "KN-08": {},
- "KN-09": {}, "KN-10": {}, "KN-11": {}, "KN-12": {}, "KN-13": {},
- "KN-15": {}, "KN-K": {}, "KN-N": {}, "KP-01": {}, "KP-02": {},
- "KP-03": {}, "KP-04": {}, "KP-05": {}, "KP-06": {}, "KP-07": {},
- "KP-08": {}, "KP-09": {}, "KP-10": {}, "KP-13": {}, "KR-11": {},
- "KR-26": {}, "KR-27": {}, "KR-28": {}, "KR-29": {}, "KR-30": {},
- "KR-31": {}, "KR-41": {}, "KR-42": {}, "KR-43": {}, "KR-44": {},
- "KR-45": {}, "KR-46": {}, "KR-47": {}, "KR-48": {}, "KR-49": {},
- "KW-AH": {}, "KW-FA": {}, "KW-HA": {}, "KW-JA": {}, "KW-KU": {},
- "KW-MU": {}, "KZ-10": {}, "KZ-75": {}, "KZ-19": {}, "KZ-11": {},
- "KZ-15": {}, "KZ-71": {}, "KZ-23": {}, "KZ-27": {}, "KZ-47": {},
- "KZ-55": {}, "KZ-35": {}, "KZ-39": {}, "KZ-43": {}, "KZ-63": {},
- "KZ-79": {}, "KZ-59": {}, "KZ-61": {}, "KZ-62": {}, "KZ-31": {},
- "KZ-33": {}, "LA-AT": {}, "LA-BK": {}, "LA-BL": {},
- "LA-CH": {}, "LA-HO": {}, "LA-KH": {}, "LA-LM": {}, "LA-LP": {},
- "LA-OU": {}, "LA-PH": {}, "LA-SL": {}, "LA-SV": {}, "LA-VI": {},
- "LA-VT": {}, "LA-XA": {}, "LA-XE": {}, "LA-XI": {}, "LA-XS": {},
- "LB-AK": {}, "LB-AS": {}, "LB-BA": {}, "LB-BH": {}, "LB-BI": {},
- "LB-JA": {}, "LB-JL": {}, "LB-NA": {}, "LC-01": {}, "LC-02": {},
- "LC-03": {}, "LC-05": {}, "LC-06": {}, "LC-07": {}, "LC-08": {},
- "LC-10": {}, "LC-11": {}, "LI-01": {}, "LI-02": {},
- "LI-03": {}, "LI-04": {}, "LI-05": {}, "LI-06": {}, "LI-07": {},
- "LI-08": {}, "LI-09": {}, "LI-10": {}, "LI-11": {}, "LK-1": {},
- "LK-11": {}, "LK-12": {}, "LK-13": {}, "LK-2": {}, "LK-21": {},
- "LK-22": {}, "LK-23": {}, "LK-3": {}, "LK-31": {}, "LK-32": {},
- "LK-33": {}, "LK-4": {}, "LK-41": {}, "LK-42": {}, "LK-43": {},
- "LK-44": {}, "LK-45": {}, "LK-5": {}, "LK-51": {}, "LK-52": {},
- "LK-53": {}, "LK-6": {}, "LK-61": {}, "LK-62": {}, "LK-7": {},
- "LK-71": {}, "LK-72": {}, "LK-8": {}, "LK-81": {}, "LK-82": {},
- "LK-9": {}, "LK-91": {}, "LK-92": {}, "LR-BG": {}, "LR-BM": {},
- "LR-CM": {}, "LR-GB": {}, "LR-GG": {}, "LR-GK": {}, "LR-LO": {},
- "LR-MG": {}, "LR-MO": {}, "LR-MY": {}, "LR-NI": {}, "LR-RI": {},
- "LR-SI": {}, "LS-A": {}, "LS-B": {}, "LS-C": {}, "LS-D": {},
- "LS-E": {}, "LS-F": {}, "LS-G": {}, "LS-H": {}, "LS-J": {},
- "LS-K": {}, "LT-AL": {}, "LT-KL": {}, "LT-KU": {}, "LT-MR": {},
- "LT-PN": {}, "LT-SA": {}, "LT-TA": {}, "LT-TE": {}, "LT-UT": {},
- "LT-VL": {}, "LU-CA": {}, "LU-CL": {}, "LU-DI": {}, "LU-EC": {},
- "LU-ES": {}, "LU-GR": {}, "LU-LU": {}, "LU-ME": {}, "LU-RD": {},
- "LU-RM": {}, "LU-VD": {}, "LU-WI": {}, "LU-D": {}, "LU-G": {}, "LU-L": {},
- "LV-001": {}, "LV-111": {}, "LV-112": {}, "LV-113": {},
- "LV-002": {}, "LV-003": {}, "LV-004": {}, "LV-005": {}, "LV-006": {},
- "LV-007": {}, "LV-008": {}, "LV-009": {}, "LV-010": {}, "LV-011": {},
- "LV-012": {}, "LV-013": {}, "LV-014": {}, "LV-015": {}, "LV-016": {},
- "LV-017": {}, "LV-018": {}, "LV-019": {}, "LV-020": {}, "LV-021": {},
- "LV-022": {}, "LV-023": {}, "LV-024": {}, "LV-025": {}, "LV-026": {},
- "LV-027": {}, "LV-028": {}, "LV-029": {}, "LV-030": {}, "LV-031": {},
- "LV-032": {}, "LV-033": {}, "LV-034": {}, "LV-035": {}, "LV-036": {},
- "LV-037": {}, "LV-038": {}, "LV-039": {}, "LV-040": {}, "LV-041": {},
- "LV-042": {}, "LV-043": {}, "LV-044": {}, "LV-045": {}, "LV-046": {},
- "LV-047": {}, "LV-048": {}, "LV-049": {}, "LV-050": {}, "LV-051": {},
- "LV-052": {}, "LV-053": {}, "LV-054": {}, "LV-055": {}, "LV-056": {},
- "LV-057": {}, "LV-058": {}, "LV-059": {}, "LV-060": {}, "LV-061": {},
- "LV-062": {}, "LV-063": {}, "LV-064": {}, "LV-065": {}, "LV-066": {},
- "LV-067": {}, "LV-068": {}, "LV-069": {}, "LV-070": {}, "LV-071": {},
- "LV-072": {}, "LV-073": {}, "LV-074": {}, "LV-075": {}, "LV-076": {},
- "LV-077": {}, "LV-078": {}, "LV-079": {}, "LV-080": {}, "LV-081": {},
- "LV-082": {}, "LV-083": {}, "LV-084": {}, "LV-085": {}, "LV-086": {},
- "LV-087": {}, "LV-088": {}, "LV-089": {}, "LV-090": {}, "LV-091": {},
- "LV-092": {}, "LV-093": {}, "LV-094": {}, "LV-095": {}, "LV-096": {},
- "LV-097": {}, "LV-098": {}, "LV-099": {}, "LV-100": {}, "LV-101": {},
- "LV-102": {}, "LV-103": {}, "LV-104": {}, "LV-105": {}, "LV-106": {},
- "LV-107": {}, "LV-108": {}, "LV-109": {}, "LV-110": {}, "LV-DGV": {},
- "LV-JEL": {}, "LV-JKB": {}, "LV-JUR": {}, "LV-LPX": {}, "LV-REZ": {},
- "LV-RIX": {}, "LV-VEN": {}, "LV-VMR": {}, "LY-BA": {}, "LY-BU": {},
- "LY-DR": {}, "LY-GT": {}, "LY-JA": {}, "LY-JB": {}, "LY-JG": {},
- "LY-JI": {}, "LY-JU": {}, "LY-KF": {}, "LY-MB": {}, "LY-MI": {},
- "LY-MJ": {}, "LY-MQ": {}, "LY-NL": {}, "LY-NQ": {}, "LY-SB": {},
- "LY-SR": {}, "LY-TB": {}, "LY-WA": {}, "LY-WD": {}, "LY-WS": {},
- "LY-ZA": {}, "MA-01": {}, "MA-02": {}, "MA-03": {}, "MA-04": {},
- "MA-05": {}, "MA-06": {}, "MA-07": {}, "MA-08": {}, "MA-09": {},
- "MA-10": {}, "MA-11": {}, "MA-12": {}, "MA-13": {}, "MA-14": {},
- "MA-15": {}, "MA-16": {}, "MA-AGD": {}, "MA-AOU": {}, "MA-ASZ": {},
- "MA-AZI": {}, "MA-BEM": {}, "MA-BER": {}, "MA-BES": {}, "MA-BOD": {},
- "MA-BOM": {}, "MA-CAS": {}, "MA-CHE": {}, "MA-CHI": {}, "MA-CHT": {},
- "MA-ERR": {}, "MA-ESI": {}, "MA-ESM": {}, "MA-FAH": {}, "MA-FES": {},
- "MA-FIG": {}, "MA-GUE": {}, "MA-HAJ": {}, "MA-HAO": {}, "MA-HOC": {},
- "MA-IFR": {}, "MA-INE": {}, "MA-JDI": {}, "MA-JRA": {}, "MA-KEN": {},
- "MA-KES": {}, "MA-KHE": {}, "MA-KHN": {}, "MA-KHO": {}, "MA-LAA": {},
- "MA-LAR": {}, "MA-MED": {}, "MA-MEK": {}, "MA-MMD": {}, "MA-MMN": {},
- "MA-MOH": {}, "MA-MOU": {}, "MA-NAD": {}, "MA-NOU": {}, "MA-OUA": {},
- "MA-OUD": {}, "MA-OUJ": {}, "MA-RAB": {}, "MA-SAF": {}, "MA-SAL": {},
- "MA-SEF": {}, "MA-SET": {}, "MA-SIK": {}, "MA-SKH": {}, "MA-SYB": {},
- "MA-TAI": {}, "MA-TAO": {}, "MA-TAR": {}, "MA-TAT": {}, "MA-TAZ": {},
- "MA-TET": {}, "MA-TIZ": {}, "MA-TNG": {}, "MA-TNT": {}, "MA-ZAG": {},
- "MC-CL": {}, "MC-CO": {}, "MC-FO": {}, "MC-GA": {}, "MC-JE": {},
- "MC-LA": {}, "MC-MA": {}, "MC-MC": {}, "MC-MG": {}, "MC-MO": {},
- "MC-MU": {}, "MC-PH": {}, "MC-SD": {}, "MC-SO": {}, "MC-SP": {},
- "MC-SR": {}, "MC-VR": {}, "MD-AN": {}, "MD-BA": {}, "MD-BD": {},
- "MD-BR": {}, "MD-BS": {}, "MD-CA": {}, "MD-CL": {}, "MD-CM": {},
- "MD-CR": {}, "MD-CS": {}, "MD-CT": {}, "MD-CU": {}, "MD-DO": {},
- "MD-DR": {}, "MD-DU": {}, "MD-ED": {}, "MD-FA": {}, "MD-FL": {},
- "MD-GA": {}, "MD-GL": {}, "MD-HI": {}, "MD-IA": {}, "MD-LE": {},
- "MD-NI": {}, "MD-OC": {}, "MD-OR": {}, "MD-RE": {}, "MD-RI": {},
- "MD-SD": {}, "MD-SI": {}, "MD-SN": {}, "MD-SO": {}, "MD-ST": {},
- "MD-SV": {}, "MD-TA": {}, "MD-TE": {}, "MD-UN": {}, "ME-01": {},
- "ME-02": {}, "ME-03": {}, "ME-04": {}, "ME-05": {}, "ME-06": {},
- "ME-07": {}, "ME-08": {}, "ME-09": {}, "ME-10": {}, "ME-11": {},
- "ME-12": {}, "ME-13": {}, "ME-14": {}, "ME-15": {}, "ME-16": {},
- "ME-17": {}, "ME-18": {}, "ME-19": {}, "ME-20": {}, "ME-21": {}, "ME-24": {},
- "MG-A": {}, "MG-D": {}, "MG-F": {}, "MG-M": {}, "MG-T": {},
- "MG-U": {}, "MH-ALK": {}, "MH-ALL": {}, "MH-ARN": {}, "MH-AUR": {},
- "MH-EBO": {}, "MH-ENI": {}, "MH-JAB": {}, "MH-JAL": {}, "MH-KIL": {},
- "MH-KWA": {}, "MH-L": {}, "MH-LAE": {}, "MH-LIB": {}, "MH-LIK": {},
- "MH-MAJ": {}, "MH-MAL": {}, "MH-MEJ": {}, "MH-MIL": {}, "MH-NMK": {},
- "MH-NMU": {}, "MH-RON": {}, "MH-T": {}, "MH-UJA": {}, "MH-UTI": {},
- "MH-WTJ": {}, "MH-WTN": {}, "MK-101": {}, "MK-102": {}, "MK-103": {},
- "MK-104": {}, "MK-105": {},
- "MK-106": {}, "MK-107": {}, "MK-108": {}, "MK-109": {}, "MK-201": {},
- "MK-202": {}, "MK-205": {}, "MK-206": {}, "MK-207": {}, "MK-208": {},
- "MK-209": {}, "MK-210": {}, "MK-211": {}, "MK-301": {}, "MK-303": {},
- "MK-307": {}, "MK-308": {}, "MK-310": {}, "MK-311": {}, "MK-312": {},
- "MK-401": {}, "MK-402": {}, "MK-403": {}, "MK-404": {}, "MK-405": {},
- "MK-406": {}, "MK-408": {}, "MK-409": {}, "MK-410": {}, "MK-501": {},
- "MK-502": {}, "MK-503": {}, "MK-505": {}, "MK-506": {}, "MK-507": {},
- "MK-508": {}, "MK-509": {}, "MK-601": {}, "MK-602": {}, "MK-604": {},
- "MK-605": {}, "MK-606": {}, "MK-607": {}, "MK-608": {}, "MK-609": {},
- "MK-701": {}, "MK-702": {}, "MK-703": {}, "MK-704": {}, "MK-705": {},
- "MK-803": {}, "MK-804": {}, "MK-806": {}, "MK-807": {}, "MK-809": {},
- "MK-810": {}, "MK-811": {}, "MK-812": {}, "MK-813": {}, "MK-814": {},
- "MK-816": {}, "ML-1": {}, "ML-2": {}, "ML-3": {}, "ML-4": {},
- "ML-5": {}, "ML-6": {}, "ML-7": {}, "ML-8": {}, "ML-BKO": {},
- "MM-01": {}, "MM-02": {}, "MM-03": {}, "MM-04": {}, "MM-05": {},
- "MM-06": {}, "MM-07": {}, "MM-11": {}, "MM-12": {}, "MM-13": {},
- "MM-14": {}, "MM-15": {}, "MM-16": {}, "MM-17": {}, "MM-18": {}, "MN-035": {},
- "MN-037": {}, "MN-039": {}, "MN-041": {}, "MN-043": {}, "MN-046": {},
- "MN-047": {}, "MN-049": {}, "MN-051": {}, "MN-053": {}, "MN-055": {},
- "MN-057": {}, "MN-059": {}, "MN-061": {}, "MN-063": {}, "MN-064": {},
- "MN-065": {}, "MN-067": {}, "MN-069": {}, "MN-071": {}, "MN-073": {},
- "MN-1": {}, "MR-01": {}, "MR-02": {}, "MR-03": {}, "MR-04": {},
- "MR-05": {}, "MR-06": {}, "MR-07": {}, "MR-08": {}, "MR-09": {},
- "MR-10": {}, "MR-11": {}, "MR-12": {}, "MR-13": {}, "MR-NKC": {}, "MT-01": {},
- "MT-02": {}, "MT-03": {}, "MT-04": {}, "MT-05": {}, "MT-06": {},
- "MT-07": {}, "MT-08": {}, "MT-09": {}, "MT-10": {}, "MT-11": {},
- "MT-12": {}, "MT-13": {}, "MT-14": {}, "MT-15": {}, "MT-16": {},
- "MT-17": {}, "MT-18": {}, "MT-19": {}, "MT-20": {}, "MT-21": {},
- "MT-22": {}, "MT-23": {}, "MT-24": {}, "MT-25": {}, "MT-26": {},
- "MT-27": {}, "MT-28": {}, "MT-29": {}, "MT-30": {}, "MT-31": {},
- "MT-32": {}, "MT-33": {}, "MT-34": {}, "MT-35": {}, "MT-36": {},
- "MT-37": {}, "MT-38": {}, "MT-39": {}, "MT-40": {}, "MT-41": {},
- "MT-42": {}, "MT-43": {}, "MT-44": {}, "MT-45": {}, "MT-46": {},
- "MT-47": {}, "MT-48": {}, "MT-49": {}, "MT-50": {}, "MT-51": {},
- "MT-52": {}, "MT-53": {}, "MT-54": {}, "MT-55": {}, "MT-56": {},
- "MT-57": {}, "MT-58": {}, "MT-59": {}, "MT-60": {}, "MT-61": {},
- "MT-62": {}, "MT-63": {}, "MT-64": {}, "MT-65": {}, "MT-66": {},
- "MT-67": {}, "MT-68": {}, "MU-AG": {}, "MU-BL": {}, "MU-BR": {},
- "MU-CC": {}, "MU-CU": {}, "MU-FL": {}, "MU-GP": {}, "MU-MO": {},
- "MU-PA": {}, "MU-PL": {}, "MU-PU": {}, "MU-PW": {}, "MU-QB": {},
- "MU-RO": {}, "MU-RP": {}, "MU-RR": {}, "MU-SA": {}, "MU-VP": {}, "MV-00": {},
- "MV-01": {}, "MV-02": {}, "MV-03": {}, "MV-04": {}, "MV-05": {},
- "MV-07": {}, "MV-08": {}, "MV-12": {}, "MV-13": {}, "MV-14": {},
- "MV-17": {}, "MV-20": {}, "MV-23": {}, "MV-24": {}, "MV-25": {},
- "MV-26": {}, "MV-27": {}, "MV-28": {}, "MV-29": {}, "MV-CE": {},
- "MV-MLE": {}, "MV-NC": {}, "MV-NO": {}, "MV-SC": {}, "MV-SU": {},
- "MV-UN": {}, "MV-US": {}, "MW-BA": {}, "MW-BL": {}, "MW-C": {},
- "MW-CK": {}, "MW-CR": {}, "MW-CT": {}, "MW-DE": {}, "MW-DO": {},
- "MW-KR": {}, "MW-KS": {}, "MW-LI": {}, "MW-LK": {}, "MW-MC": {},
- "MW-MG": {}, "MW-MH": {}, "MW-MU": {}, "MW-MW": {}, "MW-MZ": {},
- "MW-N": {}, "MW-NB": {}, "MW-NE": {}, "MW-NI": {}, "MW-NK": {},
- "MW-NS": {}, "MW-NU": {}, "MW-PH": {}, "MW-RU": {}, "MW-S": {},
- "MW-SA": {}, "MW-TH": {}, "MW-ZO": {}, "MX-AGU": {}, "MX-BCN": {},
- "MX-BCS": {}, "MX-CAM": {}, "MX-CHH": {}, "MX-CHP": {}, "MX-COA": {},
- "MX-COL": {}, "MX-CMX": {}, "MX-DIF": {}, "MX-DUR": {}, "MX-GRO": {}, "MX-GUA": {},
- "MX-HID": {}, "MX-JAL": {}, "MX-MEX": {}, "MX-MIC": {}, "MX-MOR": {},
- "MX-NAY": {}, "MX-NLE": {}, "MX-OAX": {}, "MX-PUE": {}, "MX-QUE": {},
- "MX-ROO": {}, "MX-SIN": {}, "MX-SLP": {}, "MX-SON": {}, "MX-TAB": {},
- "MX-TAM": {}, "MX-TLA": {}, "MX-VER": {}, "MX-YUC": {}, "MX-ZAC": {},
- "MY-01": {}, "MY-02": {}, "MY-03": {}, "MY-04": {}, "MY-05": {},
- "MY-06": {}, "MY-07": {}, "MY-08": {}, "MY-09": {}, "MY-10": {},
- "MY-11": {}, "MY-12": {}, "MY-13": {}, "MY-14": {}, "MY-15": {},
- "MY-16": {}, "MZ-A": {}, "MZ-B": {}, "MZ-G": {}, "MZ-I": {},
- "MZ-L": {}, "MZ-MPM": {}, "MZ-N": {}, "MZ-P": {}, "MZ-Q": {},
- "MZ-S": {}, "MZ-T": {}, "NA-CA": {}, "NA-ER": {}, "NA-HA": {},
- "NA-KA": {}, "NA-KE": {}, "NA-KH": {}, "NA-KU": {}, "NA-KW": {}, "NA-OD": {}, "NA-OH": {},
- "NA-OK": {}, "NA-ON": {}, "NA-OS": {}, "NA-OT": {}, "NA-OW": {},
- "NE-1": {}, "NE-2": {}, "NE-3": {}, "NE-4": {}, "NE-5": {},
- "NE-6": {}, "NE-7": {}, "NE-8": {}, "NG-AB": {}, "NG-AD": {},
- "NG-AK": {}, "NG-AN": {}, "NG-BA": {}, "NG-BE": {}, "NG-BO": {},
- "NG-BY": {}, "NG-CR": {}, "NG-DE": {}, "NG-EB": {}, "NG-ED": {},
- "NG-EK": {}, "NG-EN": {}, "NG-FC": {}, "NG-GO": {}, "NG-IM": {},
- "NG-JI": {}, "NG-KD": {}, "NG-KE": {}, "NG-KN": {}, "NG-KO": {},
- "NG-KT": {}, "NG-KW": {}, "NG-LA": {}, "NG-NA": {}, "NG-NI": {},
- "NG-OG": {}, "NG-ON": {}, "NG-OS": {}, "NG-OY": {}, "NG-PL": {},
- "NG-RI": {}, "NG-SO": {}, "NG-TA": {}, "NG-YO": {}, "NG-ZA": {},
- "NI-AN": {}, "NI-AS": {}, "NI-BO": {}, "NI-CA": {}, "NI-CI": {},
- "NI-CO": {}, "NI-ES": {}, "NI-GR": {}, "NI-JI": {}, "NI-LE": {},
- "NI-MD": {}, "NI-MN": {}, "NI-MS": {}, "NI-MT": {}, "NI-NS": {},
- "NI-RI": {}, "NI-SJ": {}, "NL-AW": {}, "NL-BQ1": {}, "NL-BQ2": {},
- "NL-BQ3": {}, "NL-CW": {}, "NL-DR": {}, "NL-FL": {}, "NL-FR": {},
- "NL-GE": {}, "NL-GR": {}, "NL-LI": {}, "NL-NB": {}, "NL-NH": {},
- "NL-OV": {}, "NL-SX": {}, "NL-UT": {}, "NL-ZE": {}, "NL-ZH": {},
- "NO-03": {}, "NO-11": {}, "NO-15": {}, "NO-16": {}, "NO-17": {},
- "NO-18": {}, "NO-21": {}, "NO-30": {}, "NO-34": {}, "NO-38": {},
- "NO-42": {}, "NO-46": {}, "NO-50": {}, "NO-54": {},
- "NO-22": {}, "NP-1": {}, "NP-2": {}, "NP-3": {}, "NP-4": {},
- "NP-5": {}, "NP-BA": {}, "NP-BH": {}, "NP-DH": {}, "NP-GA": {},
- "NP-JA": {}, "NP-KA": {}, "NP-KO": {}, "NP-LU": {}, "NP-MA": {},
- "NP-ME": {}, "NP-NA": {}, "NP-RA": {}, "NP-SA": {}, "NP-SE": {},
- "NR-01": {}, "NR-02": {}, "NR-03": {}, "NR-04": {}, "NR-05": {},
- "NR-06": {}, "NR-07": {}, "NR-08": {}, "NR-09": {}, "NR-10": {},
- "NR-11": {}, "NR-12": {}, "NR-13": {}, "NR-14": {}, "NZ-AUK": {},
- "NZ-BOP": {}, "NZ-CAN": {}, "NZ-CIT": {}, "NZ-GIS": {}, "NZ-HKB": {},
- "NZ-MBH": {}, "NZ-MWT": {}, "NZ-N": {}, "NZ-NSN": {}, "NZ-NTL": {},
- "NZ-OTA": {}, "NZ-S": {}, "NZ-STL": {}, "NZ-TAS": {}, "NZ-TKI": {},
- "NZ-WGN": {}, "NZ-WKO": {}, "NZ-WTC": {}, "OM-BA": {}, "OM-BS": {}, "OM-BU": {}, "OM-BJ": {},
- "OM-DA": {}, "OM-MA": {}, "OM-MU": {}, "OM-SH": {}, "OM-SJ": {}, "OM-SS": {}, "OM-WU": {},
- "OM-ZA": {}, "OM-ZU": {}, "PA-1": {}, "PA-2": {}, "PA-3": {},
- "PA-4": {}, "PA-5": {}, "PA-6": {}, "PA-7": {}, "PA-8": {},
- "PA-9": {}, "PA-EM": {}, "PA-KY": {}, "PA-NB": {}, "PE-AMA": {},
- "PE-ANC": {}, "PE-APU": {}, "PE-ARE": {}, "PE-AYA": {}, "PE-CAJ": {},
- "PE-CAL": {}, "PE-CUS": {}, "PE-HUC": {}, "PE-HUV": {}, "PE-ICA": {},
- "PE-JUN": {}, "PE-LAL": {}, "PE-LAM": {}, "PE-LIM": {}, "PE-LMA": {},
- "PE-LOR": {}, "PE-MDD": {}, "PE-MOQ": {}, "PE-PAS": {}, "PE-PIU": {},
- "PE-PUN": {}, "PE-SAM": {}, "PE-TAC": {}, "PE-TUM": {}, "PE-UCA": {},
- "PG-CPK": {}, "PG-CPM": {}, "PG-EBR": {}, "PG-EHG": {}, "PG-EPW": {},
- "PG-ESW": {}, "PG-GPK": {}, "PG-MBA": {}, "PG-MPL": {}, "PG-MPM": {},
- "PG-MRL": {}, "PG-NCD": {}, "PG-NIK": {}, "PG-NPP": {}, "PG-NSB": {},
- "PG-SAN": {}, "PG-SHM": {}, "PG-WBK": {}, "PG-WHM": {}, "PG-WPD": {},
- "PH-00": {}, "PH-01": {}, "PH-02": {}, "PH-03": {}, "PH-05": {},
- "PH-06": {}, "PH-07": {}, "PH-08": {}, "PH-09": {}, "PH-10": {},
- "PH-11": {}, "PH-12": {}, "PH-13": {}, "PH-14": {}, "PH-15": {},
- "PH-40": {}, "PH-41": {}, "PH-ABR": {}, "PH-AGN": {}, "PH-AGS": {},
- "PH-AKL": {}, "PH-ALB": {}, "PH-ANT": {}, "PH-APA": {}, "PH-AUR": {},
- "PH-BAN": {}, "PH-BAS": {}, "PH-BEN": {}, "PH-BIL": {}, "PH-BOH": {},
- "PH-BTG": {}, "PH-BTN": {}, "PH-BUK": {}, "PH-BUL": {}, "PH-CAG": {},
- "PH-CAM": {}, "PH-CAN": {}, "PH-CAP": {}, "PH-CAS": {}, "PH-CAT": {},
- "PH-CAV": {}, "PH-CEB": {}, "PH-COM": {}, "PH-DAO": {}, "PH-DAS": {},
- "PH-DAV": {}, "PH-DIN": {}, "PH-EAS": {}, "PH-GUI": {}, "PH-IFU": {},
- "PH-ILI": {}, "PH-ILN": {}, "PH-ILS": {}, "PH-ISA": {}, "PH-KAL": {},
- "PH-LAG": {}, "PH-LAN": {}, "PH-LAS": {}, "PH-LEY": {}, "PH-LUN": {},
- "PH-MAD": {}, "PH-MAG": {}, "PH-MAS": {}, "PH-MDC": {}, "PH-MDR": {},
- "PH-MOU": {}, "PH-MSC": {}, "PH-MSR": {}, "PH-NCO": {}, "PH-NEC": {},
- "PH-NER": {}, "PH-NSA": {}, "PH-NUE": {}, "PH-NUV": {}, "PH-PAM": {},
- "PH-PAN": {}, "PH-PLW": {}, "PH-QUE": {}, "PH-QUI": {}, "PH-RIZ": {},
- "PH-ROM": {}, "PH-SAR": {}, "PH-SCO": {}, "PH-SIG": {}, "PH-SLE": {},
- "PH-SLU": {}, "PH-SOR": {}, "PH-SUK": {}, "PH-SUN": {}, "PH-SUR": {},
- "PH-TAR": {}, "PH-TAW": {}, "PH-WSA": {}, "PH-ZAN": {}, "PH-ZAS": {},
- "PH-ZMB": {}, "PH-ZSI": {}, "PK-BA": {}, "PK-GB": {}, "PK-IS": {},
- "PK-JK": {}, "PK-KP": {}, "PK-PB": {}, "PK-SD": {}, "PK-TA": {},
- "PL-02": {}, "PL-04": {}, "PL-06": {}, "PL-08": {}, "PL-10": {},
- "PL-12": {}, "PL-14": {}, "PL-16": {}, "PL-18": {}, "PL-20": {},
- "PL-22": {}, "PL-24": {}, "PL-26": {}, "PL-28": {}, "PL-30": {}, "PL-32": {},
- "PS-BTH": {}, "PS-DEB": {}, "PS-GZA": {}, "PS-HBN": {},
- "PS-JEM": {}, "PS-JEN": {}, "PS-JRH": {}, "PS-KYS": {}, "PS-NBS": {},
- "PS-NGZ": {}, "PS-QQA": {}, "PS-RBH": {}, "PS-RFH": {}, "PS-SLT": {},
- "PS-TBS": {}, "PS-TKM": {}, "PT-01": {}, "PT-02": {}, "PT-03": {},
- "PT-04": {}, "PT-05": {}, "PT-06": {}, "PT-07": {}, "PT-08": {},
- "PT-09": {}, "PT-10": {}, "PT-11": {}, "PT-12": {}, "PT-13": {},
- "PT-14": {}, "PT-15": {}, "PT-16": {}, "PT-17": {}, "PT-18": {},
- "PT-20": {}, "PT-30": {}, "PW-002": {}, "PW-004": {}, "PW-010": {},
- "PW-050": {}, "PW-100": {}, "PW-150": {}, "PW-212": {}, "PW-214": {},
- "PW-218": {}, "PW-222": {}, "PW-224": {}, "PW-226": {}, "PW-227": {},
- "PW-228": {}, "PW-350": {}, "PW-370": {}, "PY-1": {}, "PY-10": {},
- "PY-11": {}, "PY-12": {}, "PY-13": {}, "PY-14": {}, "PY-15": {},
- "PY-16": {}, "PY-19": {}, "PY-2": {}, "PY-3": {}, "PY-4": {},
- "PY-5": {}, "PY-6": {}, "PY-7": {}, "PY-8": {}, "PY-9": {},
- "PY-ASU": {}, "QA-DA": {}, "QA-KH": {}, "QA-MS": {}, "QA-RA": {},
- "QA-US": {}, "QA-WA": {}, "QA-ZA": {}, "RO-AB": {}, "RO-AG": {},
- "RO-AR": {}, "RO-B": {}, "RO-BC": {}, "RO-BH": {}, "RO-BN": {},
- "RO-BR": {}, "RO-BT": {}, "RO-BV": {}, "RO-BZ": {}, "RO-CJ": {},
- "RO-CL": {}, "RO-CS": {}, "RO-CT": {}, "RO-CV": {}, "RO-DB": {},
- "RO-DJ": {}, "RO-GJ": {}, "RO-GL": {}, "RO-GR": {}, "RO-HD": {},
- "RO-HR": {}, "RO-IF": {}, "RO-IL": {}, "RO-IS": {}, "RO-MH": {},
- "RO-MM": {}, "RO-MS": {}, "RO-NT": {}, "RO-OT": {}, "RO-PH": {},
- "RO-SB": {}, "RO-SJ": {}, "RO-SM": {}, "RO-SV": {}, "RO-TL": {},
- "RO-TM": {}, "RO-TR": {}, "RO-VL": {}, "RO-VN": {}, "RO-VS": {},
- "RS-00": {}, "RS-01": {}, "RS-02": {}, "RS-03": {}, "RS-04": {},
- "RS-05": {}, "RS-06": {}, "RS-07": {}, "RS-08": {}, "RS-09": {},
- "RS-10": {}, "RS-11": {}, "RS-12": {}, "RS-13": {}, "RS-14": {},
- "RS-15": {}, "RS-16": {}, "RS-17": {}, "RS-18": {}, "RS-19": {},
- "RS-20": {}, "RS-21": {}, "RS-22": {}, "RS-23": {}, "RS-24": {},
- "RS-25": {}, "RS-26": {}, "RS-27": {}, "RS-28": {}, "RS-29": {},
- "RS-KM": {}, "RS-VO": {}, "RU-AD": {}, "RU-AL": {}, "RU-ALT": {},
- "RU-AMU": {}, "RU-ARK": {}, "RU-AST": {}, "RU-BA": {}, "RU-BEL": {},
- "RU-BRY": {}, "RU-BU": {}, "RU-CE": {}, "RU-CHE": {}, "RU-CHU": {},
- "RU-CU": {}, "RU-DA": {}, "RU-IN": {}, "RU-IRK": {}, "RU-IVA": {},
- "RU-KAM": {}, "RU-KB": {}, "RU-KC": {}, "RU-KDA": {}, "RU-KEM": {},
- "RU-KGD": {}, "RU-KGN": {}, "RU-KHA": {}, "RU-KHM": {}, "RU-KIR": {},
- "RU-KK": {}, "RU-KL": {}, "RU-KLU": {}, "RU-KO": {}, "RU-KOS": {},
- "RU-KR": {}, "RU-KRS": {}, "RU-KYA": {}, "RU-LEN": {}, "RU-LIP": {},
- "RU-MAG": {}, "RU-ME": {}, "RU-MO": {}, "RU-MOS": {}, "RU-MOW": {},
- "RU-MUR": {}, "RU-NEN": {}, "RU-NGR": {}, "RU-NIZ": {}, "RU-NVS": {},
- "RU-OMS": {}, "RU-ORE": {}, "RU-ORL": {}, "RU-PER": {}, "RU-PNZ": {},
- "RU-PRI": {}, "RU-PSK": {}, "RU-ROS": {}, "RU-RYA": {}, "RU-SA": {},
- "RU-SAK": {}, "RU-SAM": {}, "RU-SAR": {}, "RU-SE": {}, "RU-SMO": {},
- "RU-SPE": {}, "RU-STA": {}, "RU-SVE": {}, "RU-TA": {}, "RU-TAM": {},
- "RU-TOM": {}, "RU-TUL": {}, "RU-TVE": {}, "RU-TY": {}, "RU-TYU": {},
- "RU-UD": {}, "RU-ULY": {}, "RU-VGG": {}, "RU-VLA": {}, "RU-VLG": {},
- "RU-VOR": {}, "RU-YAN": {}, "RU-YAR": {}, "RU-YEV": {}, "RU-ZAB": {},
- "RW-01": {}, "RW-02": {}, "RW-03": {}, "RW-04": {}, "RW-05": {},
- "SA-01": {}, "SA-02": {}, "SA-03": {}, "SA-04": {}, "SA-05": {},
- "SA-06": {}, "SA-07": {}, "SA-08": {}, "SA-09": {}, "SA-10": {},
- "SA-11": {}, "SA-12": {}, "SA-14": {}, "SB-CE": {}, "SB-CH": {},
- "SB-CT": {}, "SB-GU": {}, "SB-IS": {}, "SB-MK": {}, "SB-ML": {},
- "SB-RB": {}, "SB-TE": {}, "SB-WE": {}, "SC-01": {}, "SC-02": {},
- "SC-03": {}, "SC-04": {}, "SC-05": {}, "SC-06": {}, "SC-07": {},
- "SC-08": {}, "SC-09": {}, "SC-10": {}, "SC-11": {}, "SC-12": {},
- "SC-13": {}, "SC-14": {}, "SC-15": {}, "SC-16": {}, "SC-17": {},
- "SC-18": {}, "SC-19": {}, "SC-20": {}, "SC-21": {}, "SC-22": {},
- "SC-23": {}, "SC-24": {}, "SC-25": {}, "SD-DC": {}, "SD-DE": {},
- "SD-DN": {}, "SD-DS": {}, "SD-DW": {}, "SD-GD": {}, "SD-GK": {}, "SD-GZ": {},
- "SD-KA": {}, "SD-KH": {}, "SD-KN": {}, "SD-KS": {}, "SD-NB": {},
- "SD-NO": {}, "SD-NR": {}, "SD-NW": {}, "SD-RS": {}, "SD-SI": {},
- "SE-AB": {}, "SE-AC": {}, "SE-BD": {}, "SE-C": {}, "SE-D": {},
- "SE-E": {}, "SE-F": {}, "SE-G": {}, "SE-H": {}, "SE-I": {},
- "SE-K": {}, "SE-M": {}, "SE-N": {}, "SE-O": {}, "SE-S": {},
- "SE-T": {}, "SE-U": {}, "SE-W": {}, "SE-X": {}, "SE-Y": {},
- "SE-Z": {}, "SG-01": {}, "SG-02": {}, "SG-03": {}, "SG-04": {},
- "SG-05": {}, "SH-AC": {}, "SH-HL": {}, "SH-TA": {}, "SI-001": {},
- "SI-002": {}, "SI-003": {}, "SI-004": {}, "SI-005": {}, "SI-006": {},
- "SI-007": {}, "SI-008": {}, "SI-009": {}, "SI-010": {}, "SI-011": {},
- "SI-012": {}, "SI-013": {}, "SI-014": {}, "SI-015": {}, "SI-016": {},
- "SI-017": {}, "SI-018": {}, "SI-019": {}, "SI-020": {}, "SI-021": {},
- "SI-022": {}, "SI-023": {}, "SI-024": {}, "SI-025": {}, "SI-026": {},
- "SI-027": {}, "SI-028": {}, "SI-029": {}, "SI-030": {}, "SI-031": {},
- "SI-032": {}, "SI-033": {}, "SI-034": {}, "SI-035": {}, "SI-036": {},
- "SI-037": {}, "SI-038": {}, "SI-039": {}, "SI-040": {}, "SI-041": {},
- "SI-042": {}, "SI-043": {}, "SI-044": {}, "SI-045": {}, "SI-046": {},
- "SI-047": {}, "SI-048": {}, "SI-049": {}, "SI-050": {}, "SI-051": {},
- "SI-052": {}, "SI-053": {}, "SI-054": {}, "SI-055": {}, "SI-056": {},
- "SI-057": {}, "SI-058": {}, "SI-059": {}, "SI-060": {}, "SI-061": {},
- "SI-062": {}, "SI-063": {}, "SI-064": {}, "SI-065": {}, "SI-066": {},
- "SI-067": {}, "SI-068": {}, "SI-069": {}, "SI-070": {}, "SI-071": {},
- "SI-072": {}, "SI-073": {}, "SI-074": {}, "SI-075": {}, "SI-076": {},
- "SI-077": {}, "SI-078": {}, "SI-079": {}, "SI-080": {}, "SI-081": {},
- "SI-082": {}, "SI-083": {}, "SI-084": {}, "SI-085": {}, "SI-086": {},
- "SI-087": {}, "SI-088": {}, "SI-089": {}, "SI-090": {}, "SI-091": {},
- "SI-092": {}, "SI-093": {}, "SI-094": {}, "SI-095": {}, "SI-096": {},
- "SI-097": {}, "SI-098": {}, "SI-099": {}, "SI-100": {}, "SI-101": {},
- "SI-102": {}, "SI-103": {}, "SI-104": {}, "SI-105": {}, "SI-106": {},
- "SI-107": {}, "SI-108": {}, "SI-109": {}, "SI-110": {}, "SI-111": {},
- "SI-112": {}, "SI-113": {}, "SI-114": {}, "SI-115": {}, "SI-116": {},
- "SI-117": {}, "SI-118": {}, "SI-119": {}, "SI-120": {}, "SI-121": {},
- "SI-122": {}, "SI-123": {}, "SI-124": {}, "SI-125": {}, "SI-126": {},
- "SI-127": {}, "SI-128": {}, "SI-129": {}, "SI-130": {}, "SI-131": {},
- "SI-132": {}, "SI-133": {}, "SI-134": {}, "SI-135": {}, "SI-136": {},
- "SI-137": {}, "SI-138": {}, "SI-139": {}, "SI-140": {}, "SI-141": {},
- "SI-142": {}, "SI-143": {}, "SI-144": {}, "SI-146": {}, "SI-147": {},
- "SI-148": {}, "SI-149": {}, "SI-150": {}, "SI-151": {}, "SI-152": {},
- "SI-153": {}, "SI-154": {}, "SI-155": {}, "SI-156": {}, "SI-157": {},
- "SI-158": {}, "SI-159": {}, "SI-160": {}, "SI-161": {}, "SI-162": {},
- "SI-163": {}, "SI-164": {}, "SI-165": {}, "SI-166": {}, "SI-167": {},
- "SI-168": {}, "SI-169": {}, "SI-170": {}, "SI-171": {}, "SI-172": {},
- "SI-173": {}, "SI-174": {}, "SI-175": {}, "SI-176": {}, "SI-177": {},
- "SI-178": {}, "SI-179": {}, "SI-180": {}, "SI-181": {}, "SI-182": {},
- "SI-183": {}, "SI-184": {}, "SI-185": {}, "SI-186": {}, "SI-187": {},
- "SI-188": {}, "SI-189": {}, "SI-190": {}, "SI-191": {}, "SI-192": {},
- "SI-193": {}, "SI-194": {}, "SI-195": {}, "SI-196": {}, "SI-197": {},
- "SI-198": {}, "SI-199": {}, "SI-200": {}, "SI-201": {}, "SI-202": {},
- "SI-203": {}, "SI-204": {}, "SI-205": {}, "SI-206": {}, "SI-207": {},
- "SI-208": {}, "SI-209": {}, "SI-210": {}, "SI-211": {}, "SI-212": {}, "SI-213": {}, "SK-BC": {},
- "SK-BL": {}, "SK-KI": {}, "SK-NI": {}, "SK-PV": {}, "SK-TA": {},
- "SK-TC": {}, "SK-ZI": {}, "SL-E": {}, "SL-N": {}, "SL-S": {},
- "SL-W": {}, "SM-01": {}, "SM-02": {}, "SM-03": {}, "SM-04": {},
- "SM-05": {}, "SM-06": {}, "SM-07": {}, "SM-08": {}, "SM-09": {},
- "SN-DB": {}, "SN-DK": {}, "SN-FK": {}, "SN-KA": {}, "SN-KD": {},
- "SN-KE": {}, "SN-KL": {}, "SN-LG": {}, "SN-MT": {}, "SN-SE": {},
- "SN-SL": {}, "SN-TC": {}, "SN-TH": {}, "SN-ZG": {}, "SO-AW": {},
- "SO-BK": {}, "SO-BN": {}, "SO-BR": {}, "SO-BY": {}, "SO-GA": {},
- "SO-GE": {}, "SO-HI": {}, "SO-JD": {}, "SO-JH": {}, "SO-MU": {},
- "SO-NU": {}, "SO-SA": {}, "SO-SD": {}, "SO-SH": {}, "SO-SO": {},
- "SO-TO": {}, "SO-WO": {}, "SR-BR": {}, "SR-CM": {}, "SR-CR": {},
- "SR-MA": {}, "SR-NI": {}, "SR-PM": {}, "SR-PR": {}, "SR-SA": {},
- "SR-SI": {}, "SR-WA": {}, "SS-BN": {}, "SS-BW": {}, "SS-EC": {},
- "SS-EE8": {}, "SS-EE": {}, "SS-EW": {}, "SS-JG": {}, "SS-LK": {}, "SS-NU": {},
- "SS-UY": {}, "SS-WR": {}, "ST-01": {}, "ST-P": {}, "ST-S": {}, "SV-AH": {},
- "SV-CA": {}, "SV-CH": {}, "SV-CU": {}, "SV-LI": {}, "SV-MO": {},
- "SV-PA": {}, "SV-SA": {}, "SV-SM": {}, "SV-SO": {}, "SV-SS": {},
- "SV-SV": {}, "SV-UN": {}, "SV-US": {}, "SY-DI": {}, "SY-DR": {},
- "SY-DY": {}, "SY-HA": {}, "SY-HI": {}, "SY-HL": {}, "SY-HM": {},
- "SY-ID": {}, "SY-LA": {}, "SY-QU": {}, "SY-RA": {}, "SY-RD": {},
- "SY-SU": {}, "SY-TA": {}, "SZ-HH": {}, "SZ-LU": {}, "SZ-MA": {},
- "SZ-SH": {}, "TD-BA": {}, "TD-BG": {}, "TD-BO": {}, "TD-CB": {},
- "TD-EN": {}, "TD-GR": {}, "TD-HL": {}, "TD-KA": {}, "TD-LC": {},
- "TD-LO": {}, "TD-LR": {}, "TD-MA": {}, "TD-MC": {}, "TD-ME": {},
- "TD-MO": {}, "TD-ND": {}, "TD-OD": {}, "TD-SA": {}, "TD-SI": {},
- "TD-TA": {}, "TD-TI": {}, "TD-WF": {}, "TG-C": {}, "TG-K": {},
- "TG-M": {}, "TG-P": {}, "TG-S": {}, "TH-10": {}, "TH-11": {},
- "TH-12": {}, "TH-13": {}, "TH-14": {}, "TH-15": {}, "TH-16": {},
- "TH-17": {}, "TH-18": {}, "TH-19": {}, "TH-20": {}, "TH-21": {},
- "TH-22": {}, "TH-23": {}, "TH-24": {}, "TH-25": {}, "TH-26": {},
- "TH-27": {}, "TH-30": {}, "TH-31": {}, "TH-32": {}, "TH-33": {},
- "TH-34": {}, "TH-35": {}, "TH-36": {}, "TH-37": {}, "TH-38": {}, "TH-39": {},
- "TH-40": {}, "TH-41": {}, "TH-42": {}, "TH-43": {}, "TH-44": {},
- "TH-45": {}, "TH-46": {}, "TH-47": {}, "TH-48": {}, "TH-49": {},
- "TH-50": {}, "TH-51": {}, "TH-52": {}, "TH-53": {}, "TH-54": {},
- "TH-55": {}, "TH-56": {}, "TH-57": {}, "TH-58": {}, "TH-60": {},
- "TH-61": {}, "TH-62": {}, "TH-63": {}, "TH-64": {}, "TH-65": {},
- "TH-66": {}, "TH-67": {}, "TH-70": {}, "TH-71": {}, "TH-72": {},
- "TH-73": {}, "TH-74": {}, "TH-75": {}, "TH-76": {}, "TH-77": {},
- "TH-80": {}, "TH-81": {}, "TH-82": {}, "TH-83": {}, "TH-84": {},
- "TH-85": {}, "TH-86": {}, "TH-90": {}, "TH-91": {}, "TH-92": {},
- "TH-93": {}, "TH-94": {}, "TH-95": {}, "TH-96": {}, "TH-S": {},
- "TJ-GB": {}, "TJ-KT": {}, "TJ-SU": {}, "TJ-DU": {}, "TJ-RA": {}, "TL-AL": {}, "TL-AN": {},
- "TL-BA": {}, "TL-BO": {}, "TL-CO": {}, "TL-DI": {}, "TL-ER": {},
- "TL-LA": {}, "TL-LI": {}, "TL-MF": {}, "TL-MT": {}, "TL-OE": {},
- "TL-VI": {}, "TM-A": {}, "TM-B": {}, "TM-D": {}, "TM-L": {},
- "TM-M": {}, "TM-S": {}, "TN-11": {}, "TN-12": {}, "TN-13": {},
- "TN-14": {}, "TN-21": {}, "TN-22": {}, "TN-23": {}, "TN-31": {},
- "TN-32": {}, "TN-33": {}, "TN-34": {}, "TN-41": {}, "TN-42": {},
- "TN-43": {}, "TN-51": {}, "TN-52": {}, "TN-53": {}, "TN-61": {},
- "TN-71": {}, "TN-72": {}, "TN-73": {}, "TN-81": {}, "TN-82": {},
- "TN-83": {}, "TO-01": {}, "TO-02": {}, "TO-03": {}, "TO-04": {},
- "TO-05": {}, "TR-01": {}, "TR-02": {}, "TR-03": {}, "TR-04": {},
- "TR-05": {}, "TR-06": {}, "TR-07": {}, "TR-08": {}, "TR-09": {},
- "TR-10": {}, "TR-11": {}, "TR-12": {}, "TR-13": {}, "TR-14": {},
- "TR-15": {}, "TR-16": {}, "TR-17": {}, "TR-18": {}, "TR-19": {},
- "TR-20": {}, "TR-21": {}, "TR-22": {}, "TR-23": {}, "TR-24": {},
- "TR-25": {}, "TR-26": {}, "TR-27": {}, "TR-28": {}, "TR-29": {},
- "TR-30": {}, "TR-31": {}, "TR-32": {}, "TR-33": {}, "TR-34": {},
- "TR-35": {}, "TR-36": {}, "TR-37": {}, "TR-38": {}, "TR-39": {},
- "TR-40": {}, "TR-41": {}, "TR-42": {}, "TR-43": {}, "TR-44": {},
- "TR-45": {}, "TR-46": {}, "TR-47": {}, "TR-48": {}, "TR-49": {},
- "TR-50": {}, "TR-51": {}, "TR-52": {}, "TR-53": {}, "TR-54": {},
- "TR-55": {}, "TR-56": {}, "TR-57": {}, "TR-58": {}, "TR-59": {},
- "TR-60": {}, "TR-61": {}, "TR-62": {}, "TR-63": {}, "TR-64": {},
- "TR-65": {}, "TR-66": {}, "TR-67": {}, "TR-68": {}, "TR-69": {},
- "TR-70": {}, "TR-71": {}, "TR-72": {}, "TR-73": {}, "TR-74": {},
- "TR-75": {}, "TR-76": {}, "TR-77": {}, "TR-78": {}, "TR-79": {},
- "TR-80": {}, "TR-81": {}, "TT-ARI": {}, "TT-CHA": {}, "TT-CTT": {},
- "TT-DMN": {}, "TT-ETO": {}, "TT-MRC": {}, "TT-TOB": {}, "TT-PED": {}, "TT-POS": {}, "TT-PRT": {},
- "TT-PTF": {}, "TT-RCM": {}, "TT-SFO": {}, "TT-SGE": {}, "TT-SIP": {},
- "TT-SJL": {}, "TT-TUP": {}, "TT-WTO": {}, "TV-FUN": {}, "TV-NIT": {},
- "TV-NKF": {}, "TV-NKL": {}, "TV-NMA": {}, "TV-NMG": {}, "TV-NUI": {},
- "TV-VAI": {}, "TW-CHA": {}, "TW-CYI": {}, "TW-CYQ": {}, "TW-KIN": {}, "TW-HSQ": {},
- "TW-HSZ": {}, "TW-HUA": {}, "TW-LIE": {}, "TW-ILA": {}, "TW-KEE": {}, "TW-KHH": {},
- "TW-KHQ": {}, "TW-MIA": {}, "TW-NAN": {}, "TW-NWT": {}, "TW-PEN": {}, "TW-PIF": {},
- "TW-TAO": {}, "TW-TNN": {}, "TW-TNQ": {}, "TW-TPE": {}, "TW-TPQ": {},
- "TW-TTT": {}, "TW-TXG": {}, "TW-TXQ": {}, "TW-YUN": {}, "TZ-01": {},
- "TZ-02": {}, "TZ-03": {}, "TZ-04": {}, "TZ-05": {}, "TZ-06": {},
- "TZ-07": {}, "TZ-08": {}, "TZ-09": {}, "TZ-10": {}, "TZ-11": {},
- "TZ-12": {}, "TZ-13": {}, "TZ-14": {}, "TZ-15": {}, "TZ-16": {},
- "TZ-17": {}, "TZ-18": {}, "TZ-19": {}, "TZ-20": {}, "TZ-21": {},
- "TZ-22": {}, "TZ-23": {}, "TZ-24": {}, "TZ-25": {}, "TZ-26": {}, "TZ-27": {}, "TZ-28": {}, "TZ-29": {}, "TZ-30": {}, "TZ-31": {},
- "UA-05": {}, "UA-07": {}, "UA-09": {}, "UA-12": {}, "UA-14": {},
- "UA-18": {}, "UA-21": {}, "UA-23": {}, "UA-26": {}, "UA-30": {},
- "UA-32": {}, "UA-35": {}, "UA-40": {}, "UA-43": {}, "UA-46": {},
- "UA-48": {}, "UA-51": {}, "UA-53": {}, "UA-56": {}, "UA-59": {},
- "UA-61": {}, "UA-63": {}, "UA-65": {}, "UA-68": {}, "UA-71": {},
- "UA-74": {}, "UA-77": {}, "UG-101": {}, "UG-102": {}, "UG-103": {},
- "UG-104": {}, "UG-105": {}, "UG-106": {}, "UG-107": {}, "UG-108": {},
- "UG-109": {}, "UG-110": {}, "UG-111": {}, "UG-112": {}, "UG-113": {},
- "UG-114": {}, "UG-115": {}, "UG-116": {}, "UG-201": {}, "UG-202": {},
- "UG-203": {}, "UG-204": {}, "UG-205": {}, "UG-206": {}, "UG-207": {},
- "UG-208": {}, "UG-209": {}, "UG-210": {}, "UG-211": {}, "UG-212": {},
- "UG-213": {}, "UG-214": {}, "UG-215": {}, "UG-216": {}, "UG-217": {},
- "UG-218": {}, "UG-219": {}, "UG-220": {}, "UG-221": {}, "UG-222": {},
- "UG-223": {}, "UG-224": {}, "UG-301": {}, "UG-302": {}, "UG-303": {},
- "UG-304": {}, "UG-305": {}, "UG-306": {}, "UG-307": {}, "UG-308": {},
- "UG-309": {}, "UG-310": {}, "UG-311": {}, "UG-312": {}, "UG-313": {},
- "UG-314": {}, "UG-315": {}, "UG-316": {}, "UG-317": {}, "UG-318": {},
- "UG-319": {}, "UG-320": {}, "UG-321": {}, "UG-401": {}, "UG-402": {},
- "UG-403": {}, "UG-404": {}, "UG-405": {}, "UG-406": {}, "UG-407": {},
- "UG-408": {}, "UG-409": {}, "UG-410": {}, "UG-411": {}, "UG-412": {},
- "UG-413": {}, "UG-414": {}, "UG-415": {}, "UG-416": {}, "UG-417": {},
- "UG-418": {}, "UG-419": {}, "UG-C": {}, "UG-E": {}, "UG-N": {},
- "UG-W": {}, "UG-322": {}, "UG-323": {}, "UG-420": {}, "UG-117": {},
- "UG-118": {}, "UG-225": {}, "UG-120": {}, "UG-226": {},
- "UG-121": {}, "UG-122": {}, "UG-227": {}, "UG-421": {},
- "UG-325": {}, "UG-228": {}, "UG-123": {}, "UG-422": {},
- "UG-326": {}, "UG-229": {}, "UG-124": {}, "UG-423": {},
- "UG-230": {}, "UG-327": {}, "UG-424": {}, "UG-328": {},
- "UG-425": {}, "UG-426": {}, "UG-330": {},
- "UM-67": {}, "UM-71": {}, "UM-76": {}, "UM-79": {},
- "UM-81": {}, "UM-84": {}, "UM-86": {}, "UM-89": {}, "UM-95": {},
- "US-AK": {}, "US-AL": {}, "US-AR": {}, "US-AS": {}, "US-AZ": {},
- "US-CA": {}, "US-CO": {}, "US-CT": {}, "US-DC": {}, "US-DE": {},
- "US-FL": {}, "US-GA": {}, "US-GU": {}, "US-HI": {}, "US-IA": {},
- "US-ID": {}, "US-IL": {}, "US-IN": {}, "US-KS": {}, "US-KY": {},
- "US-LA": {}, "US-MA": {}, "US-MD": {}, "US-ME": {}, "US-MI": {},
- "US-MN": {}, "US-MO": {}, "US-MP": {}, "US-MS": {}, "US-MT": {},
- "US-NC": {}, "US-ND": {}, "US-NE": {}, "US-NH": {}, "US-NJ": {},
- "US-NM": {}, "US-NV": {}, "US-NY": {}, "US-OH": {}, "US-OK": {},
- "US-OR": {}, "US-PA": {}, "US-PR": {}, "US-RI": {}, "US-SC": {},
- "US-SD": {}, "US-TN": {}, "US-TX": {}, "US-UM": {}, "US-UT": {},
- "US-VA": {}, "US-VI": {}, "US-VT": {}, "US-WA": {}, "US-WI": {},
- "US-WV": {}, "US-WY": {}, "UY-AR": {}, "UY-CA": {}, "UY-CL": {},
- "UY-CO": {}, "UY-DU": {}, "UY-FD": {}, "UY-FS": {}, "UY-LA": {},
- "UY-MA": {}, "UY-MO": {}, "UY-PA": {}, "UY-RN": {}, "UY-RO": {},
- "UY-RV": {}, "UY-SA": {}, "UY-SJ": {}, "UY-SO": {}, "UY-TA": {},
- "UY-TT": {}, "UZ-AN": {}, "UZ-BU": {}, "UZ-FA": {}, "UZ-JI": {},
- "UZ-NG": {}, "UZ-NW": {}, "UZ-QA": {}, "UZ-QR": {}, "UZ-SA": {},
- "UZ-SI": {}, "UZ-SU": {}, "UZ-TK": {}, "UZ-TO": {}, "UZ-XO": {},
- "VC-01": {}, "VC-02": {}, "VC-03": {}, "VC-04": {}, "VC-05": {},
- "VC-06": {}, "VE-A": {}, "VE-B": {}, "VE-C": {}, "VE-D": {},
- "VE-E": {}, "VE-F": {}, "VE-G": {}, "VE-H": {}, "VE-I": {},
- "VE-J": {}, "VE-K": {}, "VE-L": {}, "VE-M": {}, "VE-N": {},
- "VE-O": {}, "VE-P": {}, "VE-R": {}, "VE-S": {}, "VE-T": {},
- "VE-U": {}, "VE-V": {}, "VE-W": {}, "VE-X": {}, "VE-Y": {},
- "VE-Z": {}, "VN-01": {}, "VN-02": {}, "VN-03": {}, "VN-04": {},
- "VN-05": {}, "VN-06": {}, "VN-07": {}, "VN-09": {}, "VN-13": {},
- "VN-14": {}, "VN-15": {}, "VN-18": {}, "VN-20": {}, "VN-21": {},
- "VN-22": {}, "VN-23": {}, "VN-24": {}, "VN-25": {}, "VN-26": {},
- "VN-27": {}, "VN-28": {}, "VN-29": {}, "VN-30": {}, "VN-31": {},
- "VN-32": {}, "VN-33": {}, "VN-34": {}, "VN-35": {}, "VN-36": {},
- "VN-37": {}, "VN-39": {}, "VN-40": {}, "VN-41": {}, "VN-43": {},
- "VN-44": {}, "VN-45": {}, "VN-46": {}, "VN-47": {}, "VN-49": {},
- "VN-50": {}, "VN-51": {}, "VN-52": {}, "VN-53": {}, "VN-54": {},
- "VN-55": {}, "VN-56": {}, "VN-57": {}, "VN-58": {}, "VN-59": {},
- "VN-61": {}, "VN-63": {}, "VN-66": {}, "VN-67": {}, "VN-68": {},
- "VN-69": {}, "VN-70": {}, "VN-71": {}, "VN-72": {}, "VN-73": {},
- "VN-CT": {}, "VN-DN": {}, "VN-HN": {}, "VN-HP": {}, "VN-SG": {},
- "VU-MAP": {}, "VU-PAM": {}, "VU-SAM": {}, "VU-SEE": {}, "VU-TAE": {},
- "VU-TOB": {}, "WF-SG": {}, "WF-UV": {}, "WS-AA": {}, "WS-AL": {}, "WS-AT": {}, "WS-FA": {},
- "WS-GE": {}, "WS-GI": {}, "WS-PA": {}, "WS-SA": {}, "WS-TU": {},
- "WS-VF": {}, "WS-VS": {}, "YE-AB": {}, "YE-AD": {}, "YE-AM": {},
- "YE-BA": {}, "YE-DA": {}, "YE-DH": {}, "YE-HD": {}, "YE-HJ": {}, "YE-HU": {},
- "YE-IB": {}, "YE-JA": {}, "YE-LA": {}, "YE-MA": {}, "YE-MR": {},
- "YE-MU": {}, "YE-MW": {}, "YE-RA": {}, "YE-SA": {}, "YE-SD": {}, "YE-SH": {},
- "YE-SN": {}, "YE-TA": {}, "ZA-EC": {}, "ZA-FS": {}, "ZA-GP": {},
- "ZA-LP": {}, "ZA-MP": {}, "ZA-NC": {}, "ZA-NW": {}, "ZA-WC": {},
- "ZA-ZN": {}, "ZA-KZN": {}, "ZM-01": {}, "ZM-02": {}, "ZM-03": {}, "ZM-04": {},
- "ZM-05": {}, "ZM-06": {}, "ZM-07": {}, "ZM-08": {}, "ZM-09": {}, "ZM-10": {},
- "ZW-BU": {}, "ZW-HA": {}, "ZW-MA": {}, "ZW-MC": {}, "ZW-ME": {},
- "ZW-MI": {}, "ZW-MN": {}, "ZW-MS": {}, "ZW-MV": {}, "ZW-MW": {},
-}
diff --git a/vendor/github.com/go-playground/validator/v10/currency_codes.go b/vendor/github.com/go-playground/validator/v10/currency_codes.go
deleted file mode 100644
index d0317f89c..000000000
--- a/vendor/github.com/go-playground/validator/v10/currency_codes.go
+++ /dev/null
@@ -1,79 +0,0 @@
-package validator
-
-var iso4217 = map[string]struct{}{
- "AFN": {}, "EUR": {}, "ALL": {}, "DZD": {}, "USD": {},
- "AOA": {}, "XCD": {}, "ARS": {}, "AMD": {}, "AWG": {},
- "AUD": {}, "AZN": {}, "BSD": {}, "BHD": {}, "BDT": {},
- "BBD": {}, "BYN": {}, "BZD": {}, "XOF": {}, "BMD": {},
- "INR": {}, "BTN": {}, "BOB": {}, "BOV": {}, "BAM": {},
- "BWP": {}, "NOK": {}, "BRL": {}, "BND": {}, "BGN": {},
- "BIF": {}, "CVE": {}, "KHR": {}, "XAF": {}, "CAD": {},
- "KYD": {}, "CLP": {}, "CLF": {}, "CNY": {}, "COP": {},
- "COU": {}, "KMF": {}, "CDF": {}, "NZD": {}, "CRC": {},
- "HRK": {}, "CUP": {}, "CUC": {}, "ANG": {}, "CZK": {},
- "DKK": {}, "DJF": {}, "DOP": {}, "EGP": {}, "SVC": {},
- "ERN": {}, "SZL": {}, "ETB": {}, "FKP": {}, "FJD": {},
- "XPF": {}, "GMD": {}, "GEL": {}, "GHS": {}, "GIP": {},
- "GTQ": {}, "GBP": {}, "GNF": {}, "GYD": {}, "HTG": {},
- "HNL": {}, "HKD": {}, "HUF": {}, "ISK": {}, "IDR": {},
- "XDR": {}, "IRR": {}, "IQD": {}, "ILS": {}, "JMD": {},
- "JPY": {}, "JOD": {}, "KZT": {}, "KES": {}, "KPW": {},
- "KRW": {}, "KWD": {}, "KGS": {}, "LAK": {}, "LBP": {},
- "LSL": {}, "ZAR": {}, "LRD": {}, "LYD": {}, "CHF": {},
- "MOP": {}, "MKD": {}, "MGA": {}, "MWK": {}, "MYR": {},
- "MVR": {}, "MRU": {}, "MUR": {}, "XUA": {}, "MXN": {},
- "MXV": {}, "MDL": {}, "MNT": {}, "MAD": {}, "MZN": {},
- "MMK": {}, "NAD": {}, "NPR": {}, "NIO": {}, "NGN": {},
- "OMR": {}, "PKR": {}, "PAB": {}, "PGK": {}, "PYG": {},
- "PEN": {}, "PHP": {}, "PLN": {}, "QAR": {}, "RON": {},
- "RUB": {}, "RWF": {}, "SHP": {}, "WST": {}, "STN": {},
- "SAR": {}, "RSD": {}, "SCR": {}, "SLL": {}, "SGD": {},
- "XSU": {}, "SBD": {}, "SOS": {}, "SSP": {}, "LKR": {},
- "SDG": {}, "SRD": {}, "SEK": {}, "CHE": {}, "CHW": {},
- "SYP": {}, "TWD": {}, "TJS": {}, "TZS": {}, "THB": {},
- "TOP": {}, "TTD": {}, "TND": {}, "TRY": {}, "TMT": {},
- "UGX": {}, "UAH": {}, "AED": {}, "USN": {}, "UYU": {},
- "UYI": {}, "UYW": {}, "UZS": {}, "VUV": {}, "VES": {},
- "VND": {}, "YER": {}, "ZMW": {}, "ZWL": {}, "XBA": {},
- "XBB": {}, "XBC": {}, "XBD": {}, "XTS": {}, "XXX": {},
- "XAU": {}, "XPD": {}, "XPT": {}, "XAG": {},
-}
-
-var iso4217_numeric = map[int]struct{}{
- 8: {}, 12: {}, 32: {}, 36: {}, 44: {},
- 48: {}, 50: {}, 51: {}, 52: {}, 60: {},
- 64: {}, 68: {}, 72: {}, 84: {}, 90: {},
- 96: {}, 104: {}, 108: {}, 116: {}, 124: {},
- 132: {}, 136: {}, 144: {}, 152: {}, 156: {},
- 170: {}, 174: {}, 188: {}, 191: {}, 192: {},
- 203: {}, 208: {}, 214: {}, 222: {}, 230: {},
- 232: {}, 238: {}, 242: {}, 262: {}, 270: {},
- 292: {}, 320: {}, 324: {}, 328: {}, 332: {},
- 340: {}, 344: {}, 348: {}, 352: {}, 356: {},
- 360: {}, 364: {}, 368: {}, 376: {}, 388: {},
- 392: {}, 398: {}, 400: {}, 404: {}, 408: {},
- 410: {}, 414: {}, 417: {}, 418: {}, 422: {},
- 426: {}, 430: {}, 434: {}, 446: {}, 454: {},
- 458: {}, 462: {}, 480: {}, 484: {}, 496: {},
- 498: {}, 504: {}, 512: {}, 516: {}, 524: {},
- 532: {}, 533: {}, 548: {}, 554: {}, 558: {},
- 566: {}, 578: {}, 586: {}, 590: {}, 598: {},
- 600: {}, 604: {}, 608: {}, 634: {}, 643: {},
- 646: {}, 654: {}, 682: {}, 690: {}, 694: {},
- 702: {}, 704: {}, 706: {}, 710: {}, 728: {},
- 748: {}, 752: {}, 756: {}, 760: {}, 764: {},
- 776: {}, 780: {}, 784: {}, 788: {}, 800: {},
- 807: {}, 818: {}, 826: {}, 834: {}, 840: {},
- 858: {}, 860: {}, 882: {}, 886: {}, 901: {},
- 927: {}, 928: {}, 929: {}, 930: {}, 931: {},
- 932: {}, 933: {}, 934: {}, 936: {}, 938: {},
- 940: {}, 941: {}, 943: {}, 944: {}, 946: {},
- 947: {}, 948: {}, 949: {}, 950: {}, 951: {},
- 952: {}, 953: {}, 955: {}, 956: {}, 957: {},
- 958: {}, 959: {}, 960: {}, 961: {}, 962: {},
- 963: {}, 964: {}, 965: {}, 967: {}, 968: {},
- 969: {}, 970: {}, 971: {}, 972: {}, 973: {},
- 975: {}, 976: {}, 977: {}, 978: {}, 979: {},
- 980: {}, 981: {}, 984: {}, 985: {}, 986: {},
- 990: {}, 994: {}, 997: {}, 999: {},
-}
diff --git a/vendor/github.com/go-playground/validator/v10/doc.go b/vendor/github.com/go-playground/validator/v10/doc.go
deleted file mode 100644
index c9b1616ee..000000000
--- a/vendor/github.com/go-playground/validator/v10/doc.go
+++ /dev/null
@@ -1,1498 +0,0 @@
-/*
-Package validator implements value validations for structs and individual fields
-based on tags.
-
-It can also handle Cross-Field and Cross-Struct validation for nested structs
-and has the ability to dive into arrays and maps of any type.
-
-see more examples https://github.com/go-playground/validator/tree/master/_examples
-
-# Singleton
-
-Validator is designed to be thread-safe and used as a singleton instance.
-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.
-The not thread-safe functions are explicitly marked as such in the documentation.
-
-# Validation Functions Return Type error
-
-Doing things this way is actually the way the standard library does, see the
-file.Open method here:
-
- https://golang.org/pkg/os/#Open.
-
-The authors return type "error" to avoid the issue discussed in the following,
-where err is always != nil:
-
- http://stackoverflow.com/a/29138676/3158232
- https://github.com/go-playground/validator/issues/134
-
-Validator only InvalidValidationError for bad validation input, nil or
-ValidationErrors as type error; so, in your code all you need to do is check
-if the error returned is not nil, and if it's not check if error is
-InvalidValidationError ( if necessary, most of the time it isn't ) type cast
-it to type ValidationErrors like so err.(validator.ValidationErrors).
-
-# Custom Validation Functions
-
-Custom Validation functions can be added. Example:
-
- // Structure
- func customFunc(fl validator.FieldLevel) bool {
-
- if fl.Field().String() == "invalid" {
- return false
- }
-
- return true
- }
-
- validate.RegisterValidation("custom tag name", customFunc)
- // NOTES: using the same tag name as an existing function
- // will overwrite the existing one
-
-# Cross-Field Validation
-
-Cross-Field Validation can be done via the following tags:
- - eqfield
- - nefield
- - gtfield
- - gtefield
- - ltfield
- - ltefield
- - eqcsfield
- - necsfield
- - gtcsfield
- - gtecsfield
- - ltcsfield
- - ltecsfield
-
-If, however, some custom cross-field validation is required, it can be done
-using a custom validation.
-
-Why not just have cross-fields validation tags (i.e. only eqcsfield and not
-eqfield)?
-
-The reason is efficiency. If you want to check a field within the same struct
-"eqfield" only has to find the field on the same struct (1 level). But, if we
-used "eqcsfield" it could be multiple levels down. Example:
-
- type Inner struct {
- StartDate time.Time
- }
-
- type Outer struct {
- InnerStructField *Inner
- CreatedAt time.Time `validate:"ltecsfield=InnerStructField.StartDate"`
- }
-
- now := time.Now()
-
- inner := &Inner{
- StartDate: now,
- }
-
- outer := &Outer{
- InnerStructField: inner,
- CreatedAt: now,
- }
-
- errs := validate.Struct(outer)
-
- // NOTE: when calling validate.Struct(val) topStruct will be the top level struct passed
- // into the function
- // when calling validate.VarWithValue(val, field, tag) val will be
- // whatever you pass, struct, field...
- // when calling validate.Field(field, tag) val will be nil
-
-# Multiple Validators
-
-Multiple validators on a field will process in the order defined. Example:
-
- type Test struct {
- Field `validate:"max=10,min=1"`
- }
-
- // max will be checked then min
-
-Bad Validator definitions are not handled by the library. Example:
-
- type Test struct {
- Field `validate:"min=10,max=0"`
- }
-
- // this definition of min max will never succeed
-
-# Using Validator Tags
-
-Baked In Cross-Field validation only compares fields on the same struct.
-If Cross-Field + Cross-Struct validation is needed you should implement your
-own custom validator.
-
-Comma (",") is the default separator of validation tags. If you wish to
-have a comma included within the parameter (i.e. excludesall=,) you will need to
-use the UTF-8 hex representation 0x2C, which is replaced in the code as a comma,
-so the above will become excludesall=0x2C.
-
- type Test struct {
- Field `validate:"excludesall=,"` // BAD! Do not include a comma.
- Field `validate:"excludesall=0x2C"` // GOOD! Use the UTF-8 hex representation.
- }
-
-Pipe ("|") is the 'or' validation tags deparator. If you wish to
-have a pipe included within the parameter i.e. excludesall=| you will need to
-use the UTF-8 hex representation 0x7C, which is replaced in the code as a pipe,
-so the above will become excludesall=0x7C
-
- type Test struct {
- Field `validate:"excludesall=|"` // BAD! Do not include a pipe!
- Field `validate:"excludesall=0x7C"` // GOOD! Use the UTF-8 hex representation.
- }
-
-# Baked In Validators and Tags
-
-Here is a list of the current built in validators:
-
-# Skip Field
-
-Tells the validation to skip this struct field; this is particularly
-handy in ignoring embedded structs from being validated. (Usage: -)
-
- Usage: -
-
-# Or Operator
-
-This is the 'or' operator allowing multiple validators to be used and
-accepted. (Usage: rgb|rgba) <-- this would allow either rgb or rgba
-colors to be accepted. This can also be combined with 'and' for example
-( Usage: omitempty,rgb|rgba)
-
- Usage: |
-
-# StructOnly
-
-When a field that is a nested struct is encountered, and contains this flag
-any validation on the nested struct will be run, but none of the nested
-struct fields will be validated. This is useful if inside of your program
-you know the struct will be valid, but need to verify it has been assigned.
-NOTE: only "required" and "omitempty" can be used on a struct itself.
-
- Usage: structonly
-
-# NoStructLevel
-
-Same as structonly tag except that any struct level validations will not run.
-
- Usage: nostructlevel
-
-# Omit Empty
-
-Allows conditional validation, for example if a field is not set with
-a value (Determined by the "required" validator) then other validation
-such as min or max won't run, but if a value is set validation will run.
-
- Usage: omitempty
-
-# Omit Nil
-
-Allows to skip the validation if the value is nil (same as omitempty, but
-only for the nil-values).
-
- Usage: omitnil
-
-# Dive
-
-This tells the validator to dive into a slice, array or map and validate that
-level of the slice, array or map with the validation tags that follow.
-Multidimensional nesting is also supported, each level you wish to dive will
-require another dive tag. dive has some sub-tags, 'keys' & 'endkeys', please see
-the Keys & EndKeys section just below.
-
- Usage: dive
-
-Example #1
-
- [][]string with validation tag "gt=0,dive,len=1,dive,required"
- // gt=0 will be applied to []
- // len=1 will be applied to []string
- // required will be applied to string
-
-Example #2
-
- [][]string with validation tag "gt=0,dive,dive,required"
- // gt=0 will be applied to []
- // []string will be spared validation
- // required will be applied to string
-
-Keys & EndKeys
-
-These are to be used together directly after the dive tag and tells the validator
-that anything between 'keys' and 'endkeys' applies to the keys of a map and not the
-values; think of it like the 'dive' tag, but for map keys instead of values.
-Multidimensional nesting is also supported, each level you wish to validate will
-require another 'keys' and 'endkeys' tag. These tags are only valid for maps.
-
- Usage: dive,keys,othertagvalidation(s),endkeys,valuevalidationtags
-
-Example #1
-
- map[string]string with validation tag "gt=0,dive,keys,eq=1|eq=2,endkeys,required"
- // gt=0 will be applied to the map itself
- // eq=1|eq=2 will be applied to the map keys
- // required will be applied to map values
-
-Example #2
-
- map[[2]string]string with validation tag "gt=0,dive,keys,dive,eq=1|eq=2,endkeys,required"
- // gt=0 will be applied to the map itself
- // eq=1|eq=2 will be applied to each array element in the map keys
- // required will be applied to map values
-
-# Required
-
-This validates that the value is not the data types default zero value.
-For numbers ensures value is not zero. For strings ensures value is
-not "". For booleans ensures value is not false. For slices, maps, pointers, interfaces, channels and functions
-ensures the value is not nil. For structs ensures value is not the zero value when using WithRequiredStructEnabled.
-
- Usage: required
-
-# Required If
-
-The field under validation must be present and not empty only if all
-the other specified fields are equal to the value following the specified
-field. For strings ensures value is not "". For slices, maps, pointers,
-interfaces, channels and functions ensures the value is not nil. For structs ensures value is not the zero value.
-
- Usage: required_if
-
-Examples:
-
- // require the field if the Field1 is equal to the parameter given:
- Usage: required_if=Field1 foobar
-
- // require the field if the Field1 and Field2 is equal to the value respectively:
- Usage: required_if=Field1 foo Field2 bar
-
-# Required Unless
-
-The field under validation must be present and not empty unless all
-the other specified fields are equal to the value following the specified
-field. For strings ensures value is not "". For slices, maps, pointers,
-interfaces, channels and functions ensures the value is not nil. For structs ensures value is not the zero value.
-
- Usage: required_unless
-
-Examples:
-
- // require the field unless the Field1 is equal to the parameter given:
- Usage: required_unless=Field1 foobar
-
- // require the field unless the Field1 and Field2 is equal to the value respectively:
- Usage: required_unless=Field1 foo Field2 bar
-
-# Required With
-
-The field under validation must be present and not empty only if any
-of the other specified fields are present. For strings ensures value is
-not "". For slices, maps, pointers, interfaces, channels and functions
-ensures the value is not nil. For structs ensures value is not the zero value.
-
- Usage: required_with
-
-Examples:
-
- // require the field if the Field1 is present:
- Usage: required_with=Field1
-
- // require the field if the Field1 or Field2 is present:
- Usage: required_with=Field1 Field2
-
-# Required With All
-
-The field under validation must be present and not empty only if all
-of the other specified fields are present. For strings ensures value is
-not "". For slices, maps, pointers, interfaces, channels and functions
-ensures the value is not nil. For structs ensures value is not the zero value.
-
- Usage: required_with_all
-
-Example:
-
- // require the field if the Field1 and Field2 is present:
- Usage: required_with_all=Field1 Field2
-
-# Required Without
-
-The field under validation must be present and not empty only when any
-of the other specified fields are not present. For strings ensures value is
-not "". For slices, maps, pointers, interfaces, channels and functions
-ensures the value is not nil. For structs ensures value is not the zero value.
-
- Usage: required_without
-
-Examples:
-
- // require the field if the Field1 is not present:
- Usage: required_without=Field1
-
- // require the field if the Field1 or Field2 is not present:
- Usage: required_without=Field1 Field2
-
-# Required Without All
-
-The field under validation must be present and not empty only when all
-of the other specified fields are not present. For strings ensures value is
-not "". For slices, maps, pointers, interfaces, channels and functions
-ensures the value is not nil. For structs ensures value is not the zero value.
-
- Usage: required_without_all
-
-Example:
-
- // require the field if the Field1 and Field2 is not present:
- Usage: required_without_all=Field1 Field2
-
-# Excluded If
-
-The field under validation must not be present or not empty only if all
-the other specified fields are equal to the value following the specified
-field. For strings ensures value is not "". For slices, maps, pointers,
-interfaces, channels and functions ensures the value is not nil. For structs ensures value is not the zero value.
-
- Usage: excluded_if
-
-Examples:
-
- // exclude the field if the Field1 is equal to the parameter given:
- Usage: excluded_if=Field1 foobar
-
- // exclude the field if the Field1 and Field2 is equal to the value respectively:
- Usage: excluded_if=Field1 foo Field2 bar
-
-# Excluded Unless
-
-The field under validation must not be present or empty unless all
-the other specified fields are equal to the value following the specified
-field. For strings ensures value is not "". For slices, maps, pointers,
-interfaces, channels and functions ensures the value is not nil. For structs ensures value is not the zero value.
-
- Usage: excluded_unless
-
-Examples:
-
- // exclude the field unless the Field1 is equal to the parameter given:
- Usage: excluded_unless=Field1 foobar
-
- // exclude the field unless the Field1 and Field2 is equal to the value respectively:
- Usage: excluded_unless=Field1 foo Field2 bar
-
-# Is Default
-
-This validates that the value is the default value and is almost the
-opposite of required.
-
- Usage: isdefault
-
-# Length
-
-For numbers, length will ensure that the value is
-equal to the parameter given. For strings, it checks that
-the string length is exactly that number of characters. For slices,
-arrays, and maps, validates the number of items.
-
-Example #1
-
- Usage: len=10
-
-Example #2 (time.Duration)
-
-For time.Duration, len will ensure that the value is equal to the duration given
-in the parameter.
-
- Usage: len=1h30m
-
-# Maximum
-
-For numbers, max will ensure that the value is
-less than or equal to the parameter given. For strings, it checks
-that the string length is at most that number of characters. For
-slices, arrays, and maps, validates the number of items.
-
-Example #1
-
- Usage: max=10
-
-Example #2 (time.Duration)
-
-For time.Duration, max will ensure that the value is less than or equal to the
-duration given in the parameter.
-
- Usage: max=1h30m
-
-# Minimum
-
-For numbers, min will ensure that the value is
-greater or equal to the parameter given. For strings, it checks that
-the string length is at least that number of characters. For slices,
-arrays, and maps, validates the number of items.
-
-Example #1
-
- Usage: min=10
-
-Example #2 (time.Duration)
-
-For time.Duration, min will ensure that the value is greater than or equal to
-the duration given in the parameter.
-
- Usage: min=1h30m
-
-# Equals
-
-For strings & numbers, eq will ensure that the value is
-equal to the parameter given. For slices, arrays, and maps,
-validates the number of items.
-
-Example #1
-
- Usage: eq=10
-
-Example #2 (time.Duration)
-
-For time.Duration, eq will ensure that the value is equal to the duration given
-in the parameter.
-
- Usage: eq=1h30m
-
-# Not Equal
-
-For strings & numbers, ne will ensure that the value is not
-equal to the parameter given. For slices, arrays, and maps,
-validates the number of items.
-
-Example #1
-
- Usage: ne=10
-
-Example #2 (time.Duration)
-
-For time.Duration, ne will ensure that the value is not equal to the duration
-given in the parameter.
-
- Usage: ne=1h30m
-
-# One Of
-
-For strings, ints, and uints, oneof will ensure that the value
-is one of the values in the parameter. The parameter should be
-a list of values separated by whitespace. Values may be
-strings or numbers. To match strings with spaces in them, include
-the target string between single quotes. Kind of like an 'enum'.
-
- Usage: oneof=red green
- oneof='red green' 'blue yellow'
- oneof=5 7 9
-
-# One Of Case Insensitive
-
-Works the same as oneof but is case insensitive and therefore only accepts strings.
-
- Usage: oneofci=red green
- oneofci='red green' 'blue yellow'
-
-# Greater Than
-
-For numbers, this will ensure that the value is greater than the
-parameter given. For strings, it checks that the string length
-is greater than that number of characters. For slices, arrays
-and maps it validates the number of items.
-
-Example #1
-
- Usage: gt=10
-
-Example #2 (time.Time)
-
-For time.Time ensures the time value is greater than time.Now.UTC().
-
- Usage: gt
-
-Example #3 (time.Duration)
-
-For time.Duration, gt will ensure that the value is greater than the duration
-given in the parameter.
-
- Usage: gt=1h30m
-
-# Greater Than or Equal
-
-Same as 'min' above. Kept both to make terminology with 'len' easier.
-
-Example #1
-
- Usage: gte=10
-
-Example #2 (time.Time)
-
-For time.Time ensures the time value is greater than or equal to time.Now.UTC().
-
- Usage: gte
-
-Example #3 (time.Duration)
-
-For time.Duration, gte will ensure that the value is greater than or equal to
-the duration given in the parameter.
-
- Usage: gte=1h30m
-
-# Less Than
-
-For numbers, this will ensure that the value is less than the parameter given.
-For strings, it checks that the string length is less than that number of
-characters. For slices, arrays, and maps it validates the number of items.
-
-Example #1
-
- Usage: lt=10
-
-Example #2 (time.Time)
-
-For time.Time ensures the time value is less than time.Now.UTC().
-
- Usage: lt
-
-Example #3 (time.Duration)
-
-For time.Duration, lt will ensure that the value is less than the duration given
-in the parameter.
-
- Usage: lt=1h30m
-
-# Less Than or Equal
-
-Same as 'max' above. Kept both to make terminology with 'len' easier.
-
-Example #1
-
- Usage: lte=10
-
-Example #2 (time.Time)
-
-For time.Time ensures the time value is less than or equal to time.Now.UTC().
-
- Usage: lte
-
-Example #3 (time.Duration)
-
-For time.Duration, lte will ensure that the value is less than or equal to the
-duration given in the parameter.
-
- Usage: lte=1h30m
-
-# Field Equals Another Field
-
-This will validate the field value against another fields value either within
-a struct or passed in field.
-
-Example #1:
-
- // Validation on Password field using:
- Usage: eqfield=ConfirmPassword
-
-Example #2:
-
- // Validating by field:
- validate.VarWithValue(password, confirmpassword, "eqfield")
-
-Field Equals Another Field (relative)
-
-This does the same as eqfield except that it validates the field provided relative
-to the top level struct.
-
- Usage: eqcsfield=InnerStructField.Field)
-
-# Field Does Not Equal Another Field
-
-This will validate the field value against another fields value either within
-a struct or passed in field.
-
-Examples:
-
- // Confirm two colors are not the same:
- //
- // Validation on Color field:
- Usage: nefield=Color2
-
- // Validating by field:
- validate.VarWithValue(color1, color2, "nefield")
-
-Field Does Not Equal Another Field (relative)
-
-This does the same as nefield except that it validates the field provided
-relative to the top level struct.
-
- Usage: necsfield=InnerStructField.Field
-
-# Field Greater Than Another Field
-
-Only valid for Numbers, time.Duration and time.Time types, this will validate
-the field value against another fields value either within a struct or passed in
-field. usage examples are for validation of a Start and End date:
-
-Example #1:
-
- // Validation on End field using:
- validate.Struct Usage(gtfield=Start)
-
-Example #2:
-
- // Validating by field:
- validate.VarWithValue(start, end, "gtfield")
-
-# Field Greater Than Another Relative Field
-
-This does the same as gtfield except that it validates the field provided
-relative to the top level struct.
-
- Usage: gtcsfield=InnerStructField.Field
-
-# Field Greater Than or Equal To Another Field
-
-Only valid for Numbers, time.Duration and time.Time types, this will validate
-the field value against another fields value either within a struct or passed in
-field. usage examples are for validation of a Start and End date:
-
-Example #1:
-
- // Validation on End field using:
- validate.Struct Usage(gtefield=Start)
-
-Example #2:
-
- // Validating by field:
- validate.VarWithValue(start, end, "gtefield")
-
-# Field Greater Than or Equal To Another Relative Field
-
-This does the same as gtefield except that it validates the field provided relative
-to the top level struct.
-
- Usage: gtecsfield=InnerStructField.Field
-
-# Less Than Another Field
-
-Only valid for Numbers, time.Duration and time.Time types, this will validate
-the field value against another fields value either within a struct or passed in
-field. usage examples are for validation of a Start and End date:
-
-Example #1:
-
- // Validation on End field using:
- validate.Struct Usage(ltfield=Start)
-
-Example #2:
-
- // Validating by field:
- validate.VarWithValue(start, end, "ltfield")
-
-# Less Than Another Relative Field
-
-This does the same as ltfield except that it validates the field provided relative
-to the top level struct.
-
- Usage: ltcsfield=InnerStructField.Field
-
-# Less Than or Equal To Another Field
-
-Only valid for Numbers, time.Duration and time.Time types, this will validate
-the field value against another fields value either within a struct or passed in
-field. usage examples are for validation of a Start and End date:
-
-Example #1:
-
- // Validation on End field using:
- validate.Struct Usage(ltefield=Start)
-
-Example #2:
-
- // Validating by field:
- validate.VarWithValue(start, end, "ltefield")
-
-# Less Than or Equal To Another Relative Field
-
-This does the same as ltefield except that it validates the field provided relative
-to the top level struct.
-
- Usage: ltecsfield=InnerStructField.Field
-
-# Field Contains Another Field
-
-This does the same as contains except for struct fields. It should only be used
-with string types. See the behavior of reflect.Value.String() for behavior on
-other types.
-
- Usage: containsfield=InnerStructField.Field
-
-# Field Excludes Another Field
-
-This does the same as excludes except for struct fields. It should only be used
-with string types. See the behavior of reflect.Value.String() for behavior on
-other types.
-
- Usage: excludesfield=InnerStructField.Field
-
-# Unique
-
-For arrays & slices, unique will ensure that there are no duplicates.
-For maps, unique will ensure that there are no duplicate values.
-For slices of struct, unique will ensure that there are no duplicate values
-in a field of the struct specified via a parameter.
-
- // For arrays, slices, and maps:
- Usage: unique
-
- // For slices of struct:
- Usage: unique=field
-
-# Alpha Only
-
-This validates that a string value contains ASCII alpha characters only
-
- Usage: alpha
-
-# Alphanumeric
-
-This validates that a string value contains ASCII alphanumeric characters only
-
- Usage: alphanum
-
-# Alpha Unicode
-
-This validates that a string value contains unicode alpha characters only
-
- Usage: alphaunicode
-
-# Alphanumeric Unicode
-
-This validates that a string value contains unicode alphanumeric characters only
-
- Usage: alphanumunicode
-
-# Boolean
-
-This validates that a string value can successfully be parsed into a boolean with strconv.ParseBool
-
- Usage: boolean
-
-# Number
-
-This validates that a string value contains number values only.
-For integers or float it returns true.
-
- Usage: number
-
-# Numeric
-
-This validates that a string value contains a basic numeric value.
-basic excludes exponents etc...
-for integers or float it returns true.
-
- Usage: numeric
-
-# Hexadecimal String
-
-This validates that a string value contains a valid hexadecimal.
-
- Usage: hexadecimal
-
-# Hexcolor String
-
-This validates that a string value contains a valid hex color including
-hashtag (#)
-
- Usage: hexcolor
-
-# Lowercase String
-
-This validates that a string value contains only lowercase characters. An empty string is not a valid lowercase string.
-
- Usage: lowercase
-
-# Uppercase String
-
-This validates that a string value contains only uppercase characters. An empty string is not a valid uppercase string.
-
- Usage: uppercase
-
-# RGB String
-
-This validates that a string value contains a valid rgb color
-
- Usage: rgb
-
-# RGBA String
-
-This validates that a string value contains a valid rgba color
-
- Usage: rgba
-
-# HSL String
-
-This validates that a string value contains a valid hsl color
-
- Usage: hsl
-
-# HSLA String
-
-This validates that a string value contains a valid hsla color
-
- Usage: hsla
-
-# E.164 Phone Number String
-
-This validates that a string value contains a valid E.164 Phone number
-https://en.wikipedia.org/wiki/E.164 (ex. +1123456789)
-
- Usage: e164
-
-# E-mail String
-
-This validates that a string value contains a valid email
-This may not conform to all possibilities of any rfc standard, but neither
-does any email provider accept all possibilities.
-
- Usage: email
-
-# JSON String
-
-This validates that a string value is valid JSON
-
- Usage: json
-
-# JWT String
-
-This validates that a string value is a valid JWT
-
- Usage: jwt
-
-# File
-
-This validates that a string value contains a valid file path and that
-the file exists on the machine.
-This is done using os.Stat, which is a platform independent function.
-
- Usage: file
-
-# Image path
-
-This validates that a string value contains a valid file path and that
-the file exists on the machine and is an image.
-This is done using os.Stat and github.com/gabriel-vasile/mimetype
-
- Usage: image
-
-# File Path
-
-This validates that a string value contains a valid file path but does not
-validate the existence of that file.
-This is done using os.Stat, which is a platform independent function.
-
- Usage: filepath
-
-# URL String
-
-This validates that a string value contains a valid url
-This will accept any url the golang request uri accepts but must contain
-a schema for example http:// or rtmp://
-
- Usage: url
-
-# URI String
-
-This validates that a string value contains a valid uri
-This will accept any uri the golang request uri accepts
-
- Usage: uri
-
-# Urn RFC 2141 String
-
-This validates that a string value contains a valid URN
-according to the RFC 2141 spec.
-
- Usage: urn_rfc2141
-
-# Base32 String
-
-This validates that a string value contains a valid bas324 value.
-Although an empty string is valid base32 this will report an empty string
-as an error, if you wish to accept an empty string as valid you can use
-this with the omitempty tag.
-
- Usage: base32
-
-# Base64 String
-
-This validates that a string value contains a valid base64 value.
-Although an empty string is valid base64 this will report an empty string
-as an error, if you wish to accept an empty string as valid you can use
-this with the omitempty tag.
-
- Usage: base64
-
-# Base64URL String
-
-This validates that a string value contains a valid base64 URL safe value
-according the RFC4648 spec.
-Although an empty string is a valid base64 URL safe value, this will report
-an empty string as an error, if you wish to accept an empty string as valid
-you can use this with the omitempty tag.
-
- Usage: base64url
-
-# Base64RawURL String
-
-This validates that a string value contains a valid base64 URL safe value,
-but without = padding, according the RFC4648 spec, section 3.2.
-Although an empty string is a valid base64 URL safe value, this will report
-an empty string as an error, if you wish to accept an empty string as valid
-you can use this with the omitempty tag.
-
- Usage: base64url
-
-# Bitcoin Address
-
-This validates that a string value contains a valid bitcoin address.
-The format of the string is checked to ensure it matches one of the three formats
-P2PKH, P2SH and performs checksum validation.
-
- Usage: btc_addr
-
-Bitcoin Bech32 Address (segwit)
-
-This validates that a string value contains a valid bitcoin Bech32 address as defined
-by bip-0173 (https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki)
-Special thanks to Pieter Wuille for providing reference implementations.
-
- Usage: btc_addr_bech32
-
-# Ethereum Address
-
-This validates that a string value contains a valid ethereum address.
-The format of the string is checked to ensure it matches the standard Ethereum address format.
-
- Usage: eth_addr
-
-# Contains
-
-This validates that a string value contains the substring value.
-
- Usage: contains=@
-
-# Contains Any
-
-This validates that a string value contains any Unicode code points
-in the substring value.
-
- Usage: containsany=!@#?
-
-# Contains Rune
-
-This validates that a string value contains the supplied rune value.
-
- Usage: containsrune=@
-
-# Excludes
-
-This validates that a string value does not contain the substring value.
-
- Usage: excludes=@
-
-# Excludes All
-
-This validates that a string value does not contain any Unicode code
-points in the substring value.
-
- Usage: excludesall=!@#?
-
-# Excludes Rune
-
-This validates that a string value does not contain the supplied rune value.
-
- Usage: excludesrune=@
-
-# Starts With
-
-This validates that a string value starts with the supplied string value
-
- Usage: startswith=hello
-
-# Ends With
-
-This validates that a string value ends with the supplied string value
-
- Usage: endswith=goodbye
-
-# Does Not Start With
-
-This validates that a string value does not start with the supplied string value
-
- Usage: startsnotwith=hello
-
-# Does Not End With
-
-This validates that a string value does not end with the supplied string value
-
- Usage: endsnotwith=goodbye
-
-# International Standard Book Number
-
-This validates that a string value contains a valid isbn10 or isbn13 value.
-
- Usage: isbn
-
-# International Standard Book Number 10
-
-This validates that a string value contains a valid isbn10 value.
-
- Usage: isbn10
-
-# International Standard Book Number 13
-
-This validates that a string value contains a valid isbn13 value.
-
- Usage: isbn13
-
-# Universally Unique Identifier UUID
-
-This validates that a string value contains a valid UUID. Uppercase UUID values will not pass - use `uuid_rfc4122` instead.
-
- Usage: uuid
-
-# Universally Unique Identifier UUID v3
-
-This validates that a string value contains a valid version 3 UUID. Uppercase UUID values will not pass - use `uuid3_rfc4122` instead.
-
- Usage: uuid3
-
-# Universally Unique Identifier UUID v4
-
-This validates that a string value contains a valid version 4 UUID. Uppercase UUID values will not pass - use `uuid4_rfc4122` instead.
-
- Usage: uuid4
-
-# Universally Unique Identifier UUID v5
-
-This validates that a string value contains a valid version 5 UUID. Uppercase UUID values will not pass - use `uuid5_rfc4122` instead.
-
- Usage: uuid5
-
-# Universally Unique Lexicographically Sortable Identifier ULID
-
-This validates that a string value contains a valid ULID value.
-
- Usage: ulid
-
-# ASCII
-
-This validates that a string value contains only ASCII characters.
-NOTE: if the string is blank, this validates as true.
-
- Usage: ascii
-
-# Printable ASCII
-
-This validates that a string value contains only printable ASCII characters.
-NOTE: if the string is blank, this validates as true.
-
- Usage: printascii
-
-# Multi-Byte Characters
-
-This validates that a string value contains one or more multibyte characters.
-NOTE: if the string is blank, this validates as true.
-
- Usage: multibyte
-
-# Data URL
-
-This validates that a string value contains a valid DataURI.
-NOTE: this will also validate that the data portion is valid base64
-
- Usage: datauri
-
-# Latitude
-
-This validates that a string value contains a valid latitude.
-
- Usage: latitude
-
-# Longitude
-
-This validates that a string value contains a valid longitude.
-
- Usage: longitude
-
-# Social Security Number SSN
-
-This validates that a string value contains a valid U.S. Social Security Number.
-
- Usage: ssn
-
-# Internet Protocol Address IP
-
-This validates that a string value contains a valid IP Address.
-
- Usage: ip
-
-# Internet Protocol Address IPv4
-
-This validates that a string value contains a valid v4 IP Address.
-
- Usage: ipv4
-
-# Internet Protocol Address IPv6
-
-This validates that a string value contains a valid v6 IP Address.
-
- Usage: ipv6
-
-# Classless Inter-Domain Routing CIDR
-
-This validates that a string value contains a valid CIDR Address.
-
- Usage: cidr
-
-# Classless Inter-Domain Routing CIDRv4
-
-This validates that a string value contains a valid v4 CIDR Address.
-
- Usage: cidrv4
-
-# Classless Inter-Domain Routing CIDRv6
-
-This validates that a string value contains a valid v6 CIDR Address.
-
- Usage: cidrv6
-
-# Transmission Control Protocol Address TCP
-
-This validates that a string value contains a valid resolvable TCP Address.
-
- Usage: tcp_addr
-
-# Transmission Control Protocol Address TCPv4
-
-This validates that a string value contains a valid resolvable v4 TCP Address.
-
- Usage: tcp4_addr
-
-# Transmission Control Protocol Address TCPv6
-
-This validates that a string value contains a valid resolvable v6 TCP Address.
-
- Usage: tcp6_addr
-
-# User Datagram Protocol Address UDP
-
-This validates that a string value contains a valid resolvable UDP Address.
-
- Usage: udp_addr
-
-# User Datagram Protocol Address UDPv4
-
-This validates that a string value contains a valid resolvable v4 UDP Address.
-
- Usage: udp4_addr
-
-# User Datagram Protocol Address UDPv6
-
-This validates that a string value contains a valid resolvable v6 UDP Address.
-
- Usage: udp6_addr
-
-# Internet Protocol Address IP
-
-This validates that a string value contains a valid resolvable IP Address.
-
- Usage: ip_addr
-
-# Internet Protocol Address IPv4
-
-This validates that a string value contains a valid resolvable v4 IP Address.
-
- Usage: ip4_addr
-
-# Internet Protocol Address IPv6
-
-This validates that a string value contains a valid resolvable v6 IP Address.
-
- Usage: ip6_addr
-
-# Unix domain socket end point Address
-
-This validates that a string value contains a valid Unix Address.
-
- Usage: unix_addr
-
-# Media Access Control Address MAC
-
-This validates that a string value contains a valid MAC Address.
-
- Usage: mac
-
-Note: See Go's ParseMAC for accepted formats and types:
-
- http://golang.org/src/net/mac.go?s=866:918#L29
-
-# Hostname RFC 952
-
-This validates that a string value is a valid Hostname according to RFC 952 https://tools.ietf.org/html/rfc952
-
- Usage: hostname
-
-# Hostname RFC 1123
-
-This validates that a string value is a valid Hostname according to RFC 1123 https://tools.ietf.org/html/rfc1123
-
- Usage: hostname_rfc1123 or if you want to continue to use 'hostname' in your tags, create an alias.
-
-Full Qualified Domain Name (FQDN)
-
-This validates that a string value contains a valid FQDN.
-
- Usage: fqdn
-
-# HTML Tags
-
-This validates that a string value appears to be an HTML element tag
-including those described at https://developer.mozilla.org/en-US/docs/Web/HTML/Element
-
- Usage: html
-
-# HTML Encoded
-
-This validates that a string value is a proper character reference in decimal
-or hexadecimal format
-
- Usage: html_encoded
-
-# URL Encoded
-
-This validates that a string value is percent-encoded (URL encoded) according
-to https://tools.ietf.org/html/rfc3986#section-2.1
-
- Usage: url_encoded
-
-# Directory
-
-This validates that a string value contains a valid directory and that
-it exists on the machine.
-This is done using os.Stat, which is a platform independent function.
-
- Usage: dir
-
-# Directory Path
-
-This validates that a string value contains a valid directory but does
-not validate the existence of that directory.
-This is done using os.Stat, which is a platform independent function.
-It is safest to suffix the string with os.PathSeparator if the directory
-may not exist at the time of validation.
-
- Usage: dirpath
-
-# HostPort
-
-This validates that a string value contains a valid DNS hostname and port that
-can be used to validate fields typically passed to sockets and connections.
-
- Usage: hostname_port
-
-# Datetime
-
-This validates that a string value is a valid datetime based on the supplied datetime format.
-Supplied format must match the official Go time format layout as documented in https://golang.org/pkg/time/
-
- Usage: datetime=2006-01-02
-
-# Iso3166-1 alpha-2
-
-This validates that a string value is a valid country code based on iso3166-1 alpha-2 standard.
-see: https://www.iso.org/iso-3166-country-codes.html
-
- Usage: iso3166_1_alpha2
-
-# Iso3166-1 alpha-3
-
-This validates that a string value is a valid country code based on iso3166-1 alpha-3 standard.
-see: https://www.iso.org/iso-3166-country-codes.html
-
- Usage: iso3166_1_alpha3
-
-# Iso3166-1 alpha-numeric
-
-This validates that a string value is a valid country code based on iso3166-1 alpha-numeric standard.
-see: https://www.iso.org/iso-3166-country-codes.html
-
- Usage: iso3166_1_alpha3
-
-# BCP 47 Language Tag
-
-This validates that a string value is a valid BCP 47 language tag, as parsed by language.Parse.
-More information on https://pkg.go.dev/golang.org/x/text/language
-
- Usage: bcp47_language_tag
-
-BIC (SWIFT code)
-
-This validates that a string value is a valid Business Identifier Code (SWIFT code), defined in ISO 9362.
-More information on https://www.iso.org/standard/60390.html
-
- Usage: bic
-
-# RFC 1035 label
-
-This validates that a string value is a valid dns RFC 1035 label, defined in RFC 1035.
-More information on https://datatracker.ietf.org/doc/html/rfc1035
-
- Usage: dns_rfc1035_label
-
-# TimeZone
-
-This validates that a string value is a valid time zone based on the time zone database present on the system.
-Although empty value and Local value are allowed by time.LoadLocation golang function, they are not allowed by this validator.
-More information on https://golang.org/pkg/time/#LoadLocation
-
- Usage: timezone
-
-# Semantic Version
-
-This validates that a string value is a valid semver version, defined in Semantic Versioning 2.0.0.
-More information on https://semver.org/
-
- Usage: semver
-
-# CVE Identifier
-
-This validates that a string value is a valid cve id, defined in cve mitre.
-More information on https://cve.mitre.org/
-
- Usage: cve
-
-# Credit Card
-
-This validates that a string value contains a valid credit card number using Luhn algorithm.
-
- Usage: credit_card
-
-# Luhn Checksum
-
- Usage: luhn_checksum
-
-This validates that a string or (u)int value contains a valid checksum using the Luhn algorithm.
-
-# MongoDB
-
-This validates that a string is a valid 24 character hexadecimal string or valid connection string.
-
- Usage: mongodb
- mongodb_connection_string
-
-Example:
-
- type Test struct {
- ObjectIdField string `validate:"mongodb"`
- ConnectionStringField string `validate:"mongodb_connection_string"`
- }
-
-# Cron
-
-This validates that a string value contains a valid cron expression.
-
- Usage: cron
-
-# SpiceDb ObjectID/Permission/Object Type
-
-This validates that a string is valid for use with SpiceDb for the indicated purpose. If no purpose is given, a purpose of 'id' is assumed.
-
- Usage: spicedb=id|permission|type
-
-# Alias Validators and Tags
-
-Alias Validators and Tags
-NOTE: When returning an error, the tag returned in "FieldError" will be
-the alias tag unless the dive tag is part of the alias. Everything after the
-dive tag is not reported as the alias tag. Also, the "ActualTag" in the before
-case will be the actual tag within the alias that failed.
-
-Here is a list of the current built in alias tags:
-
- "iscolor"
- alias is "hexcolor|rgb|rgba|hsl|hsla" (Usage: iscolor)
- "country_code"
- alias is "iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric" (Usage: country_code)
-
-Validator notes:
-
- regex
- a regex validator won't be added because commas and = signs can be part
- of a regex which conflict with the validation definitions. Although
- workarounds can be made, they take away from using pure regex's.
- Furthermore it's quick and dirty but the regex's become harder to
- maintain and are not reusable, so it's as much a programming philosophy
- as anything.
-
- In place of this new validator functions should be created; a regex can
- be used within the validator function and even be precompiled for better
- efficiency within regexes.go.
-
- And the best reason, you can submit a pull request and we can keep on
- adding to the validation library of this package!
-
-# Non standard validators
-
-A collection of validation rules that are frequently needed but are more
-complex than the ones found in the baked in validators.
-A non standard validator must be registered manually like you would
-with your own custom validation functions.
-
-Example of registration and use:
-
- type Test struct {
- TestField string `validate:"yourtag"`
- }
-
- t := &Test{
- TestField: "Test"
- }
-
- validate := validator.New()
- validate.RegisterValidation("yourtag", validators.NotBlank)
-
-Here is a list of the current non standard validators:
-
- NotBlank
- This validates that the value is not blank or with length zero.
- For strings ensures they do not contain only spaces. For channels, maps, slices and arrays
- ensures they don't have zero length. For others, a non empty value is required.
-
- Usage: notblank
-
-# Panics
-
-This package panics when bad input is provided, this is by design, bad code like
-that should not make it to production.
-
- type Test struct {
- TestField string `validate:"nonexistantfunction=1"`
- }
-
- t := &Test{
- TestField: "Test"
- }
-
- validate.Struct(t) // this will panic
-*/
-package validator
diff --git a/vendor/github.com/go-playground/validator/v10/errors.go b/vendor/github.com/go-playground/validator/v10/errors.go
deleted file mode 100644
index be2676e9e..000000000
--- a/vendor/github.com/go-playground/validator/v10/errors.go
+++ /dev/null
@@ -1,276 +0,0 @@
-package validator
-
-import (
- "bytes"
- "fmt"
- "reflect"
- "strings"
-
- ut "github.com/go-playground/universal-translator"
-)
-
-const (
- fieldErrMsg = "Key: '%s' Error:Field validation for '%s' failed on the '%s' tag"
-)
-
-// ValidationErrorsTranslations is the translation return type
-type ValidationErrorsTranslations map[string]string
-
-// InvalidValidationError describes an invalid argument passed to
-// `Struct`, `StructExcept`, StructPartial` or `Field`
-type InvalidValidationError struct {
- Type reflect.Type
-}
-
-// Error returns InvalidValidationError message
-func (e *InvalidValidationError) Error() string {
-
- if e.Type == nil {
- return "validator: (nil)"
- }
-
- return "validator: (nil " + e.Type.String() + ")"
-}
-
-// ValidationErrors is an array of FieldError's
-// for use in custom error messages post validation.
-type ValidationErrors []FieldError
-
-// Error is intended for use in development + debugging and not intended to be a production error message.
-// It allows ValidationErrors to subscribe to the Error interface.
-// All information to create an error message specific to your application is contained within
-// the FieldError found within the ValidationErrors array
-func (ve ValidationErrors) Error() string {
-
- buff := bytes.NewBufferString("")
-
- for i := 0; i < len(ve); i++ {
-
- buff.WriteString(ve[i].Error())
- buff.WriteString("\n")
- }
-
- return strings.TrimSpace(buff.String())
-}
-
-// Translate translates all of the ValidationErrors
-func (ve ValidationErrors) Translate(ut ut.Translator) ValidationErrorsTranslations {
-
- trans := make(ValidationErrorsTranslations)
-
- var fe *fieldError
-
- for i := 0; i < len(ve); i++ {
- fe = ve[i].(*fieldError)
-
- // // in case an Anonymous struct was used, ensure that the key
- // // would be 'Username' instead of ".Username"
- // if len(fe.ns) > 0 && fe.ns[:1] == "." {
- // trans[fe.ns[1:]] = fe.Translate(ut)
- // continue
- // }
-
- trans[fe.ns] = fe.Translate(ut)
- }
-
- return trans
-}
-
-// FieldError contains all functions to get error details
-type FieldError interface {
-
- // Tag returns the validation tag that failed. if the
- // validation was an alias, this will return the
- // alias name and not the underlying tag that failed.
- //
- // eg. alias "iscolor": "hexcolor|rgb|rgba|hsl|hsla"
- // will return "iscolor"
- Tag() string
-
- // ActualTag returns the validation tag that failed, even if an
- // alias the actual tag within the alias will be returned.
- // If an 'or' validation fails the entire or will be returned.
- //
- // eg. alias "iscolor": "hexcolor|rgb|rgba|hsl|hsla"
- // will return "hexcolor|rgb|rgba|hsl|hsla"
- ActualTag() string
-
- // Namespace returns the namespace for the field error, with the tag
- // name taking precedence over the field's actual name.
- //
- // eg. JSON name "User.fname"
- //
- // See StructNamespace() for a version that returns actual names.
- //
- // NOTE: this field can be blank when validating a single primitive field
- // using validate.Field(...) as there is no way to extract it's name
- Namespace() string
-
- // StructNamespace returns the namespace for the field error, with the field's
- // actual name.
- //
- // eq. "User.FirstName" see Namespace for comparison
- //
- // NOTE: this field can be blank when validating a single primitive field
- // using validate.Field(...) as there is no way to extract its name
- StructNamespace() string
-
- // Field returns the fields name with the tag name taking precedence over the
- // field's actual name.
- //
- // eq. JSON name "fname"
- // see StructField for comparison
- Field() string
-
- // StructField returns the field's actual name from the struct, when able to determine.
- //
- // eq. "FirstName"
- // see Field for comparison
- StructField() string
-
- // Value returns the actual field's value in case needed for creating the error
- // message
- Value() interface{}
-
- // Param returns the param value, in string form for comparison; this will also
- // help with generating an error message
- Param() string
-
- // Kind returns the Field's reflect Kind
- //
- // eg. time.Time's kind is a struct
- Kind() reflect.Kind
-
- // Type returns the Field's reflect Type
- //
- // eg. time.Time's type is time.Time
- Type() reflect.Type
-
- // Translate returns the FieldError's translated error
- // from the provided 'ut.Translator' and registered 'TranslationFunc'
- //
- // NOTE: if no registered translator can be found it returns the same as
- // calling fe.Error()
- Translate(ut ut.Translator) string
-
- // Error returns the FieldError's message
- Error() string
-}
-
-// compile time interface checks
-var _ FieldError = new(fieldError)
-var _ error = new(fieldError)
-
-// fieldError contains a single field's validation error along
-// with other properties that may be needed for error message creation
-// it complies with the FieldError interface
-type fieldError struct {
- v *Validate
- tag string
- actualTag string
- ns string
- structNs string
- fieldLen uint8
- structfieldLen uint8
- value interface{}
- param string
- kind reflect.Kind
- typ reflect.Type
-}
-
-// Tag returns the validation tag that failed.
-func (fe *fieldError) Tag() string {
- return fe.tag
-}
-
-// ActualTag returns the validation tag that failed, even if an
-// alias the actual tag within the alias will be returned.
-func (fe *fieldError) ActualTag() string {
- return fe.actualTag
-}
-
-// Namespace returns the namespace for the field error, with the tag
-// name taking precedence over the field's actual name.
-func (fe *fieldError) Namespace() string {
- return fe.ns
-}
-
-// StructNamespace returns the namespace for the field error, with the field's
-// actual name.
-func (fe *fieldError) StructNamespace() string {
- return fe.structNs
-}
-
-// Field returns the field's name with the tag name taking precedence over the
-// field's actual name.
-func (fe *fieldError) Field() string {
-
- return fe.ns[len(fe.ns)-int(fe.fieldLen):]
- // // return fe.field
- // fld := fe.ns[len(fe.ns)-int(fe.fieldLen):]
-
- // log.Println("FLD:", fld)
-
- // if len(fld) > 0 && fld[:1] == "." {
- // return fld[1:]
- // }
-
- // return fld
-}
-
-// StructField returns the field's actual name from the struct, when able to determine.
-func (fe *fieldError) StructField() string {
- // return fe.structField
- return fe.structNs[len(fe.structNs)-int(fe.structfieldLen):]
-}
-
-// Value returns the actual field's value in case needed for creating the error
-// message
-func (fe *fieldError) Value() interface{} {
- return fe.value
-}
-
-// Param returns the param value, in string form for comparison; this will
-// also help with generating an error message
-func (fe *fieldError) Param() string {
- return fe.param
-}
-
-// Kind returns the Field's reflect Kind
-func (fe *fieldError) Kind() reflect.Kind {
- return fe.kind
-}
-
-// Type returns the Field's reflect Type
-func (fe *fieldError) Type() reflect.Type {
- return fe.typ
-}
-
-// Error returns the fieldError's error message
-func (fe *fieldError) Error() string {
- return fmt.Sprintf(fieldErrMsg, fe.ns, fe.Field(), fe.tag)
-}
-
-// Translate returns the FieldError's translated error
-// from the provided 'ut.Translator' and registered 'TranslationFunc'
-//
-// NOTE: if no registered translation can be found, it returns the original
-// untranslated error message.
-func (fe *fieldError) Translate(ut ut.Translator) string {
- var fn TranslationFunc
-
- m, ok := fe.v.transTagFunc[ut]
- if !ok {
- return fe.Error()
- }
-
- fn, ok = m[fe.tag]
- if !ok {
- fn, ok = m[fe.actualTag]
- if !ok {
- return fe.Error()
- }
- }
-
- return fn(ut, fe)
-}
diff --git a/vendor/github.com/go-playground/validator/v10/field_level.go b/vendor/github.com/go-playground/validator/v10/field_level.go
deleted file mode 100644
index ef35826ee..000000000
--- a/vendor/github.com/go-playground/validator/v10/field_level.go
+++ /dev/null
@@ -1,120 +0,0 @@
-package validator
-
-import "reflect"
-
-// FieldLevel contains all the information and helper functions
-// to validate a field
-type FieldLevel interface {
-
- // Top returns the top level struct, if any
- Top() reflect.Value
-
- // Parent returns the current fields parent struct, if any or
- // the comparison value if called 'VarWithValue'
- Parent() reflect.Value
-
- // Field returns current field for validation
- Field() reflect.Value
-
- // FieldName returns the field's name with the tag
- // name taking precedence over the fields actual name.
- FieldName() string
-
- // StructFieldName returns the struct field's name
- StructFieldName() string
-
- // Param returns param for validation against current field
- Param() string
-
- // GetTag returns the current validations tag name
- GetTag() string
-
- // ExtractType gets the actual underlying type of field value.
- // It will dive into pointers, customTypes and return you the
- // underlying value and it's kind.
- ExtractType(field reflect.Value) (value reflect.Value, kind reflect.Kind, nullable bool)
-
- // GetStructFieldOK traverses the parent struct to retrieve a specific field denoted by the provided namespace
- // in the param and returns the field, field kind and whether is was successful in retrieving
- // the field at all.
- //
- // NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field
- // could not be retrieved because it didn't exist.
- //
- // Deprecated: Use GetStructFieldOK2() instead which also return if the value is nullable.
- GetStructFieldOK() (reflect.Value, reflect.Kind, bool)
-
- // GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for
- // the field and namespace allowing more extensibility for validators.
- //
- // Deprecated: Use GetStructFieldOKAdvanced2() instead which also return if the value is nullable.
- GetStructFieldOKAdvanced(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool)
-
- // GetStructFieldOK2 traverses the parent struct to retrieve a specific field denoted by the provided namespace
- // in the param and returns the field, field kind, if it's a nullable type and whether is was successful in retrieving
- // the field at all.
- //
- // NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field
- // could not be retrieved because it didn't exist.
- GetStructFieldOK2() (reflect.Value, reflect.Kind, bool, bool)
-
- // GetStructFieldOKAdvanced2 is the same as GetStructFieldOK except that it accepts the parent struct to start looking for
- // the field and namespace allowing more extensibility for validators.
- GetStructFieldOKAdvanced2(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool, bool)
-}
-
-var _ FieldLevel = new(validate)
-
-// Field returns current field for validation
-func (v *validate) Field() reflect.Value {
- return v.flField
-}
-
-// FieldName returns the field's name with the tag
-// name taking precedence over the fields actual name.
-func (v *validate) FieldName() string {
- return v.cf.altName
-}
-
-// GetTag returns the current validations tag name
-func (v *validate) GetTag() string {
- return v.ct.tag
-}
-
-// StructFieldName returns the struct field's name
-func (v *validate) StructFieldName() string {
- return v.cf.name
-}
-
-// Param returns param for validation against current field
-func (v *validate) Param() string {
- return v.ct.param
-}
-
-// GetStructFieldOK returns Param returns param for validation against current field
-//
-// Deprecated: Use GetStructFieldOK2() instead which also return if the value is nullable.
-func (v *validate) GetStructFieldOK() (reflect.Value, reflect.Kind, bool) {
- current, kind, _, found := v.getStructFieldOKInternal(v.slflParent, v.ct.param)
- return current, kind, found
-}
-
-// GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for
-// the field and namespace allowing more extensibility for validators.
-//
-// Deprecated: Use GetStructFieldOKAdvanced2() instead which also return if the value is nullable.
-func (v *validate) GetStructFieldOKAdvanced(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool) {
- current, kind, _, found := v.GetStructFieldOKAdvanced2(val, namespace)
- return current, kind, found
-}
-
-// GetStructFieldOK2 returns Param returns param for validation against current field
-func (v *validate) GetStructFieldOK2() (reflect.Value, reflect.Kind, bool, bool) {
- return v.getStructFieldOKInternal(v.slflParent, v.ct.param)
-}
-
-// GetStructFieldOKAdvanced2 is the same as GetStructFieldOK except that it accepts the parent struct to start looking for
-// the field and namespace allowing more extensibility for validators.
-func (v *validate) GetStructFieldOKAdvanced2(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool, bool) {
- return v.getStructFieldOKInternal(val, namespace)
-}
diff --git a/vendor/github.com/go-playground/validator/v10/logo.png b/vendor/github.com/go-playground/validator/v10/logo.png
deleted file mode 100644
index 355000f52..000000000
--- a/vendor/github.com/go-playground/validator/v10/logo.png
+++ /dev/null
Binary files differ
diff --git a/vendor/github.com/go-playground/validator/v10/options.go b/vendor/github.com/go-playground/validator/v10/options.go
deleted file mode 100644
index 86a0db218..000000000
--- a/vendor/github.com/go-playground/validator/v10/options.go
+++ /dev/null
@@ -1,26 +0,0 @@
-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
- }
-}
-
-// WithPrivateFieldValidation activates validation for unexported fields via the use of the `unsafe` package.
-//
-// By opting into this feature you are acknowledging that you are aware of the risks and accept any current or future
-// consequences of using this feature.
-func WithPrivateFieldValidation() Option {
- return func(v *Validate) {
- v.privateFieldValidation = true
- }
-}
diff --git a/vendor/github.com/go-playground/validator/v10/postcode_regexes.go b/vendor/github.com/go-playground/validator/v10/postcode_regexes.go
deleted file mode 100644
index 326b8f753..000000000
--- a/vendor/github.com/go-playground/validator/v10/postcode_regexes.go
+++ /dev/null
@@ -1,179 +0,0 @@
-package validator
-
-import (
- "regexp"
- "sync"
-)
-
-var postCodePatternDict = map[string]string{
- "GB": `^GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}$`,
- "JE": `^JE\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}$`,
- "GG": `^GY\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}$`,
- "IM": `^IM\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}$`,
- "US": `^\d{5}([ \-]\d{4})?$`,
- "CA": `^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ ]?\d[ABCEGHJ-NPRSTV-Z]\d$`,
- "DE": `^\d{5}$`,
- "JP": `^\d{3}-\d{4}$`,
- "FR": `^\d{2}[ ]?\d{3}$`,
- "AU": `^\d{4}$`,
- "IT": `^\d{5}$`,
- "CH": `^\d{4}$`,
- "AT": `^\d{4}$`,
- "ES": `^\d{5}$`,
- "NL": `^\d{4}[ ]?[A-Z]{2}$`,
- "BE": `^\d{4}$`,
- "DK": `^\d{4}$`,
- "SE": `^\d{3}[ ]?\d{2}$`,
- "NO": `^\d{4}$`,
- "BR": `^\d{5}[\-]?\d{3}$`,
- "PT": `^\d{4}([\-]\d{3})?$`,
- "FI": `^\d{5}$`,
- "AX": `^22\d{3}$`,
- "KR": `^\d{3}[\-]\d{3}$`,
- "CN": `^\d{6}$`,
- "TW": `^\d{3}(\d{2})?$`,
- "SG": `^\d{6}$`,
- "DZ": `^\d{5}$`,
- "AD": `^AD\d{3}$`,
- "AR": `^([A-HJ-NP-Z])?\d{4}([A-Z]{3})?$`,
- "AM": `^(37)?\d{4}$`,
- "AZ": `^\d{4}$`,
- "BH": `^((1[0-2]|[2-9])\d{2})?$`,
- "BD": `^\d{4}$`,
- "BB": `^(BB\d{5})?$`,
- "BY": `^\d{6}$`,
- "BM": `^[A-Z]{2}[ ]?[A-Z0-9]{2}$`,
- "BA": `^\d{5}$`,
- "IO": `^BBND 1ZZ$`,
- "BN": `^[A-Z]{2}[ ]?\d{4}$`,
- "BG": `^\d{4}$`,
- "KH": `^\d{5}$`,
- "CV": `^\d{4}$`,
- "CL": `^\d{7}$`,
- "CR": `^\d{4,5}|\d{3}-\d{4}$`,
- "HR": `^\d{5}$`,
- "CY": `^\d{4}$`,
- "CZ": `^\d{3}[ ]?\d{2}$`,
- "DO": `^\d{5}$`,
- "EC": `^([A-Z]\d{4}[A-Z]|(?:[A-Z]{2})?\d{6})?$`,
- "EG": `^\d{5}$`,
- "EE": `^\d{5}$`,
- "FO": `^\d{3}$`,
- "GE": `^\d{4}$`,
- "GR": `^\d{3}[ ]?\d{2}$`,
- "GL": `^39\d{2}$`,
- "GT": `^\d{5}$`,
- "HT": `^\d{4}$`,
- "HN": `^(?:\d{5})?$`,
- "HU": `^\d{4}$`,
- "IS": `^\d{3}$`,
- "IN": `^\d{6}$`,
- "ID": `^\d{5}$`,
- "IL": `^\d{5}$`,
- "JO": `^\d{5}$`,
- "KZ": `^\d{6}$`,
- "KE": `^\d{5}$`,
- "KW": `^\d{5}$`,
- "LA": `^\d{5}$`,
- "LV": `^\d{4}$`,
- "LB": `^(\d{4}([ ]?\d{4})?)?$`,
- "LI": `^(948[5-9])|(949[0-7])$`,
- "LT": `^\d{5}$`,
- "LU": `^\d{4}$`,
- "MK": `^\d{4}$`,
- "MY": `^\d{5}$`,
- "MV": `^\d{5}$`,
- "MT": `^[A-Z]{3}[ ]?\d{2,4}$`,
- "MU": `^(\d{3}[A-Z]{2}\d{3})?$`,
- "MX": `^\d{5}$`,
- "MD": `^\d{4}$`,
- "MC": `^980\d{2}$`,
- "MA": `^\d{5}$`,
- "NP": `^\d{5}$`,
- "NZ": `^\d{4}$`,
- "NI": `^((\d{4}-)?\d{3}-\d{3}(-\d{1})?)?$`,
- "NG": `^(\d{6})?$`,
- "OM": `^(PC )?\d{3}$`,
- "PK": `^\d{5}$`,
- "PY": `^\d{4}$`,
- "PH": `^\d{4}$`,
- "PL": `^\d{2}-\d{3}$`,
- "PR": `^00[679]\d{2}([ \-]\d{4})?$`,
- "RO": `^\d{6}$`,
- "RU": `^\d{6}$`,
- "SM": `^4789\d$`,
- "SA": `^\d{5}$`,
- "SN": `^\d{5}$`,
- "SK": `^\d{3}[ ]?\d{2}$`,
- "SI": `^\d{4}$`,
- "ZA": `^\d{4}$`,
- "LK": `^\d{5}$`,
- "TJ": `^\d{6}$`,
- "TH": `^\d{5}$`,
- "TN": `^\d{4}$`,
- "TR": `^\d{5}$`,
- "TM": `^\d{6}$`,
- "UA": `^\d{5}$`,
- "UY": `^\d{5}$`,
- "UZ": `^\d{6}$`,
- "VA": `^00120$`,
- "VE": `^\d{4}$`,
- "ZM": `^\d{5}$`,
- "AS": `^96799$`,
- "CC": `^6799$`,
- "CK": `^\d{4}$`,
- "RS": `^\d{6}$`,
- "ME": `^8\d{4}$`,
- "CS": `^\d{5}$`,
- "YU": `^\d{5}$`,
- "CX": `^6798$`,
- "ET": `^\d{4}$`,
- "FK": `^FIQQ 1ZZ$`,
- "NF": `^2899$`,
- "FM": `^(9694[1-4])([ \-]\d{4})?$`,
- "GF": `^9[78]3\d{2}$`,
- "GN": `^\d{3}$`,
- "GP": `^9[78][01]\d{2}$`,
- "GS": `^SIQQ 1ZZ$`,
- "GU": `^969[123]\d([ \-]\d{4})?$`,
- "GW": `^\d{4}$`,
- "HM": `^\d{4}$`,
- "IQ": `^\d{5}$`,
- "KG": `^\d{6}$`,
- "LR": `^\d{4}$`,
- "LS": `^\d{3}$`,
- "MG": `^\d{3}$`,
- "MH": `^969[67]\d([ \-]\d{4})?$`,
- "MN": `^\d{6}$`,
- "MP": `^9695[012]([ \-]\d{4})?$`,
- "MQ": `^9[78]2\d{2}$`,
- "NC": `^988\d{2}$`,
- "NE": `^\d{4}$`,
- "VI": `^008(([0-4]\d)|(5[01]))([ \-]\d{4})?$`,
- "VN": `^[0-9]{1,6}$`,
- "PF": `^987\d{2}$`,
- "PG": `^\d{3}$`,
- "PM": `^9[78]5\d{2}$`,
- "PN": `^PCRN 1ZZ$`,
- "PW": `^96940$`,
- "RE": `^9[78]4\d{2}$`,
- "SH": `^(ASCN|STHL) 1ZZ$`,
- "SJ": `^\d{4}$`,
- "SO": `^\d{5}$`,
- "SZ": `^[HLMS]\d{3}$`,
- "TC": `^TKCA 1ZZ$`,
- "WF": `^986\d{2}$`,
- "XK": `^\d{5}$`,
- "YT": `^976\d{2}$`,
-}
-
-var (
- postcodeRegexInit sync.Once
- postCodeRegexDict = map[string]*regexp.Regexp{}
-)
-
-func initPostcodes() {
- for countryCode, pattern := range postCodePatternDict {
- postCodeRegexDict[countryCode] = regexp.MustCompile(pattern)
- }
-}
diff --git a/vendor/github.com/go-playground/validator/v10/regexes.go b/vendor/github.com/go-playground/validator/v10/regexes.go
deleted file mode 100644
index 871cf7df7..000000000
--- a/vendor/github.com/go-playground/validator/v10/regexes.go
+++ /dev/null
@@ -1,163 +0,0 @@
-package validator
-
-import (
- "regexp"
- "sync"
-)
-
-const (
- alphaRegexString = "^[a-zA-Z]+$"
- alphaNumericRegexString = "^[a-zA-Z0-9]+$"
- alphaUnicodeRegexString = "^[\\p{L}]+$"
- alphaUnicodeNumericRegexString = "^[\\p{L}\\p{N}]+$"
- numericRegexString = "^[-+]?[0-9]+(?:\\.[0-9]+)?$"
- numberRegexString = "^[0-9]+$"
- hexadecimalRegexString = "^(0[xX])?[0-9a-fA-F]+$"
- hexColorRegexString = "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
- rgbRegexString = "^rgb\\(\\s*(?:(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])|(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%)\\s*\\)$"
- rgbaRegexString = "^rgba\\(\\s*(?:(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])|(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(?:0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%)\\s*,\\s*(?:(?:0.[1-9]*)|[01])\\s*\\)$"
- hslRegexString = "^hsl\\(\\s*(?:0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*\\)$"
- hslaRegexString = "^hsla\\(\\s*(?:0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0.[1-9]*)|[01])\\s*\\)$"
- emailRegexString = "^(?:(?:(?:(?:[a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(?:\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|(?:(?:\\x22)(?:(?:(?:(?:\\x20|\\x09)*(?:\\x0d\\x0a))?(?:\\x20|\\x09)+)?(?:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(?:(?:(?:\\x20|\\x09)*(?:\\x0d\\x0a))?(\\x20|\\x09)+)?(?:\\x22))))@(?:(?:(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])(?:[a-zA-Z]|\\d|-|\\.|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(?:(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])(?:[a-zA-Z]|\\d|-|\\.|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$"
- e164RegexString = "^\\+[1-9]?[0-9]{7,14}$"
- base32RegexString = "^(?:[A-Z2-7]{8})*(?:[A-Z2-7]{2}={6}|[A-Z2-7]{4}={4}|[A-Z2-7]{5}={3}|[A-Z2-7]{7}=|[A-Z2-7]{8})$"
- 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})$"
- iSSNRegexString = "^(?:[0-9]{4}-[0-9]{3}[0-9X])$"
- uUID3RegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$"
- uUID4RegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
- uUID5RegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
- uUIDRegexString = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
- uUID3RFC4122RegexString = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-3[0-9a-fA-F]{3}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
- uUID4RFC4122RegexString = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"
- uUID5RFC4122RegexString = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-5[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"
- uUIDRFC4122RegexString = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
- uLIDRegexString = "^(?i)[A-HJKMNP-TV-Z0-9]{26}$"
- md4RegexString = "^[0-9a-f]{32}$"
- md5RegexString = "^[0-9a-f]{32}$"
- sha256RegexString = "^[0-9a-f]{64}$"
- sha384RegexString = "^[0-9a-f]{96}$"
- sha512RegexString = "^[0-9a-f]{128}$"
- ripemd128RegexString = "^[0-9a-f]{32}$"
- ripemd160RegexString = "^[0-9a-f]{40}$"
- tiger128RegexString = "^[0-9a-f]{32}$"
- tiger160RegexString = "^[0-9a-f]{40}$"
- tiger192RegexString = "^[0-9a-f]{48}$"
- aSCIIRegexString = "^[\x00-\x7F]*$"
- printableASCIIRegexString = "^[\x20-\x7E]*$"
- multibyteRegexString = "[^\x00-\x7F]"
- dataURIRegexString = `^data:((?:\w+\/(?:([^;]|;[^;]).)+)?)`
- latitudeRegexString = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$"
- longitudeRegexString = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$"
- sSNRegexString = `^[0-9]{3}[ -]?(0[1-9]|[1-9][0-9])[ -]?([1-9][0-9]{3}|[0-9][1-9][0-9]{2}|[0-9]{2}[1-9][0-9]|[0-9]{3}[1-9])$`
- hostnameRegexStringRFC952 = `^[a-zA-Z]([a-zA-Z0-9\-]+[\.]?)*[a-zA-Z0-9]$` // https://tools.ietf.org/html/rfc952
- hostnameRegexStringRFC1123 = `^([a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62}){1}(\.[a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62})*?$` // accepts hostname starting with a digit https://tools.ietf.org/html/rfc1123
- fqdnRegexStringRFC1123 = `^([a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62})(\.[a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62})*?(\.[a-zA-Z]{1}[a-zA-Z0-9]{0,62})\.?$` // same as hostnameRegexStringRFC1123 but must contain a non numerical TLD (possibly ending with '.')
- btcAddressRegexString = `^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$` // bitcoin address
- btcAddressUpperRegexStringBech32 = `^BC1[02-9AC-HJ-NP-Z]{7,76}$` // bitcoin bech32 address https://en.bitcoin.it/wiki/Bech32
- btcAddressLowerRegexStringBech32 = `^bc1[02-9ac-hj-np-z]{7,76}$` // bitcoin bech32 address https://en.bitcoin.it/wiki/Bech32
- ethAddressRegexString = `^0x[0-9a-fA-F]{40}$`
- ethAddressUpperRegexString = `^0x[0-9A-F]{40}$`
- ethAddressLowerRegexString = `^0x[0-9a-f]{40}$`
- uRLEncodedRegexString = `^(?:[^%]|%[0-9A-Fa-f]{2})*$`
- hTMLEncodedRegexString = `&#[x]?([0-9a-fA-F]{2})|(&gt)|(&lt)|(&quot)|(&amp)+[;]?`
- hTMLRegexString = `<[/]?([a-zA-Z]+).*?>`
- jWTRegexString = "^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$"
- splitParamsRegexString = `'[^']*'|\S+`
- 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
- mongodbIdRegexString = "^[a-f\\d]{24}$"
- mongodbConnStringRegexString = "^mongodb(\\+srv)?:\\/\\/(([a-zA-Z\\d]+):([a-zA-Z\\d$:\\/?#\\[\\]@]+)@)?(([a-z\\d.-]+)(:[\\d]+)?)((,(([a-z\\d.-]+)(:(\\d+))?))*)?(\\/[a-zA-Z-_]{1,64})?(\\?(([a-zA-Z]+)=([a-zA-Z\\d]+))(&(([a-zA-Z\\d]+)=([a-zA-Z\\d]+))?)*)?$"
- 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]$"
-)
-
-func lazyRegexCompile(str string) func() *regexp.Regexp {
- var regex *regexp.Regexp
- var once sync.Once
- return func() *regexp.Regexp {
- once.Do(func() {
- regex = regexp.MustCompile(str)
- })
- return regex
- }
-}
-
-var (
- alphaRegex = lazyRegexCompile(alphaRegexString)
- alphaNumericRegex = lazyRegexCompile(alphaNumericRegexString)
- alphaUnicodeRegex = lazyRegexCompile(alphaUnicodeRegexString)
- alphaUnicodeNumericRegex = lazyRegexCompile(alphaUnicodeNumericRegexString)
- numericRegex = lazyRegexCompile(numericRegexString)
- numberRegex = lazyRegexCompile(numberRegexString)
- hexadecimalRegex = lazyRegexCompile(hexadecimalRegexString)
- hexColorRegex = lazyRegexCompile(hexColorRegexString)
- rgbRegex = lazyRegexCompile(rgbRegexString)
- rgbaRegex = lazyRegexCompile(rgbaRegexString)
- hslRegex = lazyRegexCompile(hslRegexString)
- hslaRegex = lazyRegexCompile(hslaRegexString)
- e164Regex = lazyRegexCompile(e164RegexString)
- emailRegex = lazyRegexCompile(emailRegexString)
- base32Regex = lazyRegexCompile(base32RegexString)
- base64Regex = lazyRegexCompile(base64RegexString)
- base64URLRegex = lazyRegexCompile(base64URLRegexString)
- base64RawURLRegex = lazyRegexCompile(base64RawURLRegexString)
- iSBN10Regex = lazyRegexCompile(iSBN10RegexString)
- iSBN13Regex = lazyRegexCompile(iSBN13RegexString)
- iSSNRegex = lazyRegexCompile(iSSNRegexString)
- uUID3Regex = lazyRegexCompile(uUID3RegexString)
- uUID4Regex = lazyRegexCompile(uUID4RegexString)
- uUID5Regex = lazyRegexCompile(uUID5RegexString)
- uUIDRegex = lazyRegexCompile(uUIDRegexString)
- uUID3RFC4122Regex = lazyRegexCompile(uUID3RFC4122RegexString)
- uUID4RFC4122Regex = lazyRegexCompile(uUID4RFC4122RegexString)
- uUID5RFC4122Regex = lazyRegexCompile(uUID5RFC4122RegexString)
- uUIDRFC4122Regex = lazyRegexCompile(uUIDRFC4122RegexString)
- uLIDRegex = lazyRegexCompile(uLIDRegexString)
- md4Regex = lazyRegexCompile(md4RegexString)
- md5Regex = lazyRegexCompile(md5RegexString)
- sha256Regex = lazyRegexCompile(sha256RegexString)
- sha384Regex = lazyRegexCompile(sha384RegexString)
- sha512Regex = lazyRegexCompile(sha512RegexString)
- ripemd128Regex = lazyRegexCompile(ripemd128RegexString)
- ripemd160Regex = lazyRegexCompile(ripemd160RegexString)
- tiger128Regex = lazyRegexCompile(tiger128RegexString)
- tiger160Regex = lazyRegexCompile(tiger160RegexString)
- tiger192Regex = lazyRegexCompile(tiger192RegexString)
- aSCIIRegex = lazyRegexCompile(aSCIIRegexString)
- printableASCIIRegex = lazyRegexCompile(printableASCIIRegexString)
- multibyteRegex = lazyRegexCompile(multibyteRegexString)
- dataURIRegex = lazyRegexCompile(dataURIRegexString)
- latitudeRegex = lazyRegexCompile(latitudeRegexString)
- longitudeRegex = lazyRegexCompile(longitudeRegexString)
- sSNRegex = lazyRegexCompile(sSNRegexString)
- hostnameRegexRFC952 = lazyRegexCompile(hostnameRegexStringRFC952)
- hostnameRegexRFC1123 = lazyRegexCompile(hostnameRegexStringRFC1123)
- fqdnRegexRFC1123 = lazyRegexCompile(fqdnRegexStringRFC1123)
- btcAddressRegex = lazyRegexCompile(btcAddressRegexString)
- btcUpperAddressRegexBech32 = lazyRegexCompile(btcAddressUpperRegexStringBech32)
- btcLowerAddressRegexBech32 = lazyRegexCompile(btcAddressLowerRegexStringBech32)
- ethAddressRegex = lazyRegexCompile(ethAddressRegexString)
- uRLEncodedRegex = lazyRegexCompile(uRLEncodedRegexString)
- hTMLEncodedRegex = lazyRegexCompile(hTMLEncodedRegexString)
- hTMLRegex = lazyRegexCompile(hTMLRegexString)
- jWTRegex = lazyRegexCompile(jWTRegexString)
- splitParamsRegex = lazyRegexCompile(splitParamsRegexString)
- bicRegex = lazyRegexCompile(bicRegexString)
- semverRegex = lazyRegexCompile(semverRegexString)
- dnsRegexRFC1035Label = lazyRegexCompile(dnsRegexStringRFC1035Label)
- cveRegex = lazyRegexCompile(cveRegexString)
- mongodbIdRegex = lazyRegexCompile(mongodbIdRegexString)
- mongodbConnectionRegex = lazyRegexCompile(mongodbConnStringRegexString)
- cronRegex = lazyRegexCompile(cronRegexString)
- spicedbIDRegex = lazyRegexCompile(spicedbIDRegexString)
- spicedbPermissionRegex = lazyRegexCompile(spicedbPermissionRegexString)
- spicedbTypeRegex = lazyRegexCompile(spicedbTypeRegexString)
-)
diff --git a/vendor/github.com/go-playground/validator/v10/struct_level.go b/vendor/github.com/go-playground/validator/v10/struct_level.go
deleted file mode 100644
index 271328f71..000000000
--- a/vendor/github.com/go-playground/validator/v10/struct_level.go
+++ /dev/null
@@ -1,175 +0,0 @@
-package validator
-
-import (
- "context"
- "reflect"
-)
-
-// StructLevelFunc accepts all values needed for struct level validation
-type StructLevelFunc func(sl StructLevel)
-
-// StructLevelFuncCtx accepts all values needed for struct level validation
-// but also allows passing of contextual validation information via context.Context.
-type StructLevelFuncCtx func(ctx context.Context, sl StructLevel)
-
-// wrapStructLevelFunc wraps normal StructLevelFunc makes it compatible with StructLevelFuncCtx
-func wrapStructLevelFunc(fn StructLevelFunc) StructLevelFuncCtx {
- return func(ctx context.Context, sl StructLevel) {
- fn(sl)
- }
-}
-
-// StructLevel contains all the information and helper functions
-// to validate a struct
-type StructLevel interface {
-
- // Validator returns the main validation object, in case one wants to call validations internally.
- // this is so you don't have to use anonymous functions to get access to the validate
- // instance.
- Validator() *Validate
-
- // Top returns the top level struct, if any
- Top() reflect.Value
-
- // Parent returns the current fields parent struct, if any
- Parent() reflect.Value
-
- // Current returns the current struct.
- Current() reflect.Value
-
- // ExtractType gets the actual underlying type of field value.
- // It will dive into pointers, customTypes and return you the
- // underlying value and its kind.
- ExtractType(field reflect.Value) (value reflect.Value, kind reflect.Kind, nullable bool)
-
- // ReportError reports an error just by passing the field and tag information
- //
- // NOTES:
- //
- // fieldName and altName get appended to the existing namespace that
- // validator is on. e.g. pass 'FirstName' or 'Names[0]' depending
- // on the nesting
- //
- // tag can be an existing validation tag or just something you make up
- // and process on the flip side it's up to you.
- ReportError(field interface{}, fieldName, structFieldName string, tag, param string)
-
- // ReportValidationErrors reports an error just by passing ValidationErrors
- //
- // NOTES:
- //
- // relativeNamespace and relativeActualNamespace get appended to the
- // 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 current field depth
- ReportValidationErrors(relativeNamespace, relativeActualNamespace string, errs ValidationErrors)
-}
-
-var _ StructLevel = new(validate)
-
-// Top returns the top level struct
-//
-// NOTE: this can be the same as the current struct being validated
-// 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 accurate value otherwise.
-func (v *validate) Top() reflect.Value {
- return v.top
-}
-
-// Parent returns the current structs parent
-//
-// NOTE: this can be the same as the current struct being validated
-// 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 accurate value otherwise.
-func (v *validate) Parent() reflect.Value {
- return v.slflParent
-}
-
-// Current returns the current struct.
-func (v *validate) Current() reflect.Value {
- return v.slCurrent
-}
-
-// Validator returns the main validation object, in case one want to call validations internally.
-func (v *validate) Validator() *Validate {
- return v.v
-}
-
-// ExtractType gets the actual underlying type of field value.
-func (v *validate) ExtractType(field reflect.Value) (reflect.Value, reflect.Kind, bool) {
- return v.extractTypeInternal(field, false)
-}
-
-// ReportError reports an error just by passing the field and tag information
-func (v *validate) ReportError(field interface{}, fieldName, structFieldName, tag, param string) {
-
- fv, kind, _ := v.extractTypeInternal(reflect.ValueOf(field), false)
-
- if len(structFieldName) == 0 {
- structFieldName = fieldName
- }
-
- v.str1 = string(append(v.ns, fieldName...))
-
- if v.v.hasTagNameFunc || fieldName != structFieldName {
- v.str2 = string(append(v.actualNs, structFieldName...))
- } else {
- v.str2 = v.str1
- }
-
- if kind == reflect.Invalid {
-
- v.errs = append(v.errs,
- &fieldError{
- v: v.v,
- tag: tag,
- actualTag: tag,
- ns: v.str1,
- structNs: v.str2,
- fieldLen: uint8(len(fieldName)),
- structfieldLen: uint8(len(structFieldName)),
- param: param,
- kind: kind,
- },
- )
- return
- }
-
- v.errs = append(v.errs,
- &fieldError{
- v: v.v,
- tag: tag,
- actualTag: tag,
- ns: v.str1,
- structNs: v.str2,
- fieldLen: uint8(len(fieldName)),
- structfieldLen: uint8(len(structFieldName)),
- value: fv.Interface(),
- param: param,
- kind: kind,
- typ: fv.Type(),
- },
- )
-}
-
-// ReportValidationErrors reports ValidationErrors obtained from running validations within the Struct Level validation.
-//
-// NOTE: this function prepends the current namespace to the relative ones.
-func (v *validate) ReportValidationErrors(relativeNamespace, relativeStructNamespace string, errs ValidationErrors) {
-
- var err *fieldError
-
- for i := 0; i < len(errs); i++ {
-
- err = errs[i].(*fieldError)
- err.ns = string(append(append(v.ns, relativeNamespace...), err.ns...))
- err.structNs = string(append(append(v.actualNs, relativeStructNamespace...), err.structNs...))
-
- v.errs = append(v.errs, err)
- }
-}
diff --git a/vendor/github.com/go-playground/validator/v10/translations.go b/vendor/github.com/go-playground/validator/v10/translations.go
deleted file mode 100644
index 4d9d75c13..000000000
--- a/vendor/github.com/go-playground/validator/v10/translations.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package validator
-
-import ut "github.com/go-playground/universal-translator"
-
-// TranslationFunc is the function type used to register or override
-// custom translations
-type TranslationFunc func(ut ut.Translator, fe FieldError) string
-
-// RegisterTranslationsFunc allows for registering of translations
-// for a 'ut.Translator' for use within the 'TranslationFunc'
-type RegisterTranslationsFunc func(ut ut.Translator) error
diff --git a/vendor/github.com/go-playground/validator/v10/util.go b/vendor/github.com/go-playground/validator/v10/util.go
deleted file mode 100644
index 9285223a2..000000000
--- a/vendor/github.com/go-playground/validator/v10/util.go
+++ /dev/null
@@ -1,312 +0,0 @@
-package validator
-
-import (
- "fmt"
- "reflect"
- "regexp"
- "strconv"
- "strings"
- "time"
-)
-
-// extractTypeInternal gets the actual underlying type of field value.
-// It will dive into pointers, customTypes and return you the
-// underlying value and it's kind.
-func (v *validate) extractTypeInternal(current reflect.Value, nullable bool) (reflect.Value, reflect.Kind, bool) {
-
-BEGIN:
- switch current.Kind() {
- case reflect.Ptr:
-
- nullable = true
-
- if current.IsNil() {
- return current, reflect.Ptr, nullable
- }
-
- current = current.Elem()
- goto BEGIN
-
- case reflect.Interface:
-
- nullable = true
-
- if current.IsNil() {
- return current, reflect.Interface, nullable
- }
-
- current = current.Elem()
- goto BEGIN
-
- case reflect.Invalid:
- return current, reflect.Invalid, nullable
-
- default:
-
- if v.v.hasCustomFuncs {
-
- if fn, ok := v.v.customFuncs[current.Type()]; ok {
- current = reflect.ValueOf(fn(current))
- goto BEGIN
- }
- }
-
- return current, current.Kind(), nullable
- }
-}
-
-// getStructFieldOKInternal traverses a struct to retrieve a specific field denoted by the provided namespace and
-// returns the field, field kind and whether is was successful in retrieving the field at all.
-//
-// NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field
-// could not be retrieved because it didn't exist.
-func (v *validate) getStructFieldOKInternal(val reflect.Value, namespace string) (current reflect.Value, kind reflect.Kind, nullable bool, found bool) {
-
-BEGIN:
- current, kind, nullable = v.ExtractType(val)
- if kind == reflect.Invalid {
- return
- }
-
- if namespace == "" {
- found = true
- return
- }
-
- switch kind {
-
- case reflect.Ptr, reflect.Interface:
- return
-
- case reflect.Struct:
-
- typ := current.Type()
- fld := namespace
- var ns string
-
- if !typ.ConvertibleTo(timeType) {
-
- idx := strings.Index(namespace, namespaceSeparator)
-
- if idx != -1 {
- fld = namespace[:idx]
- ns = namespace[idx+1:]
- } else {
- ns = ""
- }
-
- bracketIdx := strings.Index(fld, leftBracket)
- if bracketIdx != -1 {
- fld = fld[:bracketIdx]
-
- ns = namespace[bracketIdx:]
- }
-
- val = current.FieldByName(fld)
- namespace = ns
- goto BEGIN
- }
-
- case reflect.Array, reflect.Slice:
- idx := strings.Index(namespace, leftBracket)
- idx2 := strings.Index(namespace, rightBracket)
-
- arrIdx, _ := strconv.Atoi(namespace[idx+1 : idx2])
-
- if arrIdx >= current.Len() {
- return
- }
-
- startIdx := idx2 + 1
-
- if startIdx < len(namespace) {
- if namespace[startIdx:startIdx+1] == namespaceSeparator {
- startIdx++
- }
- }
-
- val = current.Index(arrIdx)
- namespace = namespace[startIdx:]
- goto BEGIN
-
- case reflect.Map:
- idx := strings.Index(namespace, leftBracket) + 1
- idx2 := strings.Index(namespace, rightBracket)
-
- endIdx := idx2
-
- if endIdx+1 < len(namespace) {
- if namespace[endIdx+1:endIdx+2] == namespaceSeparator {
- endIdx++
- }
- }
-
- key := namespace[idx:idx2]
-
- switch current.Type().Key().Kind() {
- case reflect.Int:
- i, _ := strconv.Atoi(key)
- val = current.MapIndex(reflect.ValueOf(i))
- namespace = namespace[endIdx+1:]
-
- case reflect.Int8:
- i, _ := strconv.ParseInt(key, 10, 8)
- val = current.MapIndex(reflect.ValueOf(int8(i)))
- namespace = namespace[endIdx+1:]
-
- case reflect.Int16:
- i, _ := strconv.ParseInt(key, 10, 16)
- val = current.MapIndex(reflect.ValueOf(int16(i)))
- namespace = namespace[endIdx+1:]
-
- case reflect.Int32:
- i, _ := strconv.ParseInt(key, 10, 32)
- val = current.MapIndex(reflect.ValueOf(int32(i)))
- namespace = namespace[endIdx+1:]
-
- case reflect.Int64:
- i, _ := strconv.ParseInt(key, 10, 64)
- val = current.MapIndex(reflect.ValueOf(i))
- namespace = namespace[endIdx+1:]
-
- case reflect.Uint:
- i, _ := strconv.ParseUint(key, 10, 0)
- val = current.MapIndex(reflect.ValueOf(uint(i)))
- namespace = namespace[endIdx+1:]
-
- case reflect.Uint8:
- i, _ := strconv.ParseUint(key, 10, 8)
- val = current.MapIndex(reflect.ValueOf(uint8(i)))
- namespace = namespace[endIdx+1:]
-
- case reflect.Uint16:
- i, _ := strconv.ParseUint(key, 10, 16)
- val = current.MapIndex(reflect.ValueOf(uint16(i)))
- namespace = namespace[endIdx+1:]
-
- case reflect.Uint32:
- i, _ := strconv.ParseUint(key, 10, 32)
- val = current.MapIndex(reflect.ValueOf(uint32(i)))
- namespace = namespace[endIdx+1:]
-
- case reflect.Uint64:
- i, _ := strconv.ParseUint(key, 10, 64)
- val = current.MapIndex(reflect.ValueOf(i))
- namespace = namespace[endIdx+1:]
-
- case reflect.Float32:
- f, _ := strconv.ParseFloat(key, 32)
- val = current.MapIndex(reflect.ValueOf(float32(f)))
- namespace = namespace[endIdx+1:]
-
- case reflect.Float64:
- f, _ := strconv.ParseFloat(key, 64)
- val = current.MapIndex(reflect.ValueOf(f))
- namespace = namespace[endIdx+1:]
-
- case reflect.Bool:
- b, _ := strconv.ParseBool(key)
- val = current.MapIndex(reflect.ValueOf(b))
- namespace = namespace[endIdx+1:]
-
- // reflect.Type = string
- default:
- val = current.MapIndex(reflect.ValueOf(key))
- namespace = namespace[endIdx+1:]
- }
-
- goto BEGIN
- }
-
- // if got here there was more namespace, cannot go any deeper
- panic("Invalid field namespace")
-}
-
-// asInt returns the parameter as a int64
-// or panics if it can't convert
-func asInt(param string) int64 {
- i, err := strconv.ParseInt(param, 0, 64)
- panicIf(err)
-
- return i
-}
-
-// asIntFromTimeDuration parses param as time.Duration and returns it as int64
-// or panics on error.
-func asIntFromTimeDuration(param string) int64 {
- d, err := time.ParseDuration(param)
- if err != nil {
- // attempt parsing as an integer assuming nanosecond precision
- return asInt(param)
- }
- return int64(d)
-}
-
-// asIntFromType calls the proper function to parse param as int64,
-// given a field's Type t.
-func asIntFromType(t reflect.Type, param string) int64 {
- switch t {
- case timeDurationType:
- return asIntFromTimeDuration(param)
- default:
- return asInt(param)
- }
-}
-
-// asUint returns the parameter as a uint64
-// or panics if it can't convert
-func asUint(param string) uint64 {
-
- i, err := strconv.ParseUint(param, 0, 64)
- panicIf(err)
-
- return i
-}
-
-// asFloat64 returns the parameter as a float64
-// or panics if it can't convert
-func asFloat64(param string) float64 {
- i, err := strconv.ParseFloat(param, 64)
- panicIf(err)
- return i
-}
-
-// asFloat32 returns the parameter as a float32
-// or panics if it can't convert
-func asFloat32(param string) float64 {
- i, err := strconv.ParseFloat(param, 32)
- panicIf(err)
- return i
-}
-
-// asBool returns the parameter as a bool
-// or panics if it can't convert
-func asBool(param string) bool {
-
- i, err := strconv.ParseBool(param)
- panicIf(err)
-
- return i
-}
-
-func panicIf(err error) {
- if err != nil {
- panic(err.Error())
- }
-}
-
-// Checks if field value matches regex. If fl.Field can be cast to Stringer, it uses the Stringer interfaces
-// String() return value. Otherwise, it uses fl.Field's String() value.
-func fieldMatchesRegexByStringerValOrString(regexFn func() *regexp.Regexp, fl FieldLevel) bool {
- regex := regexFn()
- switch fl.Field().Kind() {
- case reflect.String:
- return regex.MatchString(fl.Field().String())
- default:
- if stringer, ok := fl.Field().Interface().(fmt.Stringer); ok {
- return regex.MatchString(stringer.String())
- } else {
- return regex.MatchString(fl.Field().String())
- }
- }
-}
diff --git a/vendor/github.com/go-playground/validator/v10/validator.go b/vendor/github.com/go-playground/validator/v10/validator.go
deleted file mode 100644
index 901e7b50a..000000000
--- a/vendor/github.com/go-playground/validator/v10/validator.go
+++ /dev/null
@@ -1,510 +0,0 @@
-package validator
-
-import (
- "context"
- "fmt"
- "reflect"
- "strconv"
- "unsafe"
-)
-
-// per validate construct
-type validate struct {
- v *Validate
- top reflect.Value
- ns []byte
- actualNs []byte
- errs ValidationErrors
- includeExclude map[string]struct{} // reset only if StructPartial or StructExcept are called, no need otherwise
- ffn FilterFunc
- slflParent reflect.Value // StructLevel & FieldLevel
- slCurrent reflect.Value // StructLevel & FieldLevel
- flField reflect.Value // StructLevel & FieldLevel
- cf *cField // StructLevel & FieldLevel
- ct *cTag // StructLevel & FieldLevel
- misc []byte // misc reusable
- str1 string // misc reusable
- str2 string // misc reusable
- fldIsPointer bool // StructLevel & FieldLevel
- isPartial bool
- hasExcludes bool
-}
-
-// parent and current will be the same the first run of validateStruct
-func (v *validate) validateStruct(ctx context.Context, parent reflect.Value, current reflect.Value, typ reflect.Type, ns []byte, structNs []byte, ct *cTag) {
-
- cs, ok := v.v.structCache.Get(typ)
- if !ok {
- cs = v.v.extractStructCache(current, typ.Name())
- }
-
- if len(ns) == 0 && len(cs.name) != 0 {
-
- ns = append(ns, cs.name...)
- ns = append(ns, '.')
-
- structNs = append(structNs, cs.name...)
- structNs = append(structNs, '.')
- }
-
- // ct is nil on top level struct, and structs as fields that have no tag info
- // so if nil or if not nil and the structonly tag isn't present
- if ct == nil || ct.typeof != typeStructOnly {
-
- var f *cField
-
- for i := 0; i < len(cs.fields); i++ {
-
- f = cs.fields[i]
-
- if v.isPartial {
-
- if v.ffn != nil {
- // used with StructFiltered
- if v.ffn(append(structNs, f.name...)) {
- continue
- }
-
- } else {
- // used with StructPartial & StructExcept
- _, ok = v.includeExclude[string(append(structNs, f.name...))]
-
- if (ok && v.hasExcludes) || (!ok && !v.hasExcludes) {
- continue
- }
- }
- }
-
- v.traverseField(ctx, current, current.Field(f.idx), ns, structNs, f, f.cTags)
- }
- }
-
- // check if any struct level validations, after all field validations already checked.
- // first iteration will have no info about nostructlevel tag, and is checked prior to
- // calling the next iteration of validateStruct called from traverseField.
- if cs.fn != nil {
-
- v.slflParent = parent
- v.slCurrent = current
- v.ns = ns
- v.actualNs = structNs
-
- cs.fn(ctx, v)
- }
-}
-
-// traverseField validates any field, be it a struct or single field, ensures it's validity and passes it along to be validated via it's tag options
-func (v *validate) traverseField(ctx context.Context, parent reflect.Value, current reflect.Value, ns []byte, structNs []byte, cf *cField, ct *cTag) {
- var typ reflect.Type
- var kind reflect.Kind
-
- current, kind, v.fldIsPointer = v.extractTypeInternal(current, false)
-
- var isNestedStruct bool
-
- switch kind {
- case reflect.Ptr, reflect.Interface, reflect.Invalid:
-
- if ct == nil {
- return
- }
-
- if ct.typeof == typeOmitEmpty || ct.typeof == typeIsDefault {
- return
- }
-
- if ct.typeof == typeOmitNil && (kind != reflect.Invalid && current.IsNil()) {
- return
- }
-
- if ct.hasTag {
- if kind == reflect.Invalid {
- 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)),
- param: ct.param,
- kind: kind,
- },
- )
- return
- }
-
- v.str1 = string(append(ns, cf.altName...))
- if v.v.hasTagNameFunc {
- v.str2 = string(append(structNs, cf.name...))
- } else {
- v.str2 = v.str1
- }
- if !ct.runValidationWhenNil {
- 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: getValue(current),
- param: ct.param,
- kind: kind,
- typ: current.Type(),
- },
- )
- return
- }
- }
-
- if kind == reflect.Invalid {
- 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 isNestedStruct && !v.v.requiredStructEnabled && ct != nil && ct.tag == requiredTag {
- ct = ct.next
- }
- }
-
- typ = current.Type()
-
-OUTER:
- for {
- 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:
-
- // set Field Level fields
- v.slflParent = parent
- v.flField = current
- v.cf = cf
- v.ct = ct
-
- if !hasValue(v) {
- return
- }
-
- ct = ct.next
- continue
-
- case typeOmitNil:
- v.slflParent = parent
- v.flField = current
- v.cf = cf
- v.ct = ct
-
- switch field := v.Field(); field.Kind() {
- case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func:
- if field.IsNil() {
- return
- }
- default:
- if v.fldIsPointer && field.Interface() == nil {
- return
- }
- }
-
- ct = ct.next
- continue
-
- case typeEndKeys:
- return
-
- case typeDive:
-
- ct = ct.next
-
- // traverse slice or map here
- // or panic ;)
- switch kind {
- case reflect.Slice, reflect.Array:
-
- var i64 int64
- reusableCF := &cField{}
-
- for i := 0; i < current.Len(); i++ {
-
- i64 = int64(i)
-
- v.misc = append(v.misc[0:0], cf.name...)
- v.misc = append(v.misc, '[')
- v.misc = strconv.AppendInt(v.misc, i64, 10)
- v.misc = append(v.misc, ']')
-
- reusableCF.name = string(v.misc)
-
- if cf.namesEqual {
- reusableCF.altName = reusableCF.name
- } else {
-
- v.misc = append(v.misc[0:0], cf.altName...)
- v.misc = append(v.misc, '[')
- v.misc = strconv.AppendInt(v.misc, i64, 10)
- v.misc = append(v.misc, ']')
-
- reusableCF.altName = string(v.misc)
- }
- v.traverseField(ctx, parent, current.Index(i), ns, structNs, reusableCF, ct)
- }
-
- case reflect.Map:
-
- var pv string
- reusableCF := &cField{}
-
- for _, key := range current.MapKeys() {
-
- pv = fmt.Sprintf("%v", key.Interface())
-
- v.misc = append(v.misc[0:0], cf.name...)
- v.misc = append(v.misc, '[')
- v.misc = append(v.misc, pv...)
- v.misc = append(v.misc, ']')
-
- reusableCF.name = string(v.misc)
-
- if cf.namesEqual {
- reusableCF.altName = reusableCF.name
- } else {
- v.misc = append(v.misc[0:0], cf.altName...)
- v.misc = append(v.misc, '[')
- v.misc = append(v.misc, pv...)
- v.misc = append(v.misc, ']')
-
- reusableCF.altName = string(v.misc)
- }
-
- if ct != nil && ct.typeof == typeKeys && ct.keys != nil {
- v.traverseField(ctx, parent, key, ns, structNs, reusableCF, ct.keys)
- // can be nil when just keys being validated
- if ct.next != nil {
- v.traverseField(ctx, parent, current.MapIndex(key), ns, structNs, reusableCF, ct.next)
- }
- } else {
- v.traverseField(ctx, parent, current.MapIndex(key), ns, structNs, reusableCF, ct)
- }
- }
-
- default:
- // throw error, if not a slice or map then should not have gotten here
- // bad dive tag
- panic("dive error! can't dive on a non slice or map")
- }
-
- return
-
- case typeOr:
-
- v.misc = v.misc[0:0]
-
- for {
-
- // set Field Level fields
- v.slflParent = parent
- v.flField = current
- v.cf = cf
- v.ct = ct
-
- if ct.fn(ctx, v) {
- if ct.isBlockEnd {
- ct = ct.next
- continue OUTER
- }
-
- // drain rest of the 'or' values, then continue or leave
- for {
-
- ct = ct.next
-
- if ct == nil {
- continue OUTER
- }
-
- if ct.typeof != typeOr {
- continue OUTER
- }
-
- if ct.isBlockEnd {
- ct = ct.next
- continue OUTER
- }
- }
- }
-
- v.misc = append(v.misc, '|')
- v.misc = append(v.misc, ct.tag...)
-
- if ct.hasParam {
- v.misc = append(v.misc, '=')
- v.misc = append(v.misc, ct.param...)
- }
-
- if ct.isBlockEnd || ct.next == nil {
- // if we get here, no valid 'or' value and no more tags
- v.str1 = string(append(ns, cf.altName...))
-
- if v.v.hasTagNameFunc {
- v.str2 = string(append(structNs, cf.name...))
- } else {
- v.str2 = v.str1
- }
-
- if ct.hasAlias {
-
- v.errs = append(v.errs,
- &fieldError{
- v: v.v,
- tag: ct.aliasTag,
- actualTag: ct.actualAliasTag,
- ns: v.str1,
- structNs: v.str2,
- fieldLen: uint8(len(cf.altName)),
- structfieldLen: uint8(len(cf.name)),
- value: getValue(current),
- param: ct.param,
- kind: kind,
- typ: typ,
- },
- )
-
- } else {
-
- tVal := string(v.misc)[1:]
-
- v.errs = append(v.errs,
- &fieldError{
- v: v.v,
- tag: tVal,
- actualTag: tVal,
- ns: v.str1,
- structNs: v.str2,
- fieldLen: uint8(len(cf.altName)),
- structfieldLen: uint8(len(cf.name)),
- value: getValue(current),
- param: ct.param,
- kind: kind,
- typ: typ,
- },
- )
- }
-
- return
- }
-
- ct = ct.next
- }
-
- default:
-
- // 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: getValue(current),
- param: ct.param,
- kind: kind,
- typ: typ,
- },
- )
-
- return
- }
- ct = ct.next
- }
- }
-
-}
-
-func getValue(val reflect.Value) interface{} {
- if val.CanInterface() {
- return val.Interface()
- }
-
- if val.CanAddr() {
- return reflect.NewAt(val.Type(), unsafe.Pointer(val.UnsafeAddr())).Elem().Interface()
- }
-
- switch val.Kind() {
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return val.Int()
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return val.Uint()
- case reflect.Complex64, reflect.Complex128:
- return val.Complex()
- case reflect.Float32, reflect.Float64:
- return val.Float()
- default:
- return val.String()
- }
-}
diff --git a/vendor/github.com/go-playground/validator/v10/validator_instance.go b/vendor/github.com/go-playground/validator/v10/validator_instance.go
deleted file mode 100644
index d9f148dba..000000000
--- a/vendor/github.com/go-playground/validator/v10/validator_instance.go
+++ /dev/null
@@ -1,710 +0,0 @@
-package validator
-
-import (
- "context"
- "errors"
- "fmt"
- "reflect"
- "strings"
- "sync"
- "time"
-
- ut "github.com/go-playground/universal-translator"
-)
-
-const (
- defaultTagName = "validate"
- utf8HexComma = "0x2C"
- utf8Pipe = "0x7C"
- tagSeparator = ","
- orSeparator = "|"
- tagKeySeparator = "="
- structOnlyTag = "structonly"
- noStructLevelTag = "nostructlevel"
- omitempty = "omitempty"
- omitnil = "omitnil"
- isdefault = "isdefault"
- requiredWithoutAllTag = "required_without_all"
- requiredWithoutTag = "required_without"
- requiredWithTag = "required_with"
- requiredWithAllTag = "required_with_all"
- requiredIfTag = "required_if"
- requiredUnlessTag = "required_unless"
- skipUnlessTag = "skip_unless"
- excludedWithoutAllTag = "excluded_without_all"
- excludedWithoutTag = "excluded_without"
- excludedWithTag = "excluded_with"
- excludedWithAllTag = "excluded_with_all"
- excludedIfTag = "excluded_if"
- excludedUnlessTag = "excluded_unless"
- skipValidationTag = "-"
- diveTag = "dive"
- keysTag = "keys"
- endKeysTag = "endkeys"
- requiredTag = "required"
- namespaceSeparator = "."
- leftBracket = "["
- rightBracket = "]"
- restrictedTagChars = ".[],|=+()`~!@#$%^&*\\\"/?<>{}"
- restrictedAliasErr = "Alias '%s' either contains restricted characters or is the same as a restricted tag needed for normal operation"
- restrictedTagErr = "Tag '%s' either contains restricted characters or is the same as a restricted tag needed for normal operation"
-)
-
-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/skipped from
-// validation
-type FilterFunc func(ns []byte) bool
-
-// CustomTypeFunc allows for overriding or adding custom field type handler functions
-// field = field value of the type to return a value to be validated
-// example Valuer from sql drive see https://golang.org/src/database/sql/driver/types.go?s=1210:1293#L29
-type CustomTypeFunc func(field reflect.Value) interface{}
-
-// TagNameFunc allows for adding of a custom tag name parser
-type TagNameFunc func(field reflect.StructField) string
-
-type internalValidationFuncWrapper struct {
- fn FuncCtx
- runValidationOnNil bool
-}
-
-// Validate contains the validator settings and cache
-type Validate struct {
- 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
- privateFieldValidation bool
-}
-
-// New returns a new instance of 'validate' with sane defaults.
-// Validate is designed to be thread-safe and used as a singleton instance.
-// 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(options ...Option) *Validate {
-
- tc := new(tagCache)
- tc.m.Store(make(map[string]*cTag))
-
- sc := new(structCache)
- sc.m.Store(make(map[reflect.Type]*cStruct))
-
- v := &Validate{
- tagName: defaultTagName,
- aliases: make(map[string]string, len(bakedInAliases)),
- validations: make(map[string]internalValidationFuncWrapper, len(bakedInValidators)),
- tagCache: tc,
- structCache: sc,
- }
-
- // must copy alias validators for separate validations to be used in each validator instance
- for k, val := range bakedInAliases {
- v.RegisterAlias(k, val)
- }
-
- // must copy validators for separate validations to be used in each instance
- for k, val := range bakedInValidators {
-
- 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,
- skipUnlessTag:
- _ = v.registerValidation(k, wrapFunc(val), true, true)
- default:
- // no need to error check here, baked in will always be valid
- _ = v.registerValidation(k, wrapFunc(val), true, false)
- }
- }
-
- v.pool = &sync.Pool{
- New: func() interface{} {
- return &validate{
- v: v,
- ns: make([]byte, 0, 64),
- actualNs: make([]byte, 0, 64),
- misc: make([]byte, 32),
- }
- },
- }
-
- for _, o := range options {
- o(v)
- }
- return v
-}
-
-// SetTagName allows for changing of the default tag name of 'validate'
-func (v *Validate) SetTagName(name string) {
- v.tagName = name
-}
-
-// ValidateMapCtx validates a map using a map of validation rules and allows passing of contextual
-// 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 {
- if ruleObj, ok := rule.(map[string]interface{}); ok {
- if dataObj, ok := data[field].(map[string]interface{}); ok {
- err := v.ValidateMapCtx(ctx, dataObj, ruleObj)
- if len(err) > 0 {
- errs[field] = err
- }
- } else if dataObjs, ok := data[field].([]map[string]interface{}); ok {
- for _, obj := range dataObjs {
- err := v.ValidateMapCtx(ctx, obj, ruleObj)
- if len(err) > 0 {
- errs[field] = err
- }
- }
- } else {
- errs[field] = errors.New("The field: '" + field + "' is not a map to dive")
- }
- } else if ruleStr, ok := rule.(string); ok {
- err := v.VarCtx(ctx, data[field], ruleStr)
- if err != nil {
- errs[field] = err
- }
- }
- }
- return errs
-}
-
-// ValidateMap validates map data from a map of tags
-func (v *Validate) ValidateMap(data map[string]interface{}, rules map[string]interface{}) map[string]interface{} {
- return v.ValidateMapCtx(context.Background(), data, rules)
-}
-
-// RegisterTagNameFunc registers a function to get alternate names for StructFields.
-//
-// 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
-// })
-func (v *Validate) RegisterTagNameFunc(fn TagNameFunc) {
- v.tagNameFunc = fn
- v.hasTagNameFunc = true
-}
-
-// RegisterValidation adds a validation with the given tag
-//
-// NOTES:
-// - if the key already exists, the previous validation function will be replaced.
-// - this method is not thread-safe it is intended that these all be registered prior to any validation
-func (v *Validate) RegisterValidation(tag string, fn Func, callValidationEvenIfNull ...bool) error {
- return v.RegisterValidationCtx(tag, wrapFunc(fn), callValidationEvenIfNull...)
-}
-
-// RegisterValidationCtx does the same as RegisterValidation on accepts a FuncCtx validation
-// allowing context.Context validation support.
-func (v *Validate) RegisterValidationCtx(tag string, fn FuncCtx, callValidationEvenIfNull ...bool) error {
- var nilCheckable bool
- if len(callValidationEvenIfNull) > 0 {
- nilCheckable = callValidationEvenIfNull[0]
- }
- return v.registerValidation(tag, fn, false, nilCheckable)
-}
-
-func (v *Validate) registerValidation(tag string, fn FuncCtx, bakedIn bool, nilCheckable bool) error {
- if len(tag) == 0 {
- return errors.New("function Key cannot be empty")
- }
-
- if fn == nil {
- return errors.New("function cannot be empty")
- }
-
- _, ok := restrictedTags[tag]
- if !bakedIn && (ok || strings.ContainsAny(tag, restrictedTagChars)) {
- panic(fmt.Sprintf(restrictedTagErr, tag))
- }
- v.validations[tag] = internalValidationFuncWrapper{fn: fn, runValidationOnNil: nilCheckable}
- return nil
-}
-
-// RegisterAlias registers a mapping of a single validation tag that
-// defines a common or complex set of validation(s) to simplify adding validation
-// to structs.
-//
-// NOTE: this function is not thread-safe it is intended that these all be registered prior to any validation
-func (v *Validate) RegisterAlias(alias, tags string) {
-
- _, ok := restrictedTags[alias]
-
- if ok || strings.ContainsAny(alias, restrictedTagChars) {
- panic(fmt.Sprintf(restrictedAliasErr, alias))
- }
-
- v.aliases[alias] = tags
-}
-
-// RegisterStructValidation registers a StructLevelFunc against a number of types.
-//
-// NOTE:
-// - this method is not thread-safe it is intended that these all be registered prior to any validation
-func (v *Validate) RegisterStructValidation(fn StructLevelFunc, types ...interface{}) {
- v.RegisterStructValidationCtx(wrapStructLevelFunc(fn), types...)
-}
-
-// RegisterStructValidationCtx registers a StructLevelFuncCtx against a number of types and allows passing
-// of contextual validation information via context.Context.
-//
-// NOTE:
-// - this method is not thread-safe it is intended that these all be registered prior to any validation
-func (v *Validate) RegisterStructValidationCtx(fn StructLevelFuncCtx, types ...interface{}) {
-
- if v.structLevelFuncs == nil {
- v.structLevelFuncs = make(map[reflect.Type]StructLevelFuncCtx)
- }
-
- for _, t := range types {
- tv := reflect.ValueOf(t)
- if tv.Kind() == reflect.Ptr {
- t = reflect.Indirect(tv).Interface()
- }
-
- v.structLevelFuncs[reflect.TypeOf(t)] = fn
- }
-}
-
-// RegisterStructValidationMapRules registers validate map rules.
-// Be aware that map validation rules supersede those defined on a/the struct if present.
-//
-// NOTE: this method is not thread-safe it is intended that these all be registered prior to any validation
-func (v *Validate) RegisterStructValidationMapRules(rules map[string]string, types ...interface{}) {
- if v.rules == nil {
- v.rules = make(map[reflect.Type]map[string]string)
- }
-
- deepCopyRules := make(map[string]string)
- for i, rule := range rules {
- deepCopyRules[i] = rule
- }
-
- for _, t := range types {
- typ := reflect.TypeOf(t)
-
- if typ.Kind() == reflect.Ptr {
- typ = typ.Elem()
- }
-
- if typ.Kind() != reflect.Struct {
- continue
- }
- v.rules[typ] = deepCopyRules
- }
-}
-
-// RegisterCustomTypeFunc registers a CustomTypeFunc against a number of types
-//
-// NOTE: this method is not thread-safe it is intended that these all be registered prior to any validation
-func (v *Validate) RegisterCustomTypeFunc(fn CustomTypeFunc, types ...interface{}) {
-
- if v.customFuncs == nil {
- v.customFuncs = make(map[reflect.Type]CustomTypeFunc)
- }
-
- for _, t := range types {
- v.customFuncs[reflect.TypeOf(t)] = fn
- }
-
- v.hasCustomFuncs = true
-}
-
-// RegisterTranslation registers translations against the provided tag.
-func (v *Validate) RegisterTranslation(tag string, trans ut.Translator, registerFn RegisterTranslationsFunc, translationFn TranslationFunc) (err error) {
-
- if v.transTagFunc == nil {
- v.transTagFunc = make(map[ut.Translator]map[string]TranslationFunc)
- }
-
- if err = registerFn(trans); err != nil {
- return
- }
-
- m, ok := v.transTagFunc[trans]
- if !ok {
- m = make(map[string]TranslationFunc)
- v.transTagFunc[trans] = m
- }
-
- m[tag] = translationFn
-
- return
-}
-
-// Struct validates a structs exposed fields, and automatically validates nested structs, unless otherwise specified.
-//
-// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
-// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.
-func (v *Validate) Struct(s interface{}) error {
- return v.StructCtx(context.Background(), s)
-}
-
-// StructCtx validates a structs exposed fields, and automatically validates nested structs, unless otherwise specified
-// and also allows passing of context.Context for contextual validation information.
-//
-// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
-// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.
-func (v *Validate) StructCtx(ctx context.Context, s interface{}) (err error) {
-
- val := reflect.ValueOf(s)
- top := val
-
- if val.Kind() == reflect.Ptr && !val.IsNil() {
- val = val.Elem()
- }
-
- if val.Kind() != reflect.Struct || val.Type().ConvertibleTo(timeType) {
- return &InvalidValidationError{Type: reflect.TypeOf(s)}
- }
-
- // good to validate
- vd := v.pool.Get().(*validate)
- vd.top = top
- vd.isPartial = false
- // vd.hasExcludes = false // only need to reset in StructPartial and StructExcept
-
- vd.validateStruct(ctx, top, val, val.Type(), vd.ns[0:0], vd.actualNs[0:0], nil)
-
- if len(vd.errs) > 0 {
- err = vd.errs
- vd.errs = nil
- }
-
- v.pool.Put(vd)
-
- return
-}
-
-// StructFiltered validates a structs exposed fields, that pass the FilterFunc check and automatically validates
-// nested structs, unless otherwise specified.
-//
-// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
-// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.
-func (v *Validate) StructFiltered(s interface{}, fn FilterFunc) error {
- return v.StructFilteredCtx(context.Background(), s, fn)
-}
-
-// StructFilteredCtx validates a structs exposed fields, that pass the FilterFunc check and automatically validates
-// nested structs, unless otherwise specified and also allows passing of contextual validation information via
-// context.Context
-//
-// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
-// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.
-func (v *Validate) StructFilteredCtx(ctx context.Context, s interface{}, fn FilterFunc) (err error) {
- val := reflect.ValueOf(s)
- top := val
-
- if val.Kind() == reflect.Ptr && !val.IsNil() {
- val = val.Elem()
- }
-
- if val.Kind() != reflect.Struct || val.Type().ConvertibleTo(timeType) {
- return &InvalidValidationError{Type: reflect.TypeOf(s)}
- }
-
- // good to validate
- vd := v.pool.Get().(*validate)
- vd.top = top
- vd.isPartial = true
- vd.ffn = fn
- // vd.hasExcludes = false // only need to reset in StructPartial and StructExcept
-
- vd.validateStruct(ctx, top, val, val.Type(), vd.ns[0:0], vd.actualNs[0:0], nil)
-
- if len(vd.errs) > 0 {
- err = vd.errs
- vd.errs = nil
- }
-
- v.pool.Put(vd)
-
- return
-}
-
-// StructPartial validates the fields passed in only, ignoring all others.
-// Fields may be provided in a namespaced fashion relative to the struct provided
-// eg. NestedStruct.Field or NestedArrayField[0].Struct.Name
-//
-// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
-// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.
-func (v *Validate) StructPartial(s interface{}, fields ...string) error {
- return v.StructPartialCtx(context.Background(), s, fields...)
-}
-
-// StructPartialCtx validates the fields passed in only, ignoring all others and allows passing of contextual
-// 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
-//
-// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
-// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.
-func (v *Validate) StructPartialCtx(ctx context.Context, s interface{}, fields ...string) (err error) {
- val := reflect.ValueOf(s)
- top := val
-
- if val.Kind() == reflect.Ptr && !val.IsNil() {
- val = val.Elem()
- }
-
- if val.Kind() != reflect.Struct || val.Type().ConvertibleTo(timeType) {
- return &InvalidValidationError{Type: reflect.TypeOf(s)}
- }
-
- // good to validate
- vd := v.pool.Get().(*validate)
- vd.top = top
- vd.isPartial = true
- vd.ffn = nil
- vd.hasExcludes = false
- vd.includeExclude = make(map[string]struct{})
-
- typ := val.Type()
- name := typ.Name()
-
- for _, k := range fields {
-
- flds := strings.Split(k, namespaceSeparator)
- if len(flds) > 0 {
-
- vd.misc = append(vd.misc[0:0], name...)
- // Don't append empty name for unnamed structs
- if len(vd.misc) != 0 {
- vd.misc = append(vd.misc, '.')
- }
-
- for _, s := range flds {
-
- idx := strings.Index(s, leftBracket)
-
- if idx != -1 {
- for idx != -1 {
- vd.misc = append(vd.misc, s[:idx]...)
- vd.includeExclude[string(vd.misc)] = struct{}{}
-
- idx2 := strings.Index(s, rightBracket)
- idx2++
- vd.misc = append(vd.misc, s[idx:idx2]...)
- vd.includeExclude[string(vd.misc)] = struct{}{}
- s = s[idx2:]
- idx = strings.Index(s, leftBracket)
- }
- } else {
-
- vd.misc = append(vd.misc, s...)
- vd.includeExclude[string(vd.misc)] = struct{}{}
- }
-
- vd.misc = append(vd.misc, '.')
- }
- }
- }
-
- vd.validateStruct(ctx, top, val, typ, vd.ns[0:0], vd.actualNs[0:0], nil)
-
- if len(vd.errs) > 0 {
- err = vd.errs
- vd.errs = nil
- }
-
- v.pool.Put(vd)
-
- return
-}
-
-// StructExcept validates all fields except the ones passed in.
-// Fields may be provided in a namespaced fashion relative to the struct provided
-// i.e. NestedStruct.Field or NestedArrayField[0].Struct.Name
-//
-// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
-// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.
-func (v *Validate) StructExcept(s interface{}, fields ...string) error {
- return v.StructExceptCtx(context.Background(), s, fields...)
-}
-
-// StructExceptCtx validates all fields except the ones passed in and allows passing of contextual
-// 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
-//
-// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
-// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.
-func (v *Validate) StructExceptCtx(ctx context.Context, s interface{}, fields ...string) (err error) {
- val := reflect.ValueOf(s)
- top := val
-
- if val.Kind() == reflect.Ptr && !val.IsNil() {
- val = val.Elem()
- }
-
- if val.Kind() != reflect.Struct || val.Type().ConvertibleTo(timeType) {
- return &InvalidValidationError{Type: reflect.TypeOf(s)}
- }
-
- // good to validate
- vd := v.pool.Get().(*validate)
- vd.top = top
- vd.isPartial = true
- vd.ffn = nil
- vd.hasExcludes = true
- vd.includeExclude = make(map[string]struct{})
-
- typ := val.Type()
- name := typ.Name()
-
- for _, key := range fields {
-
- vd.misc = vd.misc[0:0]
-
- if len(name) > 0 {
- vd.misc = append(vd.misc, name...)
- vd.misc = append(vd.misc, '.')
- }
-
- vd.misc = append(vd.misc, key...)
- vd.includeExclude[string(vd.misc)] = struct{}{}
- }
-
- vd.validateStruct(ctx, top, val, typ, vd.ns[0:0], vd.actualNs[0:0], nil)
-
- if len(vd.errs) > 0 {
- err = vd.errs
- vd.errs = nil
- }
-
- v.pool.Put(vd)
-
- return
-}
-
-// Var validates a single variable using tag style validation.
-// eg.
-// var i int
-// validate.Var(i, "gt=1,lt=10")
-//
-// WARNING: a struct can be passed for validation eg. time.Time is a struct or
-// if you have a custom type and have registered a custom type handler, so must
-// allow it; however unforeseen validations will occur if trying to validate a
-// struct that is meant to be passed to 'validate.Struct'
-//
-// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
-// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.
-// validate Array, Slice and maps fields which may contain more than one error
-func (v *Validate) Var(field interface{}, tag string) error {
- return v.VarCtx(context.Background(), field, tag)
-}
-
-// VarCtx validates a single variable using tag style validation and allows passing of contextual
-// validation information via context.Context.
-// eg.
-// var i int
-// validate.Var(i, "gt=1,lt=10")
-//
-// WARNING: a struct can be passed for validation eg. time.Time is a struct or
-// if you have a custom type and have registered a custom type handler, so must
-// allow it; however unforeseen validations will occur if trying to validate a
-// struct that is meant to be passed to 'validate.Struct'
-//
-// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
-// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.
-// validate Array, Slice and maps fields which may contain more than one error
-func (v *Validate) VarCtx(ctx context.Context, field interface{}, tag string) (err error) {
- if len(tag) == 0 || tag == skipValidationTag {
- return nil
- }
-
- ctag := v.fetchCacheTag(tag)
-
- val := reflect.ValueOf(field)
- vd := v.pool.Get().(*validate)
- vd.top = val
- vd.isPartial = false
- vd.traverseField(ctx, val, val, vd.ns[0:0], vd.actualNs[0:0], defaultCField, ctag)
-
- if len(vd.errs) > 0 {
- err = vd.errs
- vd.errs = nil
- }
- v.pool.Put(vd)
- return
-}
-
-// VarWithValue validates a single variable, against another variable/field's value using tag style validation
-// eg.
-// s1 := "abcd"
-// s2 := "abcd"
-// validate.VarWithValue(s1, s2, "eqcsfield") // returns true
-//
-// WARNING: a struct can be passed for validation eg. time.Time is a struct or
-// if you have a custom type and have registered a custom type handler, so must
-// allow it; however unforeseen validations will occur if trying to validate a
-// struct that is meant to be passed to 'validate.Struct'
-//
-// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
-// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.
-// validate Array, Slice and maps fields which may contain more than one error
-func (v *Validate) VarWithValue(field interface{}, other interface{}, tag string) error {
- return v.VarWithValueCtx(context.Background(), field, other, tag)
-}
-
-// VarWithValueCtx validates a single variable, against another variable/field's value using tag style validation and
-// allows passing of contextual validation information via context.Context.
-// eg.
-// s1 := "abcd"
-// s2 := "abcd"
-// validate.VarWithValue(s1, s2, "eqcsfield") // returns true
-//
-// WARNING: a struct can be passed for validation eg. time.Time is a struct or
-// if you have a custom type and have registered a custom type handler, so must
-// allow it; however unforeseen validations will occur if trying to validate a
-// struct that is meant to be passed to 'validate.Struct'
-//
-// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.
-// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.
-// validate Array, Slice and maps fields which may contain more than one error
-func (v *Validate) VarWithValueCtx(ctx context.Context, field interface{}, other interface{}, tag string) (err error) {
- if len(tag) == 0 || tag == skipValidationTag {
- return nil
- }
- ctag := v.fetchCacheTag(tag)
- otherVal := reflect.ValueOf(other)
- vd := v.pool.Get().(*validate)
- vd.top = otherVal
- vd.isPartial = false
- vd.traverseField(ctx, otherVal, reflect.ValueOf(field), vd.ns[0:0], vd.actualNs[0:0], defaultCField, ctag)
-
- if len(vd.errs) > 0 {
- err = vd.errs
- vd.errs = nil
- }
- v.pool.Put(vd)
- return
-}