[
  {
    "path": ".github/CODEOWNERS",
    "content": "* @go-playground/validator-maintainers"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contribution Guidelines\n\n## Quality Standard\n\nTo ensure the continued stability of this package, tests are required that cover the change in order for a pull request to be merged.\n\n## Reporting issues\n\nPlease open an issue or join the gitter chat [![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) for any issues, questions or possible enhancements to the package.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: Bug Report\ndescription: File a bug report\ntitle: \"[Bug]: \"\nlabels: [\"bug\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to fill out this bug report!\n  - type: textarea\n    id: what-happened\n    attributes:\n      label: What happened?\n      description: Also tell us, what did you expect to happen?\n    validations:\n      required: true\n  - type: textarea\n    id: version\n    attributes:\n      label: Version\n      description: What version of validator are you running?\n    validations:\n      required: true\n  - type: textarea\n    id: code\n    attributes:\n      label: Example Code\n      description: Please provide a code example that demonstrates the issue\n      render: go\n    validations:\n      required: true "
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "## Fixes Or Enhances\n\n\n**Make sure that you've checked the boxes below before you submit PR:**\n- [ ] Tests exist or have been written that cover this particular change.\n\n@go-playground/validator-maintainers"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n# Maintain dependencies for Golang\n- package-ecosystem: gomod\n  directory: \"/\"\n  schedule:\n    interval: weekly\n# Maintain dependencies for GitHub Actions\n- package-ecosystem: github-actions\n  directory: \"/\"\n  schedule:\n    interval: weekly\n"
  },
  {
    "path": ".github/workflows/workflow.yml",
    "content": "on:\n  push:\n    branches:\n      - master\n  pull_request:\nname: Test\njobs:\n  test:\n    strategy:\n      matrix:\n        go-version: [1.25.x, 1.26.x]\n        os: [ubuntu-latest, macos-latest, windows-latest]\n    runs-on: ${{ matrix.os }}\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v6\n\n      - name: Install Go\n        uses: actions/setup-go@v6\n        with:\n          go-version: ${{ matrix.go-version }}\n\n      - name: Test\n        run: go test -race -covermode=atomic -coverprofile=\"profile.cov\" ./...\n\n      - name: Send Coverage\n        if: matrix.os == 'ubuntu-latest' && matrix.go-version == '1.24.x'\n        uses: shogo82148/actions-goveralls@v1\n        with:\n          path-to-profile: profile.cov\n\n  golangci:\n    name: lint\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-go@v6\n        with:\n          go-version: 1.25.x\n      - name: golangci-lint\n        uses: golangci/golangci-lint-action@v9\n        with:\n          version: latest"
  },
  {
    "path": ".gitignore",
    "content": "# Compiled Object files, Static and Dynamic libs (Shared Objects)\n*.o\n*.a\n*.so\n\n# Folders\n_obj\n_test\nbin\n\n# Architecture specific extensions/prefixes\n*.[568vq]\n[568vq].out\n\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n\n_testmain.go\n\n*.exe\n*.test\n*.prof\n*.test\n*.out\n*.txt\n/**/*.DS_Store\ncover.html\nREADME.html\n.idea\n"
  },
  {
    "path": ".golangci.yaml",
    "content": "version: \"2\"\nlinters:\n  default: all\n  disable:\n    - noinlineerr\n    - wsl_v5\n    - copyloopvar\n    - cyclop\n    - depguard\n    - dogsled\n    - dupl\n    - dupword\n    - err113\n    - errorlint\n    - exhaustive\n    - exhaustruct\n    - forbidigo\n    - forcetypeassert\n    - funlen\n    - gochecknoglobals\n    - gocognit\n    - goconst\n    - gocritic\n    - gocyclo\n    - godot\n    - gosec\n    - gosmopolitan\n    - interfacebloat\n    - intrange\n    - ireturn\n    - lll\n    - maintidx\n    - misspell\n    - mnd\n    - modernize\n    - nakedret\n    - nestif\n    - nilnil\n    - nlreturn\n    - nonamedreturns\n    - paralleltest\n    - perfsprint\n    - prealloc\n    - recvcheck\n    - revive\n    - staticcheck\n    - tagalign\n    - tagliatelle\n    - testpackage\n    - thelper\n    - tparallel\n    - unparam\n    - varnamelen\n    - wrapcheck\n    - wsl\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Dean Karn\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "MAINTAINERS.md",
    "content": "## Maintainers Guide\n\n### Semantic Versioning\nSemantic versioning as defined [here](https://semver.org) must be strictly adhered to.\n\n### External Dependencies\nAny new external dependencies MUST:\n- Have a compatible LICENSE present.\n- Be actively maintained.\n- Be approved by @go-playground/admins\n\n### PR Merge Requirements\n- Up-to-date branch.\n- Passing tests and linting.\n- CODEOWNERS approval.\n- Tests that cover both the Happy and Unhappy paths."
  },
  {
    "path": "Makefile",
    "content": "GOCMD=go\n\nlinters-install:\n\t@golangci-lint --version >/dev/null 2>&1 || { \\\n\t\techo \"installing linting tools...\"; \\\n\t\tcurl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s v2.0.2; \\\n\t}\n\nlint: linters-install\n\tgolangci-lint run\n\ntest:\n\t$(GOCMD) test -cover -race ./...\n\nbench:\n\t$(GOCMD) test -run=NONE -bench=. -benchmem ./...\n\n.PHONY: test lint linters-install\n"
  },
  {
    "path": "README.md",
    "content": "Package validator\n=================\n<img align=\"right\" src=\"logo.png\">[![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/go-playground/validator)](https://github.com/go-playground/validator/releases)\n[![Build Status](https://github.com/go-playground/validator/actions/workflows/workflow.yml/badge.svg)](https://github.com/go-playground/validator/actions)\n[![Coverage Status](https://coveralls.io/repos/go-playground/validator/badge.svg?branch=master&service=github)](https://coveralls.io/github/go-playground/validator?branch=master)\n[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator)\n[![GoDoc](https://godoc.org/github.com/go-playground/validator?status.svg)](https://pkg.go.dev/github.com/go-playground/validator/v10)\n![License](https://img.shields.io/dub/l/vibe-d.svg)\n\nPackage validator implements value validations for structs and individual fields based on tags.\n\nIt has the following **unique** features:\n\n-   Cross Field and Cross Struct validations by using validation tags or custom validators.\n-   Slice, Array and Map diving, which allows any or all levels of a multidimensional field to be validated.\n-   Ability to dive into both map keys and values for validation\n-   Handles type interface by determining it's underlying type prior to validation.\n-   Handles custom field types such as sql driver [Valuer](https://golang.org/src/database/sql/driver/types.go?s=1210:1293#L29) and the [Valuer interface](https://github.com/go-playground/validator/blob/master/_examples/valuer/main.go)\n-   Alias validation tags, which allows for mapping of several validations to a single tag for easier defining of validations on structs\n-   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\n-   Customizable i18n aware error messages.\n-   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)\n\nA Call for Maintainers\n----------------------\n\nPlease read the discussion started [here](https://github.com/go-playground/validator/discussions/1330) if you are interested in contributing/helping maintain this package.\n\nInstallation\n------------\n\nUse go get.\n\n\tgo get github.com/go-playground/validator/v10\n\nThen import the validator package into your own code.\n\n\timport \"github.com/go-playground/validator/v10\"\n\nError Return Value\n-------\n\nValidation functions return type error\n\nThey return type error to avoid the issue discussed in the following, where err is always != nil:\n\n* http://stackoverflow.com/a/29138676/3158232\n* https://github.com/go-playground/validator/issues/134\n\nValidator 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:\n\n```go\nerr := validate.Struct(mystruct)\nvalidationErrors := err.(validator.ValidationErrors)\n ```\n\nUsage and documentation\n------\n\nPlease see https://pkg.go.dev/github.com/go-playground/validator/v10 for detailed usage docs.\n\n##### Examples:\n\n- [Simple](https://github.com/go-playground/validator/blob/master/_examples/simple/main.go)\n- [Custom Field Types](https://github.com/go-playground/validator/blob/master/_examples/custom/main.go)\n- [Struct Level](https://github.com/go-playground/validator/blob/master/_examples/struct-level/main.go)\n- [Translations & Custom Errors](https://github.com/go-playground/validator/blob/master/_examples/translations/main.go)\n- [Gin upgrade and/or override validator](https://github.com/go-playground/validator/tree/v9/_examples/gin-upgrading-overriding)\n- [wash - an example application putting it all together](https://github.com/bluesuncorp/wash)\n\nBaked-in Validations\n------\n\n### Special Notes:\n- 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.\n```go\nvalidate := validator.New(validator.WithRequiredStructEnabled())\n```\n\n### Fields:\n\n| Tag | Description |\n| - | - |\n| eqcsfield | Field Equals Another Field (relative)|\n| eqfield | Field Equals Another Field |\n| fieldcontains | Check the indicated characters are present in the Field |\n| fieldexcludes | Check the indicated characters are not present in the field |\n| gtcsfield | Field Greater Than Another Relative Field |\n| gtecsfield | Field Greater Than or Equal To Another Relative Field |\n| gtefield | Field Greater Than or Equal To Another Field |\n| gtfield | Field Greater Than Another Field |\n| ltcsfield | Less Than Another Relative Field |\n| ltecsfield | Less Than or Equal To Another Relative Field |\n| ltefield | Less Than or Equal To Another Field |\n| ltfield | Less Than Another Field |\n| necsfield | Field Does Not Equal Another Field (relative) |\n| nefield | Field Does Not Equal Another Field |\n\n### Network:\n\n| Tag | Description |\n| - | - |\n| cidr | Classless Inter-Domain Routing CIDR |\n| cidrv4 | Classless Inter-Domain Routing CIDRv4 |\n| cidrv6 | Classless Inter-Domain Routing CIDRv6 |\n| datauri | Data URL |\n| fqdn | Full Qualified Domain Name (FQDN) |\n| hostname | Hostname RFC 952 |\n| hostname_rfc1123 | Hostname RFC 1123 |\n| hostname_port | HostPort |\n| port | Port number |\n| ip | Internet Protocol Address IP |\n| ip4_addr | Internet Protocol Address IPv4 |\n| ip6_addr | Internet Protocol Address IPv6 |\n| ip_addr | Internet Protocol Address IP |\n| ipv4 | Internet Protocol Address IPv4 |\n| ipv6 | Internet Protocol Address IPv6 |\n| mac | Media Access Control Address MAC |\n| tcp4_addr | Transmission Control Protocol Address TCPv4 |\n| tcp6_addr | Transmission Control Protocol Address TCPv6 |\n| tcp_addr | Transmission Control Protocol Address TCP |\n| udp4_addr | User Datagram Protocol Address UDPv4 |\n| udp6_addr | User Datagram Protocol Address UDPv6 |\n| udp_addr | User Datagram Protocol Address UDP |\n| unix_addr | Unix domain socket end point Address |\n| uds_exists | Unix domain socket exists (checks filesystem sockets and Linux abstract sockets) |\n| uri | URI String |\n| url | URL String |\n| http_url | HTTP(s) URL String |\n| https_url | HTTPS-only URL String |\n| url_encoded | URL Encoded |\n| urn_rfc2141 | Urn RFC 2141 String |\n\n### Strings:\n\n| Tag | Description |\n| - | - |\n| alpha | Alpha Only |\n| alphaspace | Alpha Space |\n| alphanum | Alphanumeric |\n| alphanumspace | Alphanumeric Space |\n| alphanumunicode | Alphanumeric Unicode |\n| alphaunicode | Alpha Unicode |\n| ascii | ASCII |\n| boolean | Boolean |\n| contains | Contains |\n| containsany | Contains Any |\n| containsrune | Contains Rune |\n| endsnotwith | Ends Not With |\n| endswith | Ends With |\n| excludes | Excludes |\n| excludesall | Excludes All |\n| excludesrune | Excludes Rune |\n| lowercase | Lowercase |\n| multibyte | Multi-Byte Characters |\n| number | Number |\n| numeric | Numeric |\n| printascii | Printable ASCII |\n| startsnotwith | Starts Not With |\n| startswith | Starts With |\n| uppercase | Uppercase |\n\n### Format:\n| Tag | Description |\n| - | - |\n| base64 | Base64 String |\n| base64url | Base64URL String |\n| base64rawurl | Base64RawURL String |\n| bic_iso_9362_2014 | Business Identifier Code (ISO 9362:2014) |\n| bic | Business Identifier Code (ISO 9362:2022) |\n| bcp47_language_tag | Language tag (BCP 47) |\n| btc_addr | Bitcoin Address |\n| btc_addr_bech32 | Bitcoin Bech32 Address (segwit) |\n| credit_card | Credit Card Number |\n| mongodb | MongoDB ObjectID |\n| mongodb_connection_string | MongoDB Connection String |\n| cron | Cron |\n| spicedb | SpiceDb ObjectID/Permission/Type |\n| datetime | Datetime |\n| e164 | e164 formatted phone number |\n| ein | U.S. Employer Identification Number |\n| email | E-mail String\n| eth_addr | Ethereum Address |\n| hexadecimal | Hexadecimal String |\n| hexcolor | Hexcolor String |\n| hsl | HSL String |\n| hsla | HSLA String |\n| cmyk | CMYK String |\n| html | HTML Tags |\n| html_encoded | HTML Encoded |\n| isbn | International Standard Book Number |\n| isbn10 | International Standard Book Number 10 |\n| isbn13 | International Standard Book Number 13 |\n| issn | International Standard Serial Number |\n| iso3166_1_alpha2 | Two-letter country code (ISO 3166-1 alpha-2) |\n| iso3166_1_alpha3 | Three-letter country code (ISO 3166-1 alpha-3) |\n| iso3166_1_alpha_numeric | Numeric country code (ISO 3166-1 numeric) |\n| iso3166_2 | Country subdivision code (ISO 3166-2) |\n| iso4217 | Currency code (ISO 4217) |\n| json | JSON |\n| jwt | JSON Web Token (JWT) |\n| latitude | Latitude |\n| longitude | Longitude |\n| luhn_checksum | Luhn Algorithm Checksum (for strings and (u)int) |\n| postcode_iso3166_alpha2 | Postcode |\n| postcode_iso3166_alpha2_field | Postcode |\n| rgb | RGB String |\n| rgba | RGBA String |\n| ssn | Social Security Number SSN |\n| timezone | Timezone |\n| uuid | Universally Unique Identifier UUID |\n| uuid3 | Universally Unique Identifier UUID v3 |\n| uuid3_rfc4122 | Universally Unique Identifier UUID v3 RFC4122 |\n| uuid4 | Universally Unique Identifier UUID v4 |\n| uuid4_rfc4122 | Universally Unique Identifier UUID v4 RFC4122 |\n| uuid5 | Universally Unique Identifier UUID v5 |\n| uuid5_rfc4122 | Universally Unique Identifier UUID v5 RFC4122 |\n| uuid_rfc4122 | Universally Unique Identifier UUID RFC4122 |\n| md4 | MD4 hash |\n| md5 | MD5 hash |\n| sha256 | SHA256 hash |\n| sha384 | SHA384 hash |\n| sha512 | SHA512 hash |\n| ripemd128 | RIPEMD-128 hash |\n| ripemd128 | RIPEMD-160 hash |\n| tiger128 | TIGER128 hash |\n| tiger160 | TIGER160 hash |\n| tiger192 | TIGER192 hash |\n| semver | Semantic Versioning 2.0.0 |\n| ulid | Universally Unique Lexicographically Sortable Identifier ULID |\n| cve | Common Vulnerabilities and Exposures Identifier (CVE id) |\n\n### Comparisons:\n| Tag | Description |\n| - | - |\n| eq | Equals |\n| eq_ignore_case | Equals ignoring case |\n| gt | Greater than|\n| gte | Greater than or equal |\n| lt | Less Than |\n| lte | Less Than or Equal |\n| ne | Not Equal |\n| ne_ignore_case | Not Equal ignoring case |\n\n### Other:\n| Tag | Description |\n| - | - |\n| dir | Existing Directory |\n| dirpath | Directory Path |\n| file | Existing File |\n| filepath | File Path |\n| image | Image |\n| isdefault | Is Default |\n| len | Length |\n| max | Maximum |\n| min | Minimum |\n| oneof | One Of |\n| required | Required |\n| required_if | Required If |\n| required_unless | Required Unless |\n| required_with | Required With |\n| required_with_all | Required With All |\n| required_without | Required Without |\n| required_without_all | Required Without All |\n| excluded_if | Excluded If |\n| excluded_unless | Excluded Unless |\n| excluded_with | Excluded With |\n| excluded_with_all | Excluded With All |\n| excluded_without | Excluded Without |\n| excluded_without_all | Excluded Without All |\n| unique | Unique |\n| validateFn | Verify if the method `Validate() error` does not return an error (or any specified method) |\n\n\n#### Aliases:\n| Tag | Description |\n| - | - |\n| iscolor | hexcolor\\|rgb\\|rgba\\|hsl\\|hsla\\|cmyk |\n| country_code | iso3166_1_alpha2\\|iso3166_1_alpha3\\|iso3166_1_alpha_numeric |\n\nBenchmarks\n------\n###### Run on MacBook Pro Max M3\n```go\ngo version go1.23.3 darwin/arm64\ngoos: darwin\ngoarch: arm64\ncpu: Apple M3 Max\npkg: github.com/go-playground/validator/v10\nBenchmarkFieldSuccess-16                                                42461943                27.88 ns/op            0 B/op          0 allocs/op\nBenchmarkFieldSuccessParallel-16                                        486632887                2.289 ns/op           0 B/op          0 allocs/op\nBenchmarkFieldFailure-16                                                 9566167               121.3 ns/op           200 B/op          4 allocs/op\nBenchmarkFieldFailureParallel-16                                        17551471                83.68 ns/op          200 B/op          4 allocs/op\nBenchmarkFieldArrayDiveSuccess-16                                        7602306               155.6 ns/op            97 B/op          5 allocs/op\nBenchmarkFieldArrayDiveSuccessParallel-16                               20664610                59.80 ns/op           97 B/op          5 allocs/op\nBenchmarkFieldArrayDiveFailure-16                                        4659756               252.9 ns/op           301 B/op         10 allocs/op\nBenchmarkFieldArrayDiveFailureParallel-16                                8010116               152.9 ns/op           301 B/op         10 allocs/op\nBenchmarkFieldMapDiveSuccess-16                                          2834575               421.2 ns/op           288 B/op         14 allocs/op\nBenchmarkFieldMapDiveSuccessParallel-16                                  7179700               171.8 ns/op           288 B/op         14 allocs/op\nBenchmarkFieldMapDiveFailure-16                                          3081728               384.4 ns/op           376 B/op         13 allocs/op\nBenchmarkFieldMapDiveFailureParallel-16                                  6058137               204.0 ns/op           377 B/op         13 allocs/op\nBenchmarkFieldMapDiveWithKeysSuccess-16                                  2544975               464.8 ns/op           288 B/op         14 allocs/op\nBenchmarkFieldMapDiveWithKeysSuccessParallel-16                          6661954               181.4 ns/op           288 B/op         14 allocs/op\nBenchmarkFieldMapDiveWithKeysFailure-16                                  2435484               490.7 ns/op           553 B/op         16 allocs/op\nBenchmarkFieldMapDiveWithKeysFailureParallel-16                          4249617               282.0 ns/op           554 B/op         16 allocs/op\nBenchmarkFieldCustomTypeSuccess-16                                      14943525                77.35 ns/op           32 B/op          2 allocs/op\nBenchmarkFieldCustomTypeSuccessParallel-16                              64051954                20.61 ns/op           32 B/op          2 allocs/op\nBenchmarkFieldCustomTypeFailure-16                                      10721384               107.1 ns/op           184 B/op          3 allocs/op\nBenchmarkFieldCustomTypeFailureParallel-16                              18714495                69.77 ns/op          184 B/op          3 allocs/op\nBenchmarkFieldOrTagSuccess-16                                            4063124               294.3 ns/op            16 B/op          1 allocs/op\nBenchmarkFieldOrTagSuccessParallel-16                                   31903756                41.22 ns/op           18 B/op          1 allocs/op\nBenchmarkFieldOrTagFailure-16                                            7748558               146.8 ns/op           216 B/op          5 allocs/op\nBenchmarkFieldOrTagFailureParallel-16                                   13139854                92.05 ns/op          216 B/op          5 allocs/op\nBenchmarkStructLevelValidationSuccess-16                                16808389                70.25 ns/op           16 B/op          1 allocs/op\nBenchmarkStructLevelValidationSuccessParallel-16                        90686955                14.47 ns/op           16 B/op          1 allocs/op\nBenchmarkStructLevelValidationFailure-16                                 5818791               200.2 ns/op           264 B/op          7 allocs/op\nBenchmarkStructLevelValidationFailureParallel-16                        11115874               107.5 ns/op           264 B/op          7 allocs/op\nBenchmarkStructSimpleCustomTypeSuccess-16                                7764956               151.9 ns/op            32 B/op          2 allocs/op\nBenchmarkStructSimpleCustomTypeSuccessParallel-16                       52316265                30.37 ns/op           32 B/op          2 allocs/op\nBenchmarkStructSimpleCustomTypeFailure-16                                4195429               277.2 ns/op           416 B/op          9 allocs/op\nBenchmarkStructSimpleCustomTypeFailureParallel-16                        7305661               164.6 ns/op           432 B/op         10 allocs/op\nBenchmarkStructFilteredSuccess-16                                        6312625               186.1 ns/op           216 B/op          5 allocs/op\nBenchmarkStructFilteredSuccessParallel-16                               13684459                93.42 ns/op          216 B/op          5 allocs/op\nBenchmarkStructFilteredFailure-16                                        6751482               171.2 ns/op           216 B/op          5 allocs/op\nBenchmarkStructFilteredFailureParallel-16                               14146070                86.93 ns/op          216 B/op          5 allocs/op\nBenchmarkStructPartialSuccess-16                                         6544448               177.3 ns/op           224 B/op          4 allocs/op\nBenchmarkStructPartialSuccessParallel-16                                13951946                88.73 ns/op          224 B/op          4 allocs/op\nBenchmarkStructPartialFailure-16                                         4075833               287.5 ns/op           440 B/op          9 allocs/op\nBenchmarkStructPartialFailureParallel-16                                 7490805               161.3 ns/op           440 B/op          9 allocs/op\nBenchmarkStructExceptSuccess-16                                          4107187               281.4 ns/op           424 B/op          8 allocs/op\nBenchmarkStructExceptSuccessParallel-16                                 15979173                80.86 ns/op          208 B/op          3 allocs/op\nBenchmarkStructExceptFailure-16                                          4434372               264.3 ns/op           424 B/op          8 allocs/op\nBenchmarkStructExceptFailureParallel-16                                  8081367               154.1 ns/op           424 B/op          8 allocs/op\nBenchmarkStructSimpleCrossFieldSuccess-16                                6459542               183.4 ns/op            56 B/op          3 allocs/op\nBenchmarkStructSimpleCrossFieldSuccessParallel-16                       41013781                37.95 ns/op           56 B/op          3 allocs/op\nBenchmarkStructSimpleCrossFieldFailure-16                                4034998               292.1 ns/op           272 B/op          8 allocs/op\nBenchmarkStructSimpleCrossFieldFailureParallel-16                       11348446               115.3 ns/op           272 B/op          8 allocs/op\nBenchmarkStructSimpleCrossStructCrossFieldSuccess-16                     4448528               267.7 ns/op            64 B/op          4 allocs/op\nBenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-16            26813619                48.33 ns/op           64 B/op          4 allocs/op\nBenchmarkStructSimpleCrossStructCrossFieldFailure-16                     3090646               384.5 ns/op           288 B/op          9 allocs/op\nBenchmarkStructSimpleCrossStructCrossFieldFailureParallel-16             9870906               129.5 ns/op           288 B/op          9 allocs/op\nBenchmarkStructSimpleSuccess-16                                         10675562               109.5 ns/op             0 B/op          0 allocs/op\nBenchmarkStructSimpleSuccessParallel-16                                 131159784                8.932 ns/op           0 B/op          0 allocs/op\nBenchmarkStructSimpleFailure-16                                          4094979               286.6 ns/op           416 B/op          9 allocs/op\nBenchmarkStructSimpleFailureParallel-16                                  7606663               157.9 ns/op           416 B/op          9 allocs/op\nBenchmarkStructComplexSuccess-16                                         2073470               576.0 ns/op           224 B/op          5 allocs/op\nBenchmarkStructComplexSuccessParallel-16                                 7821831               161.3 ns/op           224 B/op          5 allocs/op\nBenchmarkStructComplexFailure-16                                          576358              2001 ns/op            3042 B/op         48 allocs/op\nBenchmarkStructComplexFailureParallel-16                                 1000000              1171 ns/op            3041 B/op         48 allocs/op\nBenchmarkOneof-16                                                       22503973                52.82 ns/op            0 B/op          0 allocs/op\nBenchmarkOneofParallel-16                                                8538474               140.4 ns/op             0 B/op          0 allocs/op\n```\n\nComplementary Software\n----------------------\n\nHere is a list of software that complements using this library either pre or post validation.\n\n* [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.\n* [mold](https://github.com/go-playground/mold) - A general library to help modify or set data within data structures and other objects\n\nHow to Contribute\n------\n\nMake a pull request...\n\nMaintenance and support for SDK major versions\n----------------------------------------------\n\nSee prior discussion [here](https://github.com/go-playground/validator/discussions/1342) for more details.\n\nThis package is aligned with the [Go release policy](https://go.dev/doc/devel/release) in that support is guaranteed for \nthe two most recent major versions.\n\nThis does not mean the package will not work with older versions of Go, only that we reserve the right to increase the \nMSGV(Minimum Supported Go Version) when the need arises to address Security issues/patches, OS issues & support or newly \nintroduced functionality that would greatly benefit the maintenance and/or usage of this package.\n\nIf and when the MSGV is increased it will be done so in a minimum of a `Minor` release bump.\n\nLicense\n-------\nDistributed under MIT License, please see license file within the code for more details.\n\nMaintainers\n-----------\nThis project has grown large enough that more than one person is required to properly support the community.\nIf you are interested in becoming a maintainer please reach out to me https://github.com/deankarn\n"
  },
  {
    "path": "_examples/custom/main.go",
    "content": "package main\n\nimport (\n\t\"database/sql\"\n\t\"database/sql/driver\"\n\t\"fmt\"\n\t\"reflect\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// DbBackedUser User struct\ntype DbBackedUser struct {\n\tName sql.NullString `validate:\"required\"`\n\tAge  sql.NullInt64  `validate:\"required\"`\n}\n\n// use a single instance of Validate, it caches struct info\nvar validate *validator.Validate\n\nfunc main() {\n\n\tvalidate = validator.New()\n\n\t// register all sql.Null* types to use the ValidateValuer CustomTypeFunc\n\tvalidate.RegisterCustomTypeFunc(ValidateValuer, sql.NullString{}, sql.NullInt64{}, sql.NullBool{}, sql.NullFloat64{})\n\n\t// build object for validation\n\tx := DbBackedUser{Name: sql.NullString{String: \"\", Valid: true}, Age: sql.NullInt64{Int64: 0, Valid: false}}\n\n\terr := validate.Struct(x)\n\n\tif err != nil {\n\t\tfmt.Printf(\"Err(s):\\n%+v\\n\", err)\n\t}\n}\n\n// ValidateValuer implements validator.CustomTypeFunc\nfunc ValidateValuer(field reflect.Value) interface{} {\n\n\tif valuer, ok := field.Interface().(driver.Valuer); ok {\n\n\t\tval, err := valuer.Value()\n\t\tif err == nil {\n\t\t\treturn val\n\t\t}\n\t\t// handle the error how you want\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "_examples/custom-validation/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// MyStruct ..\ntype MyStruct struct {\n\tString string `validate:\"is-awesome\"`\n}\n\n// use a single instance of Validate, it caches struct info\nvar validate *validator.Validate\n\nfunc main() {\n\n\tvalidate = validator.New()\n\tvalidate.RegisterValidation(\"is-awesome\", ValidateMyVal)\n\n\ts := MyStruct{String: \"awesome\"}\n\n\terr := validate.Struct(s)\n\tif err != nil {\n\t\tfmt.Printf(\"Err(s):\\n%+v\\n\", err)\n\t}\n\n\ts.String = \"not awesome\"\n\terr = validate.Struct(s)\n\tif err != nil {\n\t\tfmt.Printf(\"Err(s):\\n%+v\\n\", err)\n\t}\n}\n\n// ValidateMyVal implements validator.Func\nfunc ValidateMyVal(fl validator.FieldLevel) bool {\n\treturn fl.Field().String() == \"awesome\"\n}\n"
  },
  {
    "path": "_examples/dive/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// Test ...\ntype Test struct {\n\tArray []string          `validate:\"required,gt=0,dive,required\"`\n\tMap   map[string]string `validate:\"required,gt=0,dive,keys,keymax,endkeys,required,max=1000\"`\n}\n\n// use a single instance of Validate, it caches struct info\nvar validate *validator.Validate\n\nfunc main() {\n\n\tvalidate = validator.New()\n\n\t// registering alias so we can see the differences between\n\t// map key, value validation errors\n\tvalidate.RegisterAlias(\"keymax\", \"max=10\")\n\n\tvar test Test\n\n\tval(test)\n\n\ttest.Array = []string{\"\"}\n\ttest.Map = map[string]string{\"test > than 10\": \"\"}\n\tval(test)\n}\n\nfunc val(test Test) {\n\tfmt.Println(\"testing\")\n\terr := validate.Struct(test)\n\tfmt.Println(err)\n}\n"
  },
  {
    "path": "_examples/gin-upgrading-overriding/main.go",
    "content": "package main\n\nimport \"github.com/gin-gonic/gin/binding\"\n\nfunc main() {\n\n\tbinding.Validator = new(defaultValidator)\n\n\t// regular gin logic\n}\n"
  },
  {
    "path": "_examples/gin-upgrading-overriding/v8_to_v9.go",
    "content": "package main\n\nimport (\n\t\"reflect\"\n\t\"sync\"\n\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\ntype defaultValidator struct {\n\tonce     sync.Once\n\tvalidate *validator.Validate\n}\n\nvar _ binding.StructValidator = &defaultValidator{}\n\nfunc (v *defaultValidator) ValidateStruct(obj interface{}) error {\n\n\tif kindOfData(obj) == reflect.Struct {\n\n\t\tv.lazyinit()\n\n\t\tif err := v.validate.Struct(obj); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (v *defaultValidator) Engine() interface{} {\n\tv.lazyinit()\n\treturn v.validate\n}\n\nfunc (v *defaultValidator) lazyinit() {\n\tv.once.Do(func() {\n\t\tv.validate = validator.New()\n\t\tv.validate.SetTagName(\"binding\")\n\n\t\t// add any custom validations etc. here\n\t})\n}\n\nfunc kindOfData(data interface{}) reflect.Kind {\n\n\tvalue := reflect.ValueOf(data)\n\tvalueType := value.Kind()\n\n\tif valueType == reflect.Ptr {\n\t\tvalueType = value.Elem().Kind()\n\t}\n\treturn valueType\n}\n"
  },
  {
    "path": "_examples/http-transalations/main.go",
    "content": "package main\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/go-playground/locales/en\"\n\t\"github.com/go-playground/locales/zh\"\n\t\"github.com/go-playground/locales/zh_Hant_TW\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n\ten_translations \"github.com/go-playground/validator/v10/translations/en\"\n\tzh_translations \"github.com/go-playground/validator/v10/translations/zh\"\n\tzh_tw_translations \"github.com/go-playground/validator/v10/translations/zh_tw\"\n)\n\nvar uni *ut.UniversalTranslator\n\n// This example showcases how to use the Validator and UniversalTranslator with both Simplified and Traditional Chinese languages.\n// To run the example:\n// Step 1: go run _examples/http-transalations/main.go\n// Step 2 - Simplified Chinese: curl -d '{\"first_name\":\"foo\"}' -H \"Accept-Language: zh\" -H \"Content-Type: application/json\" -X POST http://localhost:8081/users\n// Step 3 - Traditional Chinese: curl -d '{\"first_name\":\"foo\"}' -H \"Accept-Language: zh-Hant-TW\" -H \"Content-Type: application/json\" -X POST http://localhost:8081/users\nfunc main() {\n\tvalidate := validator.New()\n\ten := en.New()\n\tuni = ut.New(en, en, zh.New(), zh_Hant_TW.New())\n\n\tvalidate = validator.New()\n\tenTrans, _ := uni.GetTranslator(\"en\")\n\ten_translations.RegisterDefaultTranslations(validate, enTrans)\n\tzhTrans, _ := uni.GetTranslator(\"zh\")\n\tzh_translations.RegisterDefaultTranslations(validate, zhTrans)\n\tzhHantTrans, _ := uni.GetTranslator(\"zh_Hant_TW\")\n\tzh_tw_translations.RegisterDefaultTranslations(validate, zhHantTrans)\n\n\ttype User struct {\n\t\tFirstName string `json:\"first_name\" validate:\"required\"`\n\t\tLastName  string `json:\"last_name\" validate:\"required\"`\n\t}\n\n\thttp.HandleFunc(\"/users\", func(w http.ResponseWriter, r *http.Request) {\n\t\t// ... fill user value\n\t\tvar user User\n\n\t\t// Header Accept-Language value is en or zh\n\t\ttrans, _ := uni.GetTranslator(strings.Replace(r.Header.Get(\"Accept-Language\"), \"-\", \"_\", -1))\n\t\tif err := validate.Struct(&user); err != nil {\n\t\t\tvar errs validator.ValidationErrors\n\t\t\tvar httpErrors []validator.ValidationErrorsTranslations\n\t\t\tif errors.As(err, &errs) {\n\t\t\t\thttpErrors = append(httpErrors, errs.Translate(trans))\n\t\t\t}\n\t\t\tr, _ := json.Marshal(httpErrors)\n\t\t\tw.Write(r)\n\t\t}\n\t})\n\n\thttp.ListenAndServe(\":8081\", nil)\n}\n"
  },
  {
    "path": "_examples/map-validation/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nvar validate *validator.Validate\n\nfunc main() {\n\tvalidate = validator.New()\n\n\tvalidateMap()\n\tvalidateNestedMap()\n}\n\nfunc validateMap() {\n\tuser := map[string]interface{}{\"name\": \"Arshiya Kiani\", \"email\": \"zytel3301@gmail.com\"}\n\n\t// Every rule will be applied to the item of the data that the offset of rule is pointing to.\n\t// So if you have a field \"email\": \"omitempty,required,email\", the validator will apply these\n\t// rules to offset of email in user data\n\trules := map[string]interface{}{\"name\": \"required,min=8,max=32\", \"email\": \"omitempty,required,email\"}\n\n\t// ValidateMap will return map[string]error.\n\t// The offset of every item in errs is the name of invalid field and the value\n\t// is the message of error. If there was no error, ValidateMap method will\n\t// return an EMPTY map of errors, not nil. If you want to check that\n\t// if there was an error or not, you must check the length of the return value\n\terrs := validate.ValidateMap(user, rules)\n\n\tif len(errs) > 0 {\n\t\tfmt.Println(errs)\n\t\t// The user is invalid\n\t}\n\n\t// The user is valid\n}\n\nfunc validateNestedMap() {\n\n\tdata := map[string]interface{}{\n\t\t\"name\":  \"Arshiya Kiani\",\n\t\t\"email\": \"zytel3301@gmail.com\",\n\t\t\"details\": map[string]interface{}{\n\t\t\t\"family_members\": map[string]interface{}{\n\t\t\t\t\"father_name\": \"Micheal\",\n\t\t\t\t\"mother_name\": \"Hannah\",\n\t\t\t},\n\t\t\t\"salary\": \"1000\",\n\t\t\t\"phones\": []map[string]interface{}{\n\t\t\t\t{\n\t\t\t\t\t\"number\": \"11-111-1111\",\n\t\t\t\t\t\"remark\": \"home\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"number\": \"22-222-2222\",\n\t\t\t\t\t\"remark\": \"work\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\t// Rules must be set as the structure as the data itself. If you want to dive into the\n\t// map, just declare its rules as a map\n\trules := map[string]interface{}{\n\t\t\"name\":  \"min=4,max=32\",\n\t\t\"email\": \"required,email\",\n\t\t\"details\": map[string]interface{}{\n\t\t\t\"family_members\": map[string]interface{}{\n\t\t\t\t\"father_name\": \"required,min=4,max=32\",\n\t\t\t\t\"mother_name\": \"required,min=4,max=32\",\n\t\t\t},\n\t\t\t\"salary\": \"number\",\n\t\t\t\"phones\": map[string]interface{}{\n\t\t\t\t\"number\": \"required,min=4,max=32\",\n\t\t\t\t\"remark\": \"required,min=1,max=32\",\n\t\t\t},\n\t\t},\n\t}\n\n\tif len(validate.ValidateMap(data, rules)) == 0 {\n\t\t// Data is valid\n\t}\n\n\t// Data is invalid\n}\n"
  },
  {
    "path": "_examples/simple/main.go",
    "content": "package main\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// User contains user information\ntype User struct {\n\tFirstName      string     `validate:\"required\"`\n\tLastName       string     `validate:\"required\"`\n\tAge            uint8      `validate:\"gte=0,lte=130\"`\n\tEmail          string     `validate:\"required,email\"`\n\tGender         string     `validate:\"oneof=male female prefer_not_to\"`\n\tFavouriteColor string     `validate:\"iscolor\"`                // alias for 'hexcolor|rgb|rgba|hsl|hsla'\n\tAddresses      []*Address `validate:\"required,dive,required\"` // a person can have a home and cottage...\n}\n\n// Address houses a users address information\ntype Address struct {\n\tStreet string `validate:\"required\"`\n\tCity   string `validate:\"required\"`\n\tPlanet string `validate:\"required\"`\n\tPhone  string `validate:\"required\"`\n}\n\n// use a single instance of Validate, it caches struct info\nvar validate *validator.Validate\n\nfunc main() {\n\n\tvalidate = validator.New(validator.WithRequiredStructEnabled())\n\n\tvalidateStruct()\n\tvalidateVariable()\n}\n\nfunc validateStruct() {\n\n\taddress := &Address{\n\t\tStreet: \"Eavesdown Docks\",\n\t\tPlanet: \"Persphone\",\n\t\tPhone:  \"none\",\n\t}\n\n\tuser := &User{\n\t\tFirstName:      \"Badger\",\n\t\tLastName:       \"Smith\",\n\t\tAge:            135,\n\t\tGender:         \"male\",\n\t\tEmail:          \"Badger.Smith@gmail.com\",\n\t\tFavouriteColor: \"#000-\",\n\t\tAddresses:      []*Address{address},\n\t}\n\n\t// returns nil or ValidationErrors ( []FieldError )\n\terr := validate.Struct(user)\n\tif err != nil {\n\n\t\t// this check is only needed when your code could produce\n\t\t// an invalid value for validation such as interface with nil\n\t\t// value most including myself do not usually have code like this.\n\t\tvar invalidValidationError *validator.InvalidValidationError\n\t\tif errors.As(err, &invalidValidationError) {\n\t\t\tfmt.Println(err)\n\t\t\treturn\n\t\t}\n\n\t\tvar validateErrs validator.ValidationErrors\n\t\tif errors.As(err, &validateErrs) {\n\t\t\tfor _, e := range validateErrs {\n\t\t\t\tfmt.Println(e.Namespace())\n\t\t\t\tfmt.Println(e.Field())\n\t\t\t\tfmt.Println(e.StructNamespace())\n\t\t\t\tfmt.Println(e.StructField())\n\t\t\t\tfmt.Println(e.Tag())\n\t\t\t\tfmt.Println(e.ActualTag())\n\t\t\t\tfmt.Println(e.Kind())\n\t\t\t\tfmt.Println(e.Type())\n\t\t\t\tfmt.Println(e.Value())\n\t\t\t\tfmt.Println(e.Param())\n\t\t\t\tfmt.Println()\n\t\t\t}\n\t\t}\n\n\t\t// from here you can create your own error messages in whatever language you wish\n\t\treturn\n\t}\n\n\t// save user to database\n}\n\nfunc validateVariable() {\n\n\tmyEmail := \"joeybloggs.gmail.com\"\n\n\terrs := validate.Var(myEmail, \"required,email\")\n\n\tif errs != nil {\n\t\tfmt.Println(errs) // output: Key: \"\" Error:Field validation for \"\" failed on the \"email\" tag\n\t\treturn\n\t}\n\n\t// email ok, move on\n}\n"
  },
  {
    "path": "_examples/struct-level/main.go",
    "content": "package main\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\ntype validationError struct {\n\tNamespace       string `json:\"namespace\"` // can differ when a custom TagNameFunc is registered or\n\tField           string `json:\"field\"`     // by passing alt name to ReportError like below\n\tStructNamespace string `json:\"structNamespace\"`\n\tStructField     string `json:\"structField\"`\n\tTag             string `json:\"tag\"`\n\tActualTag       string `json:\"actualTag\"`\n\tKind            string `json:\"kind\"`\n\tType            string `json:\"type\"`\n\tValue           string `json:\"value\"`\n\tParam           string `json:\"param\"`\n\tMessage         string `json:\"message\"`\n}\n\ntype Gender uint\n\nconst (\n\tMale Gender = iota + 1\n\tFemale\n\tIntersex\n)\n\nfunc (gender Gender) String() string {\n\tterms := []string{\"Male\", \"Female\", \"Intersex\"}\n\tif gender < Male || gender > Intersex {\n\t\treturn \"unknown\"\n\t}\n\treturn terms[gender]\n}\n\n// User contains user information\ntype User struct {\n\tFirstName      string     `json:\"fname\"`\n\tLastName       string     `json:\"lname\"`\n\tAge            uint8      `validate:\"gte=0,lte=130\"`\n\tEmail          string     `json:\"e-mail\" validate:\"required,email\"`\n\tFavouriteColor string     `validate:\"hexcolor|rgb|rgba\"`\n\tAddresses      []*Address `validate:\"required,dive,required\"` // a person can have a home and cottage...\n\tGender         Gender     `json:\"gender\" validate:\"required,gender_custom_validation\"`\n}\n\n// Address houses a users address information\ntype Address struct {\n\tStreet string `validate:\"required\"`\n\tCity   string `validate:\"required\"`\n\tPlanet string `validate:\"required\"`\n\tPhone  string `validate:\"required\"`\n}\n\n// use a single instance of Validate, it caches struct info\nvar validate *validator.Validate\n\nfunc main() {\n\n\tvalidate = validator.New()\n\n\t// register function to get tag name from json tags.\n\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\t\treturn name\n\t})\n\n\t// register validation for 'User'\n\t// NOTE: only have to register a non-pointer type for 'User', validator\n\t// internally dereferences during it's type checks.\n\tvalidate.RegisterStructValidation(UserStructLevelValidation, User{})\n\n\t// register a custom validation for user genre on a line\n\t// validates that an enum is within the interval\n\terr := validate.RegisterValidation(\"gender_custom_validation\", func(fl validator.FieldLevel) bool {\n\t\tvalue := fl.Field().Interface().(Gender)\n\t\treturn value.String() != \"unknown\"\n\t})\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\t// build 'User' info, normally posted data etc...\n\taddress := &Address{\n\t\tStreet: \"Eavesdown Docks\",\n\t\tPlanet: \"Persphone\",\n\t\tPhone:  \"none\",\n\t\tCity:   \"Unknown\",\n\t}\n\n\tuser := &User{\n\t\tFirstName:      \"\",\n\t\tLastName:       \"\",\n\t\tAge:            45,\n\t\tEmail:          \"Badger.Smith@gmail\",\n\t\tFavouriteColor: \"#000\",\n\t\tAddresses:      []*Address{address},\n\t}\n\n\t// returns InvalidValidationError for bad validation input, nil or ValidationErrors ( []FieldError )\n\terr = validate.Struct(user)\n\tif err != nil {\n\n\t\t// this check is only needed when your code could produce\n\t\t// an invalid value for validation such as interface with nil\n\t\t// value most including myself do not usually have code like this.\n\t\tvar invalidValidationError *validator.InvalidValidationError\n\t\tif errors.As(err, &invalidValidationError) {\n\t\t\tfmt.Println(err)\n\t\t\treturn\n\t\t}\n\n\t\tvar validateErrs validator.ValidationErrors\n\t\tif errors.As(err, &validateErrs) {\n\t\t\tfor _, err := range validateErrs {\n\t\t\t\te := validationError{\n\t\t\t\t\tNamespace:       err.Namespace(),\n\t\t\t\t\tField:           err.Field(),\n\t\t\t\t\tStructNamespace: err.StructNamespace(),\n\t\t\t\t\tStructField:     err.StructField(),\n\t\t\t\t\tTag:             err.Tag(),\n\t\t\t\t\tActualTag:       err.ActualTag(),\n\t\t\t\t\tKind:            fmt.Sprintf(\"%v\", err.Kind()),\n\t\t\t\t\tType:            fmt.Sprintf(\"%v\", err.Type()),\n\t\t\t\t\tValue:           fmt.Sprintf(\"%v\", err.Value()),\n\t\t\t\t\tParam:           err.Param(),\n\t\t\t\t\tMessage:         err.Error(),\n\t\t\t\t}\n\n\t\t\t\tindent, err := json.MarshalIndent(e, \"\", \"  \")\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Println(err)\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\n\t\t\t\tfmt.Println(string(indent))\n\t\t\t}\n\t\t}\n\n\t\t// from here you can create your own error messages in whatever language you wish\n\t\treturn\n\t}\n\n\t// save user to database\n}\n\n// UserStructLevelValidation contains custom struct level validations that don't always\n// make sense at the field validation level. For example, this function validates that either\n// FirstName or LastName exist; could have done that with a custom field validation but then\n// would have had to add it to both fields duplicating the logic + overhead, this way it's\n// only validated once.\n//\n// NOTE: you may ask why wouldn't I just do this outside of validator, because doing this way\n// hooks right into validator and you can combine with validation tags and still have a\n// common error output format.\nfunc UserStructLevelValidation(sl validator.StructLevel) {\n\n\tuser := sl.Current().Interface().(User)\n\n\tif len(user.FirstName) == 0 && len(user.LastName) == 0 {\n\t\tsl.ReportError(user.FirstName, \"fname\", \"FirstName\", \"fnameorlname\", \"\")\n\t\tsl.ReportError(user.LastName, \"lname\", \"LastName\", \"fnameorlname\", \"\")\n\t}\n\n\t// plus can do more, even with different tag than \"fnameorlname\"\n}\n"
  },
  {
    "path": "_examples/struct-map-rules-validation/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\ntype Data struct {\n\tName    string\n\tEmail   string\n\tDetails *Details\n}\n\ntype Details struct {\n\tFamilyMembers *FamilyMembers\n\tSalary        string\n}\n\ntype FamilyMembers struct {\n\tFatherName string\n\tMotherName string\n}\n\ntype Data2 struct {\n\tName string\n\tAge  uint32\n}\n\nvar validate = validator.New()\n\nfunc main() {\n\tvalidateStruct()\n\t// output\n\t// Key: 'Data2.Name' Error:Field validation for 'Name' failed on the 'min' tag\n\t// Key: 'Data2.Age' Error:Field validation for 'Age' failed on the 'max' tag\n\n\tvalidateStructNested()\n\t// output\n\t// Key: 'Data.Name' Error:Field validation for 'Name' failed on the 'max' tag\n\t// Key: 'Data.Details.FamilyMembers' Error:Field validation for 'FamilyMembers' failed on the 'required' tag\n}\n\nfunc validateStruct() {\n\tdata := Data2{\n\t\tName: \"leo\",\n\t\tAge:  1000,\n\t}\n\n\trules := map[string]string{\n\t\t\"Name\": \"min=4,max=6\",\n\t\t\"Age\":  \"min=4,max=6\",\n\t}\n\n\tvalidate.RegisterStructValidationMapRules(rules, Data2{})\n\n\terr := validate.Struct(data)\n\tfmt.Println(err)\n\tfmt.Println()\n}\n\nfunc validateStructNested() {\n\tdata := Data{\n\t\tName:  \"11sdfddd111\",\n\t\tEmail: \"zytel3301@mail.com\",\n\t\tDetails: &Details{\n\t\t\tSalary: \"1000\",\n\t\t},\n\t}\n\n\trules1 := map[string]string{\n\t\t\"Name\":    \"min=4,max=6\",\n\t\t\"Email\":   \"required,email\",\n\t\t\"Details\": \"required\",\n\t}\n\n\trules2 := map[string]string{\n\t\t\"Salary\":        \"number\",\n\t\t\"FamilyMembers\": \"required\",\n\t}\n\n\trules3 := map[string]string{\n\t\t\"FatherName\": \"required,min=4,max=32\",\n\t\t\"MotherName\": \"required,min=4,max=32\",\n\t}\n\n\tvalidate.RegisterStructValidationMapRules(rules1, Data{})\n\tvalidate.RegisterStructValidationMapRules(rules2, Details{})\n\tvalidate.RegisterStructValidationMapRules(rules3, FamilyMembers{})\n\terr := validate.Struct(data)\n\n\tfmt.Println(err)\n}\n"
  },
  {
    "path": "_examples/translations/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/go-playground/locales/en\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n\ten_translations \"github.com/go-playground/validator/v10/translations/en\"\n)\n\n// User contains user information\ntype User struct {\n\tFirstName      string     `validate:\"required\"`\n\tLastName       string     `validate:\"required\"`\n\tAge            uint8      `validate:\"gte=0,lte=130\"`\n\tEmail          string     `validate:\"required,email\"`\n\tFavouriteColor string     `validate:\"iscolor\"`                // alias for 'hexcolor|rgb|rgba|hsl|hsla'\n\tAddresses      []*Address `validate:\"required,dive,required\"` // a person can have a home and cottage...\n}\n\n// Address houses a users address information\ntype Address struct {\n\tStreet string `validate:\"required\"`\n\tCity   string `validate:\"required\"`\n\tPlanet string `validate:\"required\"`\n\tPhone  string `validate:\"required\"`\n}\n\n// use a single instance, it caches struct info\nvar (\n\tuni      *ut.UniversalTranslator\n\tvalidate *validator.Validate\n)\n\nfunc main() {\n\n\t// NOTE: omitting allot of error checking for brevity\n\n\ten := en.New()\n\tuni = ut.New(en, en)\n\n\t// this is usually know or extracted from http 'Accept-Language' header\n\t// also see uni.FindTranslator(...)\n\ttrans, _ := uni.GetTranslator(\"en\")\n\n\tvalidate = validator.New()\n\ten_translations.RegisterDefaultTranslations(validate, trans)\n\n\ttranslateAll(trans)\n\ttranslateIndividual(trans)\n\ttranslateOverride(trans) // yep you can specify your own in whatever locale you want!\n}\n\nfunc translateAll(trans ut.Translator) {\n\n\ttype User struct {\n\t\tUsername string `validate:\"required\"`\n\t\tTagline  string `validate:\"required,lt=10\"`\n\t\tTagline2 string `validate:\"required,gt=1\"`\n\t}\n\n\tuser := User{\n\t\tUsername: \"Joeybloggs\",\n\t\tTagline:  \"This tagline is way too long.\",\n\t\tTagline2: \"1\",\n\t}\n\n\terr := validate.Struct(user)\n\tif err != nil {\n\n\t\t// translate all error at once\n\t\terrs := err.(validator.ValidationErrors)\n\n\t\t// returns a map with key = namespace & value = translated error\n\t\t// NOTICE: 2 errors are returned and you'll see something surprising\n\t\t// translations are i18n aware!!!!\n\t\t// eg. '10 characters' vs '1 character'\n\t\tfmt.Println(errs.Translate(trans))\n\t}\n}\n\nfunc translateIndividual(trans ut.Translator) {\n\n\ttype User struct {\n\t\tUsername string `validate:\"required\"`\n\t}\n\n\tvar user User\n\n\terr := validate.Struct(user)\n\tif err != nil {\n\n\t\terrs := err.(validator.ValidationErrors)\n\n\t\tfor _, e := range errs {\n\t\t\t// can translate each error one at a time.\n\t\t\tfmt.Println(e.Translate(trans))\n\t\t}\n\t}\n}\n\nfunc translateOverride(trans ut.Translator) {\n\n\tvalidate.RegisterTranslation(\"required\", trans, func(ut ut.Translator) error {\n\t\treturn ut.Add(\"required\", \"{0} must have a value!\", true) // see universal-translator for details\n\t}, func(ut ut.Translator, fe validator.FieldError) string {\n\t\tt, _ := ut.T(\"required\", fe.Field())\n\n\t\treturn t\n\t})\n\n\ttype User struct {\n\t\tUsername string `validate:\"required\"`\n\t}\n\n\tvar user User\n\n\terr := validate.Struct(user)\n\tif err != nil {\n\n\t\terrs := err.(validator.ValidationErrors)\n\n\t\tfor _, e := range errs {\n\t\t\t// can translate each error one at a time.\n\t\t\tfmt.Println(e.Translate(trans))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "_examples/validate_fn/enum_enumer.go",
    "content": "// Code generated by \"enumer -type=Enum\"; DO NOT EDIT.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\nconst _EnumName = \"ZeroOneTwoThree\"\n\nvar _EnumIndex = [...]uint8{0, 4, 7, 10, 15}\n\nconst _EnumLowerName = \"zeroonetwothree\"\n\nfunc (i Enum) String() string {\n\tif i >= Enum(len(_EnumIndex)-1) {\n\t\treturn fmt.Sprintf(\"Enum(%d)\", i)\n\t}\n\treturn _EnumName[_EnumIndex[i]:_EnumIndex[i+1]]\n}\n\n// An \"invalid array index\" compiler error signifies that the constant values have changed.\n// Re-run the stringer command to generate them again.\nfunc _EnumNoOp() {\n\tvar x [1]struct{}\n\t_ = x[Zero-(0)]\n\t_ = x[One-(1)]\n\t_ = x[Two-(2)]\n\t_ = x[Three-(3)]\n}\n\nvar _EnumValues = []Enum{Zero, One, Two, Three}\n\nvar _EnumNameToValueMap = map[string]Enum{\n\t_EnumName[0:4]:        Zero,\n\t_EnumLowerName[0:4]:   Zero,\n\t_EnumName[4:7]:        One,\n\t_EnumLowerName[4:7]:   One,\n\t_EnumName[7:10]:       Two,\n\t_EnumLowerName[7:10]:  Two,\n\t_EnumName[10:15]:      Three,\n\t_EnumLowerName[10:15]: Three,\n}\n\nvar _EnumNames = []string{\n\t_EnumName[0:4],\n\t_EnumName[4:7],\n\t_EnumName[7:10],\n\t_EnumName[10:15],\n}\n\n// EnumString retrieves an enum value from the enum constants string name.\n// Throws an error if the param is not part of the enum.\nfunc EnumString(s string) (Enum, error) {\n\tif val, ok := _EnumNameToValueMap[s]; ok {\n\t\treturn val, nil\n\t}\n\n\tif val, ok := _EnumNameToValueMap[strings.ToLower(s)]; ok {\n\t\treturn val, nil\n\t}\n\treturn 0, fmt.Errorf(\"%s does not belong to Enum values\", s)\n}\n\n// EnumValues returns all values of the enum\nfunc EnumValues() []Enum {\n\treturn _EnumValues\n}\n\n// EnumStrings returns a slice of all String values of the enum\nfunc EnumStrings() []string {\n\tstrs := make([]string, len(_EnumNames))\n\tcopy(strs, _EnumNames)\n\treturn strs\n}\n\n// IsAEnum returns \"true\" if the value is listed in the enum definition. \"false\" otherwise\nfunc (i Enum) IsAEnum() bool {\n\tfor _, v := range _EnumValues {\n\t\tif i == v {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "_examples/validate_fn/go.mod",
    "content": "module github.com/peczenyj/validator/_examples/validate_fn\n\ngo 1.23.0\n\ntoolchain go1.24.4\n\nreplace github.com/go-playground/validator/v10 => ../../../validator\n\nrequire github.com/go-playground/validator/v10 v10.26.0\n\nrequire (\n\tgithub.com/gabriel-vasile/mimetype v1.4.8 // indirect\n\tgithub.com/go-playground/locales v0.14.1 // indirect\n\tgithub.com/go-playground/universal-translator v0.18.1 // indirect\n\tgithub.com/leodido/go-urn v1.4.0 // indirect\n\tgolang.org/x/crypto v0.36.0 // indirect\n\tgolang.org/x/net v0.38.0 // indirect\n\tgolang.org/x/sys v0.31.0 // indirect\n\tgolang.org/x/text v0.23.0 // indirect\n)\n"
  },
  {
    "path": "_examples/validate_fn/go.sum",
    "content": "github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=\ngithub.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=\ngithub.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=\ngithub.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=\ngithub.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=\ngithub.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=\ngithub.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=\ngithub.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=\ngithub.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngolang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=\ngolang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=\ngolang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=\ngolang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=\ngolang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=\ngolang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=\ngolang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=\ngolang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=\ngolang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=\ngolang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=\ngolang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=\ngolang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=\ngolang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=\ngolang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=\ngolang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=\ngolang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=\ngolang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=\ngolang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\n"
  },
  {
    "path": "_examples/validate_fn/main.go",
    "content": "package main\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\n//go:generate enumer -type=Enum\ntype Enum uint8\n\nconst (\n\tZero Enum = iota\n\tOne\n\tTwo\n\tThree\n)\n\nfunc (e *Enum) Validate() error {\n\tif e == nil {\n\t\treturn errors.New(\"can't be nil\")\n\t}\n\n\treturn nil\n}\n\ntype Struct struct {\n\tFoo *Enum `validate:\"validateFn\"`         // uses Validate() error by default\n\tBar Enum  `validate:\"validateFn=IsAEnum\"` // uses IsAEnum() bool provided by enumer\n}\n\nfunc main() {\n\tvalidate := validator.New()\n\n\tvar x Struct\n\n\tx.Bar = Enum(64)\n\n\tif err := validate.Struct(x); err != nil {\n\t\tfmt.Printf(\"Expected Err(s):\\n%+v\\n\", err)\n\t}\n\n\tx = Struct{\n\t\tFoo: new(Enum),\n\t\tBar: One,\n\t}\n\n\tif err := validate.Struct(x); err != nil {\n\t\tfmt.Printf(\"Unexpected Err(s):\\n%+v\\n\", err)\n\t}\n}\n"
  },
  {
    "path": "_examples/valuer/main.go",
    "content": "package main\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// Nullable wraps a generic value.\ntype Nullable[T any] struct {\n\tData T\n}\n\n// ValidatorValue returns the inner value that should be validated.\nfunc (n Nullable[T]) ValidatorValue() any {\n\treturn n.Data\n}\n\ntype Config struct {\n\tName string `validate:\"required\"`\n}\n\ntype Record struct {\n\tConfig Nullable[Config] `validate:\"required\"`\n}\n\n// use a single instance of Validate, it caches struct info\nvar validate *validator.Validate\n\nfunc main() {\n\tvalidate = validator.New()\n\n\t// valid case: ValidatorValue unwraps Config and Name passes required.\n\tvalid := Record{\n\t\tConfig: Nullable[Config]{\n\t\t\tData: Config{Name: \"validator\"},\n\t\t},\n\t}\n\terr := validate.Struct(valid)\n\tif err != nil {\n\t\tfmt.Printf(\"Err(s):\\n%+v\\n\", err)\n\t}\n\n\t// invalid case: Name is empty after unwrapping, so required fails on Config.Name.\n\tinvalid := Record{\n\t\tConfig: Nullable[Config]{},\n\t}\n\terr = validate.Struct(invalid)\n\tif err != nil {\n\t\tfmt.Printf(\"Err(s):\\n%+v\\n\", err)\n\t\tvar validationErrs validator.ValidationErrors\n\t\tif errors.As(err, &validationErrs) && len(validationErrs) > 0 {\n\t\t\tfmt.Printf(\"First error namespace: %s\\n\", validationErrs[0].Namespace())\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "baked_in.go",
    "content": "package validator\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"cmp\"\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"net\"\n\t\"net/mail\"\n\t\"net/url\"\n\t\"os\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"syscall\"\n\t\"time\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/crypto/sha3\"\n\t\"golang.org/x/text/language\"\n\n\t\"github.com/gabriel-vasile/mimetype\"\n\turn \"github.com/leodido/go-urn\"\n)\n\n// Func accepts a FieldLevel interface for all validation needs. The return\n// value should be true when validation succeeds.\ntype Func func(fl FieldLevel) bool\n\n// FuncCtx accepts a context.Context and FieldLevel interface for all\n// validation needs. The return value should be true when validation succeeds.\ntype FuncCtx func(ctx context.Context, fl FieldLevel) bool\n\n// wrapFunc wraps normal Func makes it compatible with FuncCtx\nfunc wrapFunc(fn Func) FuncCtx {\n\tif fn == nil {\n\t\treturn nil // be sure not to wrap a bad function.\n\t}\n\treturn func(ctx context.Context, fl FieldLevel) bool {\n\t\treturn fn(fl)\n\t}\n}\n\nvar (\n\trestrictedTags = map[string]struct{}{\n\t\tdiveTag:           {},\n\t\tkeysTag:           {},\n\t\tendKeysTag:        {},\n\t\tstructOnlyTag:     {},\n\t\tomitzero:          {},\n\t\tomitempty:         {},\n\t\tomitnil:           {},\n\t\tskipValidationTag: {},\n\t\tutf8HexComma:      {},\n\t\tutf8Pipe:          {},\n\t\tnoStructLevelTag:  {},\n\t\trequiredTag:       {},\n\t\tisdefault:         {},\n\t}\n\n\t// bakedInAliases is a default mapping of a single validation tag that\n\t// defines a common or complex set of validation(s) to simplify\n\t// adding validation to structs.\n\tbakedInAliases = map[string]string{\n\t\t\"iscolor\":         \"hexcolor|rgb|rgba|hsl|hsla|cmyk\",\n\t\t\"country_code\":    \"iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric\",\n\t\t\"eu_country_code\": \"iso3166_1_alpha2_eu|iso3166_1_alpha3_eu|iso3166_1_alpha_numeric_eu\",\n\t}\n\n\t// bakedInValidators is the default map of ValidationFunc\n\t// you can add, remove or even replace items to suite your needs,\n\t// or even disregard and use your own map if so desired.\n\tbakedInValidators = map[string]Func{\n\t\t\"required\":                      hasValue,\n\t\t\"required_if\":                   requiredIf,\n\t\t\"required_unless\":               requiredUnless,\n\t\t\"skip_unless\":                   skipUnless,\n\t\t\"required_with\":                 requiredWith,\n\t\t\"required_with_all\":             requiredWithAll,\n\t\t\"required_without\":              requiredWithout,\n\t\t\"required_without_all\":          requiredWithoutAll,\n\t\t\"excluded_if\":                   excludedIf,\n\t\t\"excluded_unless\":               excludedUnless,\n\t\t\"excluded_with\":                 excludedWith,\n\t\t\"excluded_with_all\":             excludedWithAll,\n\t\t\"excluded_without\":              excludedWithout,\n\t\t\"excluded_without_all\":          excludedWithoutAll,\n\t\t\"isdefault\":                     isDefault,\n\t\t\"len\":                           hasLengthOf,\n\t\t\"min\":                           hasMinOf,\n\t\t\"max\":                           hasMaxOf,\n\t\t\"eq\":                            isEq,\n\t\t\"eq_ignore_case\":                isEqIgnoreCase,\n\t\t\"ne\":                            isNe,\n\t\t\"ne_ignore_case\":                isNeIgnoreCase,\n\t\t\"lt\":                            isLt,\n\t\t\"lte\":                           isLte,\n\t\t\"gt\":                            isGt,\n\t\t\"gte\":                           isGte,\n\t\t\"eqfield\":                       isEqField,\n\t\t\"eqcsfield\":                     isEqCrossStructField,\n\t\t\"necsfield\":                     isNeCrossStructField,\n\t\t\"gtcsfield\":                     isGtCrossStructField,\n\t\t\"gtecsfield\":                    isGteCrossStructField,\n\t\t\"ltcsfield\":                     isLtCrossStructField,\n\t\t\"ltecsfield\":                    isLteCrossStructField,\n\t\t\"nefield\":                       isNeField,\n\t\t\"gtefield\":                      isGteField,\n\t\t\"gtfield\":                       isGtField,\n\t\t\"ltefield\":                      isLteField,\n\t\t\"ltfield\":                       isLtField,\n\t\t\"fieldcontains\":                 fieldContains,\n\t\t\"fieldexcludes\":                 fieldExcludes,\n\t\t\"alpha\":                         isAlpha,\n\t\t\"alphaspace\":                    isAlphaSpace,\n\t\t\"alphanum\":                      isAlphanum,\n\t\t\"alphanumspace\":                 isAlphaNumericSpace,\n\t\t\"alphaunicode\":                  isAlphaUnicode,\n\t\t\"alphanumunicode\":               isAlphanumUnicode,\n\t\t\"boolean\":                       isBoolean,\n\t\t\"numeric\":                       isNumeric,\n\t\t\"number\":                        isNumber,\n\t\t\"hexadecimal\":                   isHexadecimal,\n\t\t\"hexcolor\":                      isHEXColor,\n\t\t\"rgb\":                           isRGB,\n\t\t\"rgba\":                          isRGBA,\n\t\t\"hsl\":                           isHSL,\n\t\t\"hsla\":                          isHSLA,\n\t\t\"cmyk\":                          isCMYK,\n\t\t\"e164\":                          isE164,\n\t\t\"email\":                         isEmail,\n\t\t\"url\":                           isURL,\n\t\t\"http_url\":                      isHttpURL,\n\t\t\"https_url\":                     isHttpsURL,\n\t\t\"uri\":                           isURI,\n\t\t\"urn_rfc2141\":                   isUrnRFC2141, // RFC 2141\n\t\t\"file\":                          isFile,\n\t\t\"filepath\":                      isFilePath,\n\t\t\"base32\":                        isBase32,\n\t\t\"base64\":                        isBase64,\n\t\t\"base64url\":                     isBase64URL,\n\t\t\"base64rawurl\":                  isBase64RawURL,\n\t\t\"contains\":                      contains,\n\t\t\"containsany\":                   containsAny,\n\t\t\"containsrune\":                  containsRune,\n\t\t\"excludes\":                      excludes,\n\t\t\"excludesall\":                   excludesAll,\n\t\t\"excludesrune\":                  excludesRune,\n\t\t\"startswith\":                    startsWith,\n\t\t\"endswith\":                      endsWith,\n\t\t\"startsnotwith\":                 startsNotWith,\n\t\t\"endsnotwith\":                   endsNotWith,\n\t\t\"image\":                         isImage,\n\t\t\"isbn\":                          isISBN,\n\t\t\"isbn10\":                        isISBN10,\n\t\t\"isbn13\":                        isISBN13,\n\t\t\"issn\":                          isISSN,\n\t\t\"eth_addr\":                      isEthereumAddress,\n\t\t\"eth_addr_checksum\":             isEthereumAddressChecksum,\n\t\t\"btc_addr\":                      isBitcoinAddress,\n\t\t\"btc_addr_bech32\":               isBitcoinBech32Address,\n\t\t\"uuid\":                          isUUID,\n\t\t\"uuid3\":                         isUUID3,\n\t\t\"uuid4\":                         isUUID4,\n\t\t\"uuid5\":                         isUUID5,\n\t\t\"uuid_rfc4122\":                  isUUIDRFC4122,\n\t\t\"uuid3_rfc4122\":                 isUUID3RFC4122,\n\t\t\"uuid4_rfc4122\":                 isUUID4RFC4122,\n\t\t\"uuid5_rfc4122\":                 isUUID5RFC4122,\n\t\t\"ulid\":                          isULID,\n\t\t\"md4\":                           isMD4,\n\t\t\"md5\":                           isMD5,\n\t\t\"sha256\":                        isSHA256,\n\t\t\"sha384\":                        isSHA384,\n\t\t\"sha512\":                        isSHA512,\n\t\t\"ripemd128\":                     isRIPEMD128,\n\t\t\"ripemd160\":                     isRIPEMD160,\n\t\t\"tiger128\":                      isTIGER128,\n\t\t\"tiger160\":                      isTIGER160,\n\t\t\"tiger192\":                      isTIGER192,\n\t\t\"ascii\":                         isASCII,\n\t\t\"printascii\":                    isPrintableASCII,\n\t\t\"multibyte\":                     hasMultiByteCharacter,\n\t\t\"datauri\":                       isDataURI,\n\t\t\"latitude\":                      isLatitude,\n\t\t\"longitude\":                     isLongitude,\n\t\t\"ssn\":                           isSSN,\n\t\t\"ipv4\":                          isIPv4,\n\t\t\"ipv6\":                          isIPv6,\n\t\t\"ip\":                            isIP,\n\t\t\"cidrv4\":                        isCIDRv4,\n\t\t\"cidrv6\":                        isCIDRv6,\n\t\t\"cidr\":                          isCIDR,\n\t\t\"tcp4_addr\":                     isTCP4AddrResolvable,\n\t\t\"tcp6_addr\":                     isTCP6AddrResolvable,\n\t\t\"tcp_addr\":                      isTCPAddrResolvable,\n\t\t\"udp4_addr\":                     isUDP4AddrResolvable,\n\t\t\"udp6_addr\":                     isUDP6AddrResolvable,\n\t\t\"udp_addr\":                      isUDPAddrResolvable,\n\t\t\"ip4_addr\":                      isIP4AddrResolvable,\n\t\t\"ip6_addr\":                      isIP6AddrResolvable,\n\t\t\"ip_addr\":                       isIPAddrResolvable,\n\t\t\"unix_addr\":                     isUnixAddrResolvable,\n\t\t\"uds_exists\":                    isUnixDomainSocketExists,\n\t\t\"mac\":                           isMAC,\n\t\t\"hostname\":                      isHostnameRFC952,  // RFC 952\n\t\t\"hostname_rfc1123\":              isHostnameRFC1123, // RFC 1123\n\t\t\"fqdn\":                          isFQDN,\n\t\t\"unique\":                        isUnique,\n\t\t\"oneof\":                         isOneOf,\n\t\t\"oneofci\":                       isOneOfCI,\n\t\t\"html\":                          isHTML,\n\t\t\"html_encoded\":                  isHTMLEncoded,\n\t\t\"url_encoded\":                   isURLEncoded,\n\t\t\"dir\":                           isDir,\n\t\t\"dirpath\":                       isDirPath,\n\t\t\"json\":                          isJSON,\n\t\t\"jwt\":                           isJWT,\n\t\t\"hostname_port\":                 isHostnamePort,\n\t\t\"port\":                          isPort,\n\t\t\"lowercase\":                     isLowercase,\n\t\t\"uppercase\":                     isUppercase,\n\t\t\"datetime\":                      isDatetime,\n\t\t\"timezone\":                      isTimeZone,\n\t\t\"iso3166_1_alpha2\":              isIso3166Alpha2,\n\t\t\"iso3166_1_alpha2_eu\":           isIso3166Alpha2EU,\n\t\t\"iso3166_1_alpha3\":              isIso3166Alpha3,\n\t\t\"iso3166_1_alpha3_eu\":           isIso3166Alpha3EU,\n\t\t\"iso3166_1_alpha_numeric\":       isIso3166AlphaNumeric,\n\t\t\"iso3166_1_alpha_numeric_eu\":    isIso3166AlphaNumericEU,\n\t\t\"iso3166_2\":                     isIso31662,\n\t\t\"iso4217\":                       isIso4217,\n\t\t\"iso4217_numeric\":               isIso4217Numeric,\n\t\t\"bcp47_language_tag\":            isBCP47LanguageTag,\n\t\t\"postcode_iso3166_alpha2\":       isPostcodeByIso3166Alpha2,\n\t\t\"postcode_iso3166_alpha2_field\": isPostcodeByIso3166Alpha2Field,\n\t\t\"bic_iso_9362_2014\":             isIsoBic2014Format,\n\t\t\"bic\":                           isIsoBic2022Format,\n\t\t\"semver\":                        isSemverFormat,\n\t\t\"dns_rfc1035_label\":             isDnsRFC1035LabelFormat,\n\t\t\"credit_card\":                   isCreditCard,\n\t\t\"cve\":                           isCveFormat,\n\t\t\"luhn_checksum\":                 hasLuhnChecksum,\n\t\t\"mongodb\":                       isMongoDBObjectId,\n\t\t\"mongodb_connection_string\":     isMongoDBConnectionString,\n\t\t\"cron\":                          isCron,\n\t\t\"spicedb\":                       isSpiceDB,\n\t\t\"ein\":                           isEIN,\n\t\t\"validateFn\":                    isValidateFn,\n\t}\n)\n\nvar (\n\toneofValsCache       = map[string][]string{}\n\toneofValsCacheRWLock = sync.RWMutex{}\n)\n\nfunc parseOneOfParam2(s string) []string {\n\toneofValsCacheRWLock.RLock()\n\tvals, ok := oneofValsCache[s]\n\toneofValsCacheRWLock.RUnlock()\n\tif !ok {\n\t\toneofValsCacheRWLock.Lock()\n\t\tvals = splitParamsRegex().FindAllString(s, -1)\n\t\tfor i := 0; i < len(vals); i++ {\n\t\t\tvals[i] = strings.ReplaceAll(vals[i], \"'\", \"\")\n\t\t}\n\t\toneofValsCache[s] = vals\n\t\toneofValsCacheRWLock.Unlock()\n\t}\n\treturn vals\n}\n\nfunc isURLEncoded(fl FieldLevel) bool {\n\treturn uRLEncodedRegex().MatchString(fl.Field().String())\n}\n\nfunc isHTMLEncoded(fl FieldLevel) bool {\n\treturn hTMLEncodedRegex().MatchString(fl.Field().String())\n}\n\nfunc isHTML(fl FieldLevel) bool {\n\treturn hTMLRegex().MatchString(fl.Field().String())\n}\n\nfunc isOneOf(fl FieldLevel) bool {\n\tvals := parseOneOfParam2(fl.Param())\n\n\tfield := fl.Field()\n\n\tvar v string\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\tv = field.String()\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tv = strconv.FormatInt(field.Int(), 10)\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\tv = strconv.FormatUint(field.Uint(), 10)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n\t}\n\tfor i := 0; i < len(vals); i++ {\n\t\tif vals[i] == v {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// isOneOfCI is the validation function for validating if the current field's value is one of the provided string values (case insensitive).\nfunc isOneOfCI(fl FieldLevel) bool {\n\tvals := parseOneOfParam2(fl.Param())\n\tfield := fl.Field()\n\n\tif field.Kind() != reflect.String {\n\t\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n\t}\n\tv := field.String()\n\tfor _, val := range vals {\n\t\tif strings.EqualFold(val, v) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// isUnique is the validation function for validating if each array|slice|map value is unique\nfunc isUnique(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tparam := fl.Param()\n\n\t// sentinel used as map key for nil values\n\tvar nilKey = struct{}{}\n\n\tswitch field.Kind() {\n\tcase reflect.Slice, reflect.Array:\n\t\tseen := make(map[interface{}]struct{})\n\n\t\tfor i := 0; i < field.Len(); i++ {\n\t\t\telem := field.Index(i)\n\n\t\t\t// -------- unique (no param) --------\n\t\t\tif param == \"\" {\n\t\t\t\tvar key interface{}\n\n\t\t\t\tif elem.Kind() == reflect.Ptr {\n\t\t\t\t\tif elem.IsNil() {\n\t\t\t\t\t\tkey = nilKey\n\t\t\t\t\t} else {\n\t\t\t\t\t\tkey = elem.Elem().Interface() // <-- compare underlying value\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tkey = elem.Interface()\n\t\t\t\t}\n\n\t\t\t\tif _, ok := seen[key]; ok {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tseen[key] = struct{}{}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// -------- unique=Field --------\n\n\t\t\tif elem.Kind() == reflect.Ptr {\n\t\t\t\tif elem.IsNil() {\n\t\t\t\t\tif _, ok := seen[nilKey]; ok {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t\tseen[nilKey] = struct{}{}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\telem = elem.Elem()\n\t\t\t}\n\n\t\t\tif elem.Kind() != reflect.Struct {\n\t\t\t\tpanic(fmt.Sprintf(\"Bad field type %s\", elem.Type()))\n\t\t\t}\n\n\t\t\tsf := elem.FieldByName(param)\n\t\t\tif !sf.IsValid() {\n\t\t\t\tpanic(fmt.Sprintf(\"Bad field name %s\", param))\n\t\t\t}\n\n\t\t\tvar key interface{}\n\n\t\t\tif sf.Kind() == reflect.Ptr {\n\t\t\t\tif sf.IsNil() {\n\t\t\t\t\tkey = nilKey\n\t\t\t\t} else {\n\t\t\t\t\tkey = sf.Elem().Interface()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tkey = sf.Interface()\n\t\t\t}\n\n\t\t\tif _, ok := seen[key]; ok {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tseen[key] = struct{}{}\n\t\t}\n\n\t\treturn true\n\n\tcase reflect.Map:\n\t\tseen := make(map[interface{}]struct{})\n\n\t\tfor _, k := range field.MapKeys() {\n\t\t\tval := field.MapIndex(k)\n\n\t\t\tvar key interface{}\n\n\t\t\tif val.Kind() == reflect.Ptr {\n\t\t\t\tif val.IsNil() {\n\t\t\t\t\tkey = nilKey\n\t\t\t\t} else {\n\t\t\t\t\tkey = val.Elem().Interface() // <-- compare underlying value\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tkey = val.Interface()\n\t\t\t}\n\n\t\t\tif _, ok := seen[key]; ok {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tseen[key] = struct{}{}\n\t\t}\n\n\t\treturn true\n\n\tdefault:\n\t\tif parent := fl.Parent(); parent.Kind() == reflect.Struct {\n\t\t\tuniqueField := parent.FieldByName(param)\n\t\t\tif !uniqueField.IsValid() {\n\t\t\t\tpanic(fmt.Sprintf(\"Bad field name provided %s\", param))\n\t\t\t}\n\n\t\t\tif uniqueField.Kind() != field.Kind() {\n\t\t\t\tpanic(fmt.Sprintf(\"Bad field type %s:%s\", field.Type(), uniqueField.Type()))\n\t\t\t}\n\n\t\t\treturn getValue(field) != getValue(uniqueField)\n\t\t}\n\n\t\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n\t}\n}\n\n// isMAC is the validation function for validating if the field's value is a valid MAC address.\nfunc isMAC(fl FieldLevel) bool {\n\t_, err := net.ParseMAC(fl.Field().String())\n\n\treturn err == nil\n}\n\n// isCIDRv4 is the validation function for validating if the field's value is a valid v4 CIDR address.\nfunc isCIDRv4(fl FieldLevel) bool {\n\tip, net, err := net.ParseCIDR(fl.Field().String())\n\n\treturn err == nil && ip.To4() != nil && net.IP.Equal(ip)\n}\n\n// isCIDRv6 is the validation function for validating if the field's value is a valid v6 CIDR address.\nfunc isCIDRv6(fl FieldLevel) bool {\n\tip, _, err := net.ParseCIDR(fl.Field().String())\n\n\treturn err == nil && ip.To4() == nil\n}\n\n// isCIDR is the validation function for validating if the field's value is a valid v4 or v6 CIDR address.\nfunc isCIDR(fl FieldLevel) bool {\n\t_, _, err := net.ParseCIDR(fl.Field().String())\n\n\treturn err == nil\n}\n\n// isIPv4 is the validation function for validating if a value is a valid v4 IP address.\nfunc isIPv4(fl FieldLevel) bool {\n\tip := net.ParseIP(fl.Field().String())\n\n\treturn ip != nil && ip.To4() != nil\n}\n\n// isIPv6 is the validation function for validating if the field's value is a valid v6 IP address.\nfunc isIPv6(fl FieldLevel) bool {\n\tip := net.ParseIP(fl.Field().String())\n\n\treturn ip != nil && ip.To4() == nil\n}\n\n// isIP is the validation function for validating if the field's value is a valid v4 or v6 IP address.\nfunc isIP(fl FieldLevel) bool {\n\tip := net.ParseIP(fl.Field().String())\n\n\treturn ip != nil\n}\n\n// isSSN is the validation function for validating if the field's value is a valid SSN.\nfunc isSSN(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tif field.Len() != 11 {\n\t\treturn false\n\t}\n\n\treturn sSNRegex().MatchString(field.String())\n}\n\n// isLongitude is the validation function for validating if the field's value is a valid longitude coordinate.\nfunc isLongitude(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tvar v string\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\tv = field.String()\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tv = strconv.FormatInt(field.Int(), 10)\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\tv = strconv.FormatUint(field.Uint(), 10)\n\tcase reflect.Float32:\n\t\tv = strconv.FormatFloat(field.Float(), 'f', -1, 32)\n\tcase reflect.Float64:\n\t\tv = strconv.FormatFloat(field.Float(), 'f', -1, 64)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n\t}\n\n\treturn longitudeRegex().MatchString(v)\n}\n\n// isLatitude is the validation function for validating if the field's value is a valid latitude coordinate.\nfunc isLatitude(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tvar v string\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\tv = field.String()\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tv = strconv.FormatInt(field.Int(), 10)\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\tv = strconv.FormatUint(field.Uint(), 10)\n\tcase reflect.Float32:\n\t\tv = strconv.FormatFloat(field.Float(), 'f', -1, 32)\n\tcase reflect.Float64:\n\t\tv = strconv.FormatFloat(field.Float(), 'f', -1, 64)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n\t}\n\n\treturn latitudeRegex().MatchString(v)\n}\n\n// isDataURI is the validation function for validating if the field's value is a valid data URI.\nfunc isDataURI(fl FieldLevel) bool {\n\turi := strings.SplitN(fl.Field().String(), \",\", 2)\n\n\tif len(uri) != 2 {\n\t\treturn false\n\t}\n\n\tif !dataURIRegex().MatchString(uri[0]) {\n\t\treturn false\n\t}\n\n\treturn base64Regex().MatchString(uri[1])\n}\n\n// hasMultiByteCharacter is the validation function for validating if the field's value has a multi byte character.\nfunc hasMultiByteCharacter(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tif field.Len() == 0 {\n\t\treturn true\n\t}\n\n\treturn multibyteRegex().MatchString(field.String())\n}\n\n// isPrintableASCII is the validation function for validating if the field's value is a valid printable ASCII character.\nfunc isPrintableASCII(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tif field.Kind() == reflect.String {\n\t\treturn printableASCIIRegex().MatchString(field.String())\n\t}\n\treturn false\n}\n\n// isASCII is the validation function for validating if the field's value is a valid ASCII character.\nfunc isASCII(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tif field.Kind() == reflect.String {\n\t\treturn aSCIIRegex().MatchString(field.String())\n\t}\n\treturn false\n}\n\n// isUUID5 is the validation function for validating if the field's value is a valid v5 UUID.\nfunc isUUID5(fl FieldLevel) bool {\n\treturn fieldMatchesRegexByStringerValOrString(uUID5Regex, fl)\n}\n\n// isUUID4 is the validation function for validating if the field's value is a valid v4 UUID.\nfunc isUUID4(fl FieldLevel) bool {\n\treturn fieldMatchesRegexByStringerValOrString(uUID4Regex, fl)\n}\n\n// isUUID3 is the validation function for validating if the field's value is a valid v3 UUID.\nfunc isUUID3(fl FieldLevel) bool {\n\treturn fieldMatchesRegexByStringerValOrString(uUID3Regex, fl)\n}\n\n// isUUID is the validation function for validating if the field's value is a valid UUID of any version.\nfunc isUUID(fl FieldLevel) bool {\n\treturn fieldMatchesRegexByStringerValOrString(uUIDRegex, fl)\n}\n\n// isUUID5RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v5 UUID.\nfunc isUUID5RFC4122(fl FieldLevel) bool {\n\treturn fieldMatchesRegexByStringerValOrString(uUID5RFC4122Regex, fl)\n}\n\n// isUUID4RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v4 UUID.\nfunc isUUID4RFC4122(fl FieldLevel) bool {\n\treturn fieldMatchesRegexByStringerValOrString(uUID4RFC4122Regex, fl)\n}\n\n// isUUID3RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v3 UUID.\nfunc isUUID3RFC4122(fl FieldLevel) bool {\n\treturn fieldMatchesRegexByStringerValOrString(uUID3RFC4122Regex, fl)\n}\n\n// isUUIDRFC4122 is the validation function for validating if the field's value is a valid RFC4122 UUID of any version.\nfunc isUUIDRFC4122(fl FieldLevel) bool {\n\treturn fieldMatchesRegexByStringerValOrString(uUIDRFC4122Regex, fl)\n}\n\n// isULID is the validation function for validating if the field's value is a valid ULID.\nfunc isULID(fl FieldLevel) bool {\n\treturn fieldMatchesRegexByStringerValOrString(uLIDRegex, fl)\n}\n\n// isMD4 is the validation function for validating if the field's value is a valid MD4.\nfunc isMD4(fl FieldLevel) bool {\n\treturn md4Regex().MatchString(fl.Field().String())\n}\n\n// isMD5 is the validation function for validating if the field's value is a valid MD5.\nfunc isMD5(fl FieldLevel) bool {\n\treturn md5Regex().MatchString(fl.Field().String())\n}\n\n// isSHA256 is the validation function for validating if the field's value is a valid SHA256.\nfunc isSHA256(fl FieldLevel) bool {\n\treturn sha256Regex().MatchString(fl.Field().String())\n}\n\n// isSHA384 is the validation function for validating if the field's value is a valid SHA384.\nfunc isSHA384(fl FieldLevel) bool {\n\treturn sha384Regex().MatchString(fl.Field().String())\n}\n\n// isSHA512 is the validation function for validating if the field's value is a valid SHA512.\nfunc isSHA512(fl FieldLevel) bool {\n\treturn sha512Regex().MatchString(fl.Field().String())\n}\n\n// isRIPEMD128 is the validation function for validating if the field's value is a valid PIPEMD128.\nfunc isRIPEMD128(fl FieldLevel) bool {\n\treturn ripemd128Regex().MatchString(fl.Field().String())\n}\n\n// isRIPEMD160 is the validation function for validating if the field's value is a valid PIPEMD160.\nfunc isRIPEMD160(fl FieldLevel) bool {\n\treturn ripemd160Regex().MatchString(fl.Field().String())\n}\n\n// isTIGER128 is the validation function for validating if the field's value is a valid TIGER128.\nfunc isTIGER128(fl FieldLevel) bool {\n\treturn tiger128Regex().MatchString(fl.Field().String())\n}\n\n// isTIGER160 is the validation function for validating if the field's value is a valid TIGER160.\nfunc isTIGER160(fl FieldLevel) bool {\n\treturn tiger160Regex().MatchString(fl.Field().String())\n}\n\n// isTIGER192 is the validation function for validating if the field's value is a valid isTIGER192.\nfunc isTIGER192(fl FieldLevel) bool {\n\treturn tiger192Regex().MatchString(fl.Field().String())\n}\n\n// isISBN is the validation function for validating if the field's value is a valid v10 or v13 ISBN.\nfunc isISBN(fl FieldLevel) bool {\n\treturn isISBN10(fl) || isISBN13(fl)\n}\n\n// isISBN13 is the validation function for validating if the field's value is a valid v13 ISBN.\nfunc isISBN13(fl FieldLevel) bool {\n\ts := strings.Replace(strings.Replace(fl.Field().String(), \"-\", \"\", 4), \" \", \"\", 4)\n\n\tif !iSBN13Regex().MatchString(s) {\n\t\treturn false\n\t}\n\n\tvar checksum int32\n\tvar i int32\n\n\tfactor := []int32{1, 3}\n\n\tfor i = 0; i < 12; i++ {\n\t\tchecksum += factor[i%2] * int32(s[i]-'0')\n\t}\n\n\treturn (int32(s[12]-'0'))-((10-(checksum%10))%10) == 0\n}\n\n// isISBN10 is the validation function for validating if the field's value is a valid v10 ISBN.\nfunc isISBN10(fl FieldLevel) bool {\n\ts := strings.Replace(strings.Replace(fl.Field().String(), \"-\", \"\", 3), \" \", \"\", 3)\n\n\tif !iSBN10Regex().MatchString(s) {\n\t\treturn false\n\t}\n\n\tvar checksum int32\n\tvar i int32\n\n\tfor i = 0; i < 9; i++ {\n\t\tchecksum += (i + 1) * int32(s[i]-'0')\n\t}\n\n\tif s[9] == 'X' {\n\t\tchecksum += 10 * 10\n\t} else {\n\t\tchecksum += 10 * int32(s[9]-'0')\n\t}\n\n\treturn checksum%11 == 0\n}\n\n// isISSN is the validation function for validating if the field's value is a valid ISSN.\nfunc isISSN(fl FieldLevel) bool {\n\ts := fl.Field().String()\n\n\tif !iSSNRegex().MatchString(s) {\n\t\treturn false\n\t}\n\ts = strings.ReplaceAll(s, \"-\", \"\")\n\n\tpos := 8\n\tchecksum := 0\n\n\tfor i := 0; i < 7; i++ {\n\t\tchecksum += pos * int(s[i]-'0')\n\t\tpos--\n\t}\n\n\tif s[7] == 'X' {\n\t\tchecksum += 10\n\t} else {\n\t\tchecksum += int(s[7] - '0')\n\t}\n\n\treturn checksum%11 == 0\n}\n\n// isEthereumAddress is the validation function for validating if the field's value is a valid Ethereum address.\nfunc isEthereumAddress(fl FieldLevel) bool {\n\taddress := fl.Field().String()\n\n\treturn ethAddressRegex().MatchString(address)\n}\n\n// isEthereumAddressChecksum is the validation function for validating if the field's value is a valid checksummed Ethereum address.\nfunc isEthereumAddressChecksum(fl FieldLevel) bool {\n\taddress := fl.Field().String()\n\n\tif !ethAddressRegex().MatchString(address) {\n\t\treturn false\n\t}\n\t// Checksum validation. Reference: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md\n\taddress = address[2:] // Skip \"0x\" prefix.\n\th := sha3.NewLegacyKeccak256()\n\t// hash.Hash's io.Writer implementation says it never returns an error. https://golang.org/pkg/hash/#Hash\n\t_, _ = h.Write([]byte(strings.ToLower(address)))\n\thash := hex.EncodeToString(h.Sum(nil))\n\n\tfor i := 0; i < len(address); i++ {\n\t\tif address[i] <= '9' { // Skip 0-9 digits: they don't have upper/lower-case.\n\t\t\tcontinue\n\t\t}\n\t\tif hash[i] > '7' && address[i] >= 'a' || hash[i] <= '7' && address[i] <= 'F' {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// isBitcoinAddress is the validation function for validating if the field's value is a valid btc address\nfunc isBitcoinAddress(fl FieldLevel) bool {\n\taddress := fl.Field().String()\n\n\tif !btcAddressRegex().MatchString(address) {\n\t\treturn false\n\t}\n\n\talphabet := []byte(\"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\")\n\n\tdecode := [25]byte{}\n\n\tfor _, n := range []byte(address) {\n\t\td := bytes.IndexByte(alphabet, n)\n\n\t\tfor i := 24; i >= 0; i-- {\n\t\t\td += 58 * int(decode[i])\n\t\t\tdecode[i] = byte(d % 256)\n\t\t\td /= 256\n\t\t}\n\t}\n\n\th := sha256.New()\n\t_, _ = h.Write(decode[:21])\n\td := h.Sum([]byte{})\n\th = sha256.New()\n\t_, _ = h.Write(d)\n\n\tvalidchecksum := [4]byte{}\n\tcomputedchecksum := [4]byte{}\n\n\tcopy(computedchecksum[:], h.Sum(d[:0]))\n\tcopy(validchecksum[:], decode[21:])\n\n\treturn validchecksum == computedchecksum\n}\n\n// isBitcoinBech32Address is the validation function for validating if the field's value is a valid bech32 btc address\nfunc isBitcoinBech32Address(fl FieldLevel) bool {\n\taddress := fl.Field().String()\n\n\tif !btcLowerAddressRegexBech32().MatchString(address) && !btcUpperAddressRegexBech32().MatchString(address) {\n\t\treturn false\n\t}\n\n\tam := len(address) % 8\n\n\tif am == 0 || am == 3 || am == 5 {\n\t\treturn false\n\t}\n\n\taddress = strings.ToLower(address)\n\n\talphabet := \"qpzry9x8gf2tvdw0s3jn54khce6mua7l\"\n\n\thr := []int{3, 3, 0, 2, 3} // the human readable part will always be bc\n\taddr := address[3:]\n\tdp := make([]int, 0, len(addr))\n\n\tfor _, c := range addr {\n\t\tdp = append(dp, strings.IndexRune(alphabet, c))\n\t}\n\n\tver := dp[0]\n\n\tif ver < 0 || ver > 16 {\n\t\treturn false\n\t}\n\n\tif ver == 0 {\n\t\tif len(address) != 42 && len(address) != 62 {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tvalues := append(hr, dp...)\n\n\tGEN := []int{0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3}\n\n\tp := 1\n\n\tfor _, v := range values {\n\t\tb := p >> 25\n\t\tp = (p&0x1ffffff)<<5 ^ v\n\n\t\tfor i := 0; i < 5; i++ {\n\t\t\tif (b>>uint(i))&1 == 1 {\n\t\t\t\tp ^= GEN[i]\n\t\t\t}\n\t\t}\n\t}\n\n\tif p != 1 {\n\t\treturn false\n\t}\n\n\tb := uint(0)\n\tacc := 0\n\tmv := (1 << 5) - 1\n\tvar sw []int\n\n\tfor _, v := range dp[1 : len(dp)-6] {\n\t\tacc = (acc << 5) | v\n\t\tb += 5\n\t\tfor b >= 8 {\n\t\t\tb -= 8\n\t\t\tsw = append(sw, (acc>>b)&mv)\n\t\t}\n\t}\n\n\tif len(sw) < 2 || len(sw) > 40 {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// excludesRune is the validation function for validating that the field's value does not contain the rune specified within the param.\nfunc excludesRune(fl FieldLevel) bool {\n\treturn !containsRune(fl)\n}\n\n// excludesAll is the validation function for validating that the field's value does not contain any of the characters specified within the param.\nfunc excludesAll(fl FieldLevel) bool {\n\treturn !containsAny(fl)\n}\n\n// excludes is the validation function for validating that the field's value does not contain the text specified within the param.\nfunc excludes(fl FieldLevel) bool {\n\treturn !contains(fl)\n}\n\n// containsRune is the validation function for validating that the field's value contains the rune specified within the param.\nfunc containsRune(fl FieldLevel) bool {\n\tr, _ := utf8.DecodeRuneInString(fl.Param())\n\n\treturn strings.ContainsRune(fl.Field().String(), r)\n}\n\n// containsAny is the validation function for validating that the field's value contains any of the characters specified within the param.\nfunc containsAny(fl FieldLevel) bool {\n\treturn strings.ContainsAny(fl.Field().String(), fl.Param())\n}\n\n// contains is the validation function for validating that the field's value contains the text specified within the param.\nfunc contains(fl FieldLevel) bool {\n\treturn strings.Contains(fl.Field().String(), fl.Param())\n}\n\n// startsWith is the validation function for validating that the field's value starts with the text specified within the param.\nfunc startsWith(fl FieldLevel) bool {\n\treturn strings.HasPrefix(fl.Field().String(), fl.Param())\n}\n\n// endsWith is the validation function for validating that the field's value ends with the text specified within the param.\nfunc endsWith(fl FieldLevel) bool {\n\treturn strings.HasSuffix(fl.Field().String(), fl.Param())\n}\n\n// startsNotWith is the validation function for validating that the field's value does not start with the text specified within the param.\nfunc startsNotWith(fl FieldLevel) bool {\n\treturn !startsWith(fl)\n}\n\n// endsNotWith is the validation function for validating that the field's value does not end with the text specified within the param.\nfunc endsNotWith(fl FieldLevel) bool {\n\treturn !endsWith(fl)\n}\n\n// fieldContains is the validation function for validating if the current field's value contains the field specified by the param's value.\nfunc fieldContains(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tcurrentField, _, ok := fl.GetStructFieldOK()\n\n\tif !ok {\n\t\treturn false\n\t}\n\n\treturn strings.Contains(field.String(), currentField.String())\n}\n\n// fieldExcludes is the validation function for validating if the current field's value excludes the field specified by the param's value.\nfunc fieldExcludes(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tcurrentField, _, ok := fl.GetStructFieldOK()\n\tif !ok {\n\t\treturn true\n\t}\n\n\treturn !strings.Contains(field.String(), currentField.String())\n}\n\n// 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.\nfunc isNeField(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tkind := field.Kind()\n\n\tcurrentField, currentKind, ok := fl.GetStructFieldOK()\n\n\tif !ok || currentKind != kind {\n\t\treturn true\n\t}\n\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn field.Int() != currentField.Int()\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\treturn field.Uint() != currentField.Uint()\n\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn field.Float() != currentField.Float()\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\treturn int64(field.Len()) != int64(currentField.Len())\n\n\tcase reflect.Bool:\n\t\treturn field.Bool() != currentField.Bool()\n\n\tcase reflect.Struct:\n\n\t\tfieldType := field.Type()\n\n\t\tif fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {\n\t\t\tt := getValue(currentField).(time.Time)\n\t\t\tfieldTime := getValue(field).(time.Time)\n\n\t\t\treturn !fieldTime.Equal(t)\n\t\t}\n\n\t\t// Not Same underlying type i.e. struct and time\n\t\tif fieldType != currentField.Type() {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// default reflect.String:\n\treturn field.String() != currentField.String()\n}\n\n// isNe is the validation function for validating that the field's value does not equal the provided param value.\nfunc isNe(fl FieldLevel) bool {\n\treturn !isEq(fl)\n}\n\n// isNeIgnoreCase is the validation function for validating that the field's string value does not equal the\n// provided param value. The comparison is case-insensitive\nfunc isNeIgnoreCase(fl FieldLevel) bool {\n\treturn !isEqIgnoreCase(fl)\n}\n\n// 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.\nfunc isLteCrossStructField(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tkind := field.Kind()\n\n\ttopField, topKind, ok := fl.GetStructFieldOK()\n\tif !ok || topKind != kind {\n\t\treturn false\n\t}\n\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn field.Int() <= topField.Int()\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\treturn field.Uint() <= topField.Uint()\n\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn field.Float() <= topField.Float()\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\treturn int64(field.Len()) <= int64(topField.Len())\n\n\tcase reflect.Struct:\n\n\t\tfieldType := field.Type()\n\n\t\tif fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {\n\t\t\tfieldTime := getValue(field.Convert(timeType)).(time.Time)\n\t\t\ttopTime := getValue(topField.Convert(timeType)).(time.Time)\n\n\t\t\treturn fieldTime.Before(topTime) || fieldTime.Equal(topTime)\n\t\t}\n\n\t\t// Not Same underlying type i.e. struct and time\n\t\tif fieldType != topField.Type() {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// default reflect.String:\n\treturn field.String() <= topField.String()\n}\n\n// 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.\n// NOTE: This is exposed for use within your own custom functions and not intended to be called directly.\nfunc isLtCrossStructField(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tkind := field.Kind()\n\n\ttopField, topKind, ok := fl.GetStructFieldOK()\n\tif !ok || topKind != kind {\n\t\treturn false\n\t}\n\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn field.Int() < topField.Int()\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\treturn field.Uint() < topField.Uint()\n\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn field.Float() < topField.Float()\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\treturn int64(field.Len()) < int64(topField.Len())\n\n\tcase reflect.Struct:\n\n\t\tfieldType := field.Type()\n\n\t\tif fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {\n\t\t\tfieldTime := getValue(field.Convert(timeType)).(time.Time)\n\t\t\ttopTime := getValue(topField.Convert(timeType)).(time.Time)\n\n\t\t\treturn fieldTime.Before(topTime)\n\t\t}\n\n\t\t// Not Same underlying type i.e. struct and time\n\t\tif fieldType != topField.Type() {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// default reflect.String:\n\treturn field.String() < topField.String()\n}\n\n// 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.\nfunc isGteCrossStructField(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tkind := field.Kind()\n\n\ttopField, topKind, ok := fl.GetStructFieldOK()\n\tif !ok || topKind != kind {\n\t\treturn false\n\t}\n\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn field.Int() >= topField.Int()\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\treturn field.Uint() >= topField.Uint()\n\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn field.Float() >= topField.Float()\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\treturn int64(field.Len()) >= int64(topField.Len())\n\n\tcase reflect.Struct:\n\n\t\tfieldType := field.Type()\n\n\t\tif fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {\n\t\t\tfieldTime := getValue(field.Convert(timeType)).(time.Time)\n\t\t\ttopTime := getValue(topField.Convert(timeType)).(time.Time)\n\n\t\t\treturn fieldTime.After(topTime) || fieldTime.Equal(topTime)\n\t\t}\n\n\t\t// Not Same underlying type i.e. struct and time\n\t\tif fieldType != topField.Type() {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// default reflect.String:\n\treturn field.String() >= topField.String()\n}\n\n// 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.\nfunc isGtCrossStructField(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tkind := field.Kind()\n\n\ttopField, topKind, ok := fl.GetStructFieldOK()\n\tif !ok || topKind != kind {\n\t\treturn false\n\t}\n\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn field.Int() > topField.Int()\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\treturn field.Uint() > topField.Uint()\n\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn field.Float() > topField.Float()\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\treturn int64(field.Len()) > int64(topField.Len())\n\n\tcase reflect.Struct:\n\n\t\tfieldType := field.Type()\n\n\t\tif fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {\n\t\t\tfieldTime := getValue(field.Convert(timeType)).(time.Time)\n\t\t\ttopTime := getValue(topField.Convert(timeType)).(time.Time)\n\n\t\t\treturn fieldTime.After(topTime)\n\t\t}\n\n\t\t// Not Same underlying type i.e. struct and time\n\t\tif fieldType != topField.Type() {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// default reflect.String:\n\treturn field.String() > topField.String()\n}\n\n// 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.\nfunc isNeCrossStructField(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tkind := field.Kind()\n\n\ttopField, currentKind, ok := fl.GetStructFieldOK()\n\tif !ok || currentKind != kind {\n\t\treturn true\n\t}\n\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn topField.Int() != field.Int()\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\treturn topField.Uint() != field.Uint()\n\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn topField.Float() != field.Float()\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\treturn int64(topField.Len()) != int64(field.Len())\n\n\tcase reflect.Bool:\n\t\treturn topField.Bool() != field.Bool()\n\n\tcase reflect.Struct:\n\n\t\tfieldType := field.Type()\n\n\t\tif fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {\n\t\t\tt := getValue(field.Convert(timeType)).(time.Time)\n\t\t\tfieldTime := getValue(topField.Convert(timeType)).(time.Time)\n\n\t\t\treturn !fieldTime.Equal(t)\n\t\t}\n\n\t\t// Not Same underlying type i.e. struct and time\n\t\tif fieldType != topField.Type() {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// default reflect.String:\n\treturn topField.String() != field.String()\n}\n\n// 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.\nfunc isEqCrossStructField(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tkind := field.Kind()\n\n\ttopField, topKind, ok := fl.GetStructFieldOK()\n\tif !ok || topKind != kind {\n\t\treturn false\n\t}\n\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn topField.Int() == field.Int()\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\treturn topField.Uint() == field.Uint()\n\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn topField.Float() == field.Float()\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\treturn int64(topField.Len()) == int64(field.Len())\n\n\tcase reflect.Bool:\n\t\treturn topField.Bool() == field.Bool()\n\n\tcase reflect.Struct:\n\n\t\tfieldType := field.Type()\n\n\t\tif fieldType.ConvertibleTo(timeType) && topField.Type().ConvertibleTo(timeType) {\n\t\t\tt := getValue(field.Convert(timeType)).(time.Time)\n\t\t\tfieldTime := getValue(topField.Convert(timeType)).(time.Time)\n\n\t\t\treturn fieldTime.Equal(t)\n\t\t}\n\n\t\t// Not Same underlying type i.e. struct and time\n\t\tif fieldType != topField.Type() {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// default reflect.String:\n\treturn topField.String() == field.String()\n}\n\n// isEqField is the validation function for validating if the current field's value is equal to the field specified by the param's value.\nfunc isEqField(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tkind := field.Kind()\n\n\tcurrentField, currentKind, ok := fl.GetStructFieldOK()\n\tif !ok || currentKind != kind {\n\t\treturn false\n\t}\n\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn field.Int() == currentField.Int()\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\treturn field.Uint() == currentField.Uint()\n\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn field.Float() == currentField.Float()\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\treturn int64(field.Len()) == int64(currentField.Len())\n\n\tcase reflect.Bool:\n\t\treturn field.Bool() == currentField.Bool()\n\n\tcase reflect.Struct:\n\n\t\tfieldType := field.Type()\n\n\t\tif fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {\n\t\t\tt := getValue(currentField.Convert(timeType)).(time.Time)\n\t\t\tfieldTime := getValue(field.Convert(timeType)).(time.Time)\n\n\t\t\treturn fieldTime.Equal(t)\n\t\t}\n\n\t\t// Not Same underlying type i.e. struct and time\n\t\tif fieldType != currentField.Type() {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// default reflect.String:\n\treturn field.String() == currentField.String()\n}\n\n// isEq is the validation function for validating if the current field's value is equal to the param's value.\nfunc isEq(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tparam := fl.Param()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\treturn field.String() == param\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\tp := asInt(param)\n\n\t\treturn int64(field.Len()) == p\n\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tp := asIntFromType(field.Type(), param)\n\n\t\treturn field.Int() == p\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\tp := asUint(param)\n\n\t\treturn field.Uint() == p\n\n\tcase reflect.Float32:\n\t\tp := asFloat32(param)\n\n\t\treturn field.Float() == p\n\n\tcase reflect.Float64:\n\t\tp := asFloat64(param)\n\n\t\treturn field.Float() == p\n\n\tcase reflect.Bool:\n\t\tp := asBool(param)\n\n\t\treturn field.Bool() == p\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isEqIgnoreCase is the validation function for validating if the current field's string value is\n// equal to the param's value.\n// The comparison is case-insensitive.\nfunc isEqIgnoreCase(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tparam := fl.Param()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\treturn strings.EqualFold(field.String(), param)\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isPostcodeByIso3166Alpha2 validates by value which is country code in iso 3166 alpha 2\n// example: `postcode_iso3166_alpha2=US`\nfunc isPostcodeByIso3166Alpha2(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tparam := fl.Param()\n\n\tpostcodeRegexInit.Do(initPostcodes)\n\treg, found := postCodeRegexDict[param]\n\tif !found {\n\t\treturn false\n\t}\n\n\treturn reg.MatchString(field.String())\n}\n\n// isPostcodeByIso3166Alpha2Field validates by field which represents for a value of country code in iso 3166 alpha 2\n// example: `postcode_iso3166_alpha2_field=CountryCode`\nfunc isPostcodeByIso3166Alpha2Field(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tparams := parseOneOfParam2(fl.Param())\n\n\tif len(params) != 1 {\n\t\treturn false\n\t}\n\n\tcurrentField, kind, _, found := fl.GetStructFieldOKAdvanced2(fl.Parent(), params[0])\n\tif !found {\n\t\treturn false\n\t}\n\n\tif kind != reflect.String {\n\t\tpanic(fmt.Sprintf(\"Bad field type %s\", currentField.Type()))\n\t}\n\n\tpostcodeRegexInit.Do(initPostcodes)\n\treg, found := postCodeRegexDict[currentField.String()]\n\tif !found {\n\t\treturn false\n\t}\n\n\treturn reg.MatchString(field.String())\n}\n\n// isBase32 is the validation function for validating if the current field's value is a valid base 32.\nfunc isBase32(fl FieldLevel) bool {\n\treturn base32Regex().MatchString(fl.Field().String())\n}\n\n// isBase64 is the validation function for validating if the current field's value is a valid base 64.\nfunc isBase64(fl FieldLevel) bool {\n\treturn base64Regex().MatchString(fl.Field().String())\n}\n\n// isBase64URL is the validation function for validating if the current field's value is a valid base64 URL safe string.\nfunc isBase64URL(fl FieldLevel) bool {\n\treturn base64URLRegex().MatchString(fl.Field().String())\n}\n\n// isBase64RawURL is the validation function for validating if the current field's value is a valid base64 URL safe string without '=' padding.\nfunc isBase64RawURL(fl FieldLevel) bool {\n\treturn base64RawURLRegex().MatchString(fl.Field().String())\n}\n\n// isURI is the validation function for validating if the current field's value is a valid URI.\nfunc isURI(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\n\t\ts := field.String()\n\n\t\t// checks needed as of Go 1.6 because of change https://github.com/golang/go/commit/617c93ce740c3c3cc28cdd1a0d712be183d0b328#diff-6c2d018290e298803c0c9419d8739885L195\n\t\t// emulate browser and strip the '#' suffix prior to validation. see issue-#237\n\t\tif i := strings.Index(s, \"#\"); i > -1 {\n\t\t\ts = s[:i]\n\t\t}\n\n\t\tif len(s) == 0 {\n\t\t\treturn false\n\t\t}\n\n\t\t_, err := url.ParseRequestURI(s)\n\n\t\treturn err == nil\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isURL is the validation function for validating if the current field's value is a valid URL.\nfunc isURL(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\n\t\ts := strings.ToLower(field.String())\n\n\t\tif len(s) == 0 {\n\t\t\treturn false\n\t\t}\n\n\t\turl, err := url.Parse(s)\n\t\tif err != nil || url.Scheme == \"\" {\n\t\t\treturn false\n\t\t}\n\t\tisFileScheme := url.Scheme == \"file\"\n\n\t\tif (isFileScheme && (len(url.Path) == 0 || url.Path == \"/\")) || (!isFileScheme && len(url.Host) == 0 && len(url.Fragment) == 0 && len(url.Opaque) == 0) {\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isHttpURL is the validation function for validating if the current field's value is a valid HTTP(s) URL.\nfunc isHttpURL(fl FieldLevel) bool {\n\tif !isURL(fl) {\n\t\treturn false\n\t}\n\n\tfield := fl.Field()\n\tswitch field.Kind() {\n\tcase reflect.String:\n\n\t\ts := strings.ToLower(field.String())\n\n\t\turl, err := url.Parse(s)\n\t\tif err != nil || url.Host == \"\" {\n\t\t\treturn false\n\t\t}\n\n\t\treturn url.Scheme == \"http\" || url.Scheme == \"https\"\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isHttpsURL is the validation function for validating if the current field's value is a valid HTTPS-only URL.\nfunc isHttpsURL(fl FieldLevel) bool {\n\tif !isURL(fl) {\n\t\treturn false\n\t}\n\n\tfield := fl.Field()\n\tswitch field.Kind() {\n\tcase reflect.String:\n\n\t\ts := strings.ToLower(field.String())\n\n\t\turl, err := url.Parse(s)\n\t\tif err != nil || url.Host == \"\" {\n\t\t\treturn false\n\t\t}\n\n\t\treturn url.Scheme == \"https\"\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isUrnRFC2141 is the validation function for validating if the current field's value is a valid URN as per RFC 2141.\nfunc isUrnRFC2141(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\n\t\tstr := field.String()\n\n\t\t_, match := urn.Parse([]byte(str))\n\n\t\treturn match\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isFile is the validation function for validating if the current field's value is a valid existing file path.\nfunc isFile(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\tfileInfo, err := os.Stat(field.String())\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\n\t\treturn !fileInfo.IsDir()\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isImage is the validation function for validating if the current field's value contains the path to a valid image file\nfunc isImage(fl FieldLevel) bool {\n\tmimetypes := map[string]bool{\n\t\t\"image/bmp\":                true,\n\t\t\"image/cis-cod\":            true,\n\t\t\"image/gif\":                true,\n\t\t\"image/ief\":                true,\n\t\t\"image/jpeg\":               true,\n\t\t\"image/jp2\":                true,\n\t\t\"image/jpx\":                true,\n\t\t\"image/jpm\":                true,\n\t\t\"image/pipeg\":              true,\n\t\t\"image/png\":                true,\n\t\t\"image/svg+xml\":            true,\n\t\t\"image/tiff\":               true,\n\t\t\"image/webp\":               true,\n\t\t\"image/x-cmu-raster\":       true,\n\t\t\"image/x-cmx\":              true,\n\t\t\"image/x-icon\":             true,\n\t\t\"image/x-portable-anymap\":  true,\n\t\t\"image/x-portable-bitmap\":  true,\n\t\t\"image/x-portable-graymap\": true,\n\t\t\"image/x-portable-pixmap\":  true,\n\t\t\"image/x-rgb\":              true,\n\t\t\"image/x-xbitmap\":          true,\n\t\t\"image/x-xpixmap\":          true,\n\t\t\"image/x-xwindowdump\":      true,\n\t}\n\tfield := fl.Field()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\tfilePath := field.String()\n\t\tfileInfo, err := os.Stat(filePath)\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\n\t\tif fileInfo.IsDir() {\n\t\t\treturn false\n\t\t}\n\n\t\tfile, err := os.Open(filePath)\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t\tdefer func() {\n\t\t\t_ = file.Close()\n\t\t}()\n\n\t\tmime, err := mimetype.DetectReader(file)\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\n\t\tif _, ok := mimetypes[mime.String()]; ok {\n\t\t\treturn true\n\t\t}\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isFilePath is the validation function for validating if the current field's value is a valid file path.\nfunc isFilePath(fl FieldLevel) bool {\n\tvar exists bool\n\tvar err error\n\n\tfield := fl.Field()\n\n\t// Not valid if it is a directory.\n\tif isDir(fl) {\n\t\treturn false\n\t}\n\t// If it exists, it obviously is valid.\n\t// This is done first to avoid code duplication and unnecessary additional logic.\n\tif exists = isFile(fl); exists {\n\t\treturn true\n\t}\n\n\t// It does not exist but may still be a valid filepath.\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\t// Every OS allows for whitespace, but none\n\t\t// let you use a file with no filename (to my knowledge).\n\t\t// Unless you're dealing with raw inodes, but I digress.\n\t\tif strings.TrimSpace(field.String()) == \"\" {\n\t\t\treturn false\n\t\t}\n\t\t// We make sure it isn't a directory.\n\t\tif strings.HasSuffix(field.String(), string(os.PathSeparator)) {\n\t\t\treturn false\n\t\t}\n\t\tif _, err = os.Stat(field.String()); err != nil {\n\t\t\tswitch t := err.(type) {\n\t\t\tcase *fs.PathError:\n\t\t\t\tif t.Err == syscall.EINVAL {\n\t\t\t\t\t// It's definitely an invalid character in the filepath.\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\t// It could be a permission error, a does-not-exist error, etc.\n\t\t\t\t// Out-of-scope for this validation, though.\n\t\t\t\treturn true\n\t\t\tdefault:\n\t\t\t\t// Something went *seriously* wrong.\n\t\t\t\t/*\n\t\t\t\t\tPer https://pkg.go.dev/os#Stat:\n\t\t\t\t\t\t\"If there is an error, it will be of type *PathError.\"\n\t\t\t\t*/\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isE164 is the validation function for validating if the current field's value is a valid e.164 formatted phone number.\nfunc isE164(fl FieldLevel) bool {\n\treturn e164Regex().MatchString(fl.Field().String())\n}\n\n// isEmail is the validation function for validating if the current field's value is a valid email address.\nfunc isEmail(fl FieldLevel) bool {\n\t_, err := mail.ParseAddress(fl.Field().String())\n\tif err != nil {\n\t\treturn false\n\t}\n\treturn emailRegex().MatchString(fl.Field().String())\n}\n\n// isHSLA is the validation function for validating if the current field's value is a valid HSLA color.\nfunc isHSLA(fl FieldLevel) bool {\n\treturn hslaRegex().MatchString(fl.Field().String())\n}\n\n// isCMYK is the validation function for validating if the current field's value is a valid CMYK color.\nfunc isCMYK(fl FieldLevel) bool {\n\treturn cmykRegex().MatchString(fl.Field().String())\n}\n\n// isHSL is the validation function for validating if the current field's value is a valid HSL color.\nfunc isHSL(fl FieldLevel) bool {\n\treturn hslRegex().MatchString(fl.Field().String())\n}\n\n// isRGBA is the validation function for validating if the current field's value is a valid RGBA color.\nfunc isRGBA(fl FieldLevel) bool {\n\treturn rgbaRegex().MatchString(fl.Field().String())\n}\n\n// isRGB is the validation function for validating if the current field's value is a valid RGB color.\nfunc isRGB(fl FieldLevel) bool {\n\treturn rgbRegex().MatchString(fl.Field().String())\n}\n\n// isHEXColor is the validation function for validating if the current field's value is a valid HEX color.\nfunc isHEXColor(fl FieldLevel) bool {\n\treturn hexColorRegex().MatchString(fl.Field().String())\n}\n\n// isHexadecimal is the validation function for validating if the current field's value is a valid hexadecimal.\nfunc isHexadecimal(fl FieldLevel) bool {\n\treturn hexadecimalRegex().MatchString(fl.Field().String())\n}\n\n// isNumber is the validation function for validating if the current field's value is a valid number.\nfunc isNumber(fl FieldLevel) bool {\n\tswitch fl.Field().Kind() {\n\tcase 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:\n\t\treturn true\n\tdefault:\n\t\treturn numberRegex().MatchString(fl.Field().String())\n\t}\n}\n\n// isNumeric is the validation function for validating if the current field's value is a valid numeric value.\nfunc isNumeric(fl FieldLevel) bool {\n\tswitch fl.Field().Kind() {\n\tcase 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:\n\t\treturn true\n\tdefault:\n\t\treturn numericRegex().MatchString(fl.Field().String())\n\t}\n}\n\n// isAlphanum is the validation function for validating if the current field's value is a valid alphanumeric value.\nfunc isAlphanum(fl FieldLevel) bool {\n\treturn alphaNumericRegex().MatchString(fl.Field().String())\n}\n\n// isAlpha is the validation function for validating if the current field's value is a valid alpha value.\nfunc isAlpha(fl FieldLevel) bool {\n\treturn alphaRegex().MatchString(fl.Field().String())\n}\n\n// isAlphanumUnicode is the validation function for validating if the current field's value is a valid alphanumeric unicode value.\nfunc isAlphanumUnicode(fl FieldLevel) bool {\n\treturn alphaUnicodeNumericRegex().MatchString(fl.Field().String())\n}\n\n// isAlphaSpace is the validation function for validating if the current field's value is a valid alpha value with spaces.\nfunc isAlphaSpace(fl FieldLevel) bool {\n\treturn alphaSpaceRegex().MatchString(fl.Field().String())\n}\n\n// isAlphaNumericSpace is the validation function for validating if the current field's value is a valid alphanumeric value with spaces.\nfunc isAlphaNumericSpace(fl FieldLevel) bool {\n\treturn alphanNumericSpaceRegex().MatchString(fl.Field().String())\n}\n\n// isAlphaUnicode is the validation function for validating if the current field's value is a valid alpha unicode value.\nfunc isAlphaUnicode(fl FieldLevel) bool {\n\treturn alphaUnicodeRegex().MatchString(fl.Field().String())\n}\n\n// 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.\nfunc isBoolean(fl FieldLevel) bool {\n\tswitch fl.Field().Kind() {\n\tcase reflect.Bool:\n\t\treturn true\n\tdefault:\n\t\t_, err := strconv.ParseBool(fl.Field().String())\n\t\treturn err == nil\n\t}\n}\n\n// isDefault is the opposite of required aka hasValue\nfunc isDefault(fl FieldLevel) bool {\n\treturn !hasValue(fl)\n}\n\n// hasValue is the validation function for validating if the current field's value is not the default static value.\nfunc hasValue(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tswitch field.Kind() {\n\tcase reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func:\n\t\treturn !field.IsNil()\n\tdefault:\n\t\tif fl.(*validate).fldIsPointer && getValue(field) != nil {\n\t\t\treturn true\n\t\t}\n\t\treturn field.IsValid() && !field.IsZero()\n\t}\n}\n\n// hasNotZeroValue is the validation function for validating if the current field's value is not the zero value for its type.\nfunc hasNotZeroValue(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tswitch field.Kind() {\n\tcase reflect.Slice, reflect.Map:\n\t\t// For slices and maps, consider them \"not zero\" only if they're both non-nil AND have elements\n\t\treturn !field.IsNil() && field.Len() > 0\n\tcase reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func:\n\t\treturn !field.IsNil()\n\tdefault:\n\t\tif fl.(*validate).fldIsPointer && getValue(field) != nil {\n\t\t\treturn !field.IsZero()\n\t\t}\n\t\treturn field.IsValid() && !field.IsZero()\n\t}\n}\n\n// requireCheckFieldKind is a func for check field kind\nfunc requireCheckFieldKind(fl FieldLevel, param string, defaultNotFoundValue bool) bool {\n\tfield := fl.Field()\n\tkind := field.Kind()\n\tvar nullable, found bool\n\tif len(param) > 0 {\n\t\tfield, kind, nullable, found = fl.GetStructFieldOKAdvanced2(fl.Parent(), param)\n\t\tif !found {\n\t\t\treturn defaultNotFoundValue\n\t\t}\n\t}\n\tswitch kind {\n\tcase reflect.Invalid:\n\t\treturn defaultNotFoundValue\n\tcase reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func:\n\t\treturn field.IsNil()\n\tdefault:\n\t\tif nullable && getValue(field) != nil {\n\t\t\treturn false\n\t\t}\n\t\treturn field.IsValid() && field.IsZero()\n\t}\n}\n\n// requireCheckFieldValue is a func for check field value\nfunc requireCheckFieldValue(\n\tfl FieldLevel, param string, value string, defaultNotFoundValue bool,\n) bool {\n\tfield, kind, _, found := fl.GetStructFieldOKAdvanced2(fl.Parent(), param)\n\tif !found {\n\t\treturn defaultNotFoundValue\n\t}\n\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn field.Int() == asInt(value)\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\treturn field.Uint() == asUint(value)\n\n\tcase reflect.Float32:\n\t\treturn field.Float() == asFloat32(value)\n\n\tcase reflect.Float64:\n\t\treturn field.Float() == asFloat64(value)\n\n\tcase reflect.Slice, reflect.Map:\n\t\tif value == \"nil\" {\n\t\t\treturn field.IsNil()\n\t\t}\n\t\treturn int64(field.Len()) == asInt(value)\n\tcase reflect.Array:\n\t\t// Arrays can't be nil, so only compare lengths\n\t\treturn int64(field.Len()) == asInt(value)\n\n\tcase reflect.Bool:\n\t\treturn field.Bool() == (value == \"true\")\n\n\tcase reflect.Ptr:\n\t\tif field.IsNil() {\n\t\t\treturn value == \"nil\"\n\t\t}\n\t\t// Handle non-nil pointers\n\t\treturn requireCheckFieldValue(fl, param, value, defaultNotFoundValue)\n\t}\n\n\t// default reflect.String:\n\treturn field.String() == value\n}\n\n// requiredIf is the validation function\n// 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.\nfunc requiredIf(fl FieldLevel) bool {\n\tparams := parseOneOfParam2(fl.Param())\n\tif len(params)%2 != 0 {\n\t\tpanic(fmt.Sprintf(\"Bad param number for required_if %s\", fl.FieldName()))\n\t}\n\n\tseen := make(map[string]struct{})\n\tfor i := 0; i < len(params); i += 2 {\n\t\tif _, ok := seen[params[i]]; ok {\n\t\t\tpanic(fmt.Sprintf(\"Duplicate param %s for required_if %s\", params[i], fl.FieldName()))\n\t\t}\n\t\tseen[params[i]] = struct{}{}\n\t}\n\n\tfor i := 0; i < len(params); i += 2 {\n\t\tif !requireCheckFieldValue(fl, params[i], params[i+1], false) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn hasValue(fl)\n}\n\n// excludedIf is the validation function\n// 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.\nfunc excludedIf(fl FieldLevel) bool {\n\tparams := parseOneOfParam2(fl.Param())\n\tif len(params)%2 != 0 {\n\t\tpanic(fmt.Sprintf(\"Bad param number for excluded_if %s\", fl.FieldName()))\n\t}\n\n\tfor i := 0; i < len(params); i += 2 {\n\t\tif !requireCheckFieldValue(fl, params[i], params[i+1], false) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn !hasValue(fl)\n}\n\n// requiredUnless is the validation function\n// 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.\nfunc requiredUnless(fl FieldLevel) bool {\n\tparams := parseOneOfParam2(fl.Param())\n\tif len(params)%2 != 0 {\n\t\tpanic(fmt.Sprintf(\"Bad param number for required_unless %s\", fl.FieldName()))\n\t}\n\n\tfor i := 0; i < len(params); i += 2 {\n\t\tif requireCheckFieldValue(fl, params[i], params[i+1], false) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn hasValue(fl)\n}\n\n// skipUnless is the validation function\n// 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.\nfunc skipUnless(fl FieldLevel) bool {\n\tparams := parseOneOfParam2(fl.Param())\n\tif len(params)%2 != 0 {\n\t\tpanic(fmt.Sprintf(\"Bad param number for skip_unless %s\", fl.FieldName()))\n\t}\n\tfor i := 0; i < len(params); i += 2 {\n\t\tif !requireCheckFieldValue(fl, params[i], params[i+1], false) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn hasValue(fl)\n}\n\n// excludedUnless is the validation function\n// 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.\nfunc excludedUnless(fl FieldLevel) bool {\n\tparams := parseOneOfParam2(fl.Param())\n\tif len(params)%2 != 0 {\n\t\tpanic(fmt.Sprintf(\"Bad param number for excluded_unless %s\", fl.FieldName()))\n\t}\n\tfor i := 0; i < len(params); i += 2 {\n\t\tif requireCheckFieldValue(fl, params[i], params[i+1], false) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn !hasValue(fl)\n}\n\n// excludedWith is the validation function\n// The field under validation must not be present or is empty if any of the other specified fields are present.\nfunc excludedWith(fl FieldLevel) bool {\n\tparams := parseOneOfParam2(fl.Param())\n\tfor _, param := range params {\n\t\tif !requireCheckFieldKind(fl, param, true) {\n\t\t\treturn !hasValue(fl)\n\t\t}\n\t}\n\treturn true\n}\n\n// requiredWith is the validation function\n// The field under validation must be present and not empty only if any of the other specified fields are present.\nfunc requiredWith(fl FieldLevel) bool {\n\tparams := parseOneOfParam2(fl.Param())\n\tfor _, param := range params {\n\t\tif !requireCheckFieldKind(fl, param, true) {\n\t\t\treturn hasValue(fl)\n\t\t}\n\t}\n\treturn true\n}\n\n// excludedWithAll is the validation function\n// The field under validation must not be present or is empty if all of the other specified fields are present.\nfunc excludedWithAll(fl FieldLevel) bool {\n\tparams := parseOneOfParam2(fl.Param())\n\tfor _, param := range params {\n\t\tif requireCheckFieldKind(fl, param, true) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn !hasValue(fl)\n}\n\n// requiredWithAll is the validation function\n// The field under validation must be present and not empty only if all of the other specified fields are present.\nfunc requiredWithAll(fl FieldLevel) bool {\n\tparams := parseOneOfParam2(fl.Param())\n\tfor _, param := range params {\n\t\tif requireCheckFieldKind(fl, param, true) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn hasValue(fl)\n}\n\n// excludedWithout is the validation function\n// The field under validation must not be present or is empty when any of the other specified fields are not present.\nfunc excludedWithout(fl FieldLevel) bool {\n\tif requireCheckFieldKind(fl, strings.TrimSpace(fl.Param()), true) {\n\t\treturn !hasValue(fl)\n\t}\n\treturn true\n}\n\n// requiredWithout is the validation function\n// The field under validation must be present and not empty only when any of the other specified fields are not present.\nfunc requiredWithout(fl FieldLevel) bool {\n\tparams := parseOneOfParam2(fl.Param())\n\tfor _, param := range params {\n\t\tif requireCheckFieldKind(fl, param, true) {\n\t\t\treturn hasValue(fl)\n\t\t}\n\t}\n\treturn true\n}\n\n// excludedWithoutAll is the validation function\n// The field under validation must not be present or is empty when all of the other specified fields are not present.\nfunc excludedWithoutAll(fl FieldLevel) bool {\n\tparams := parseOneOfParam2(fl.Param())\n\tfor _, param := range params {\n\t\tif !requireCheckFieldKind(fl, param, true) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn !hasValue(fl)\n}\n\n// requiredWithoutAll is the validation function\n// The field under validation must be present and not empty only when all of the other specified fields are not present.\nfunc requiredWithoutAll(fl FieldLevel) bool {\n\tparams := parseOneOfParam2(fl.Param())\n\tfor _, param := range params {\n\t\tif !requireCheckFieldKind(fl, param, true) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn hasValue(fl)\n}\n\n// 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.\nfunc isGteField(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tkind := field.Kind()\n\n\tcurrentField, currentKind, ok := fl.GetStructFieldOK()\n\tif !ok || currentKind != kind {\n\t\treturn false\n\t}\n\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\n\t\treturn field.Int() >= currentField.Int()\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\n\t\treturn field.Uint() >= currentField.Uint()\n\n\tcase reflect.Float32, reflect.Float64:\n\n\t\treturn field.Float() >= currentField.Float()\n\n\tcase reflect.Struct:\n\n\t\tfieldType := field.Type()\n\n\t\tif fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {\n\t\t\tt := getValue(currentField.Convert(timeType)).(time.Time)\n\t\t\tfieldTime := getValue(field.Convert(timeType)).(time.Time)\n\n\t\t\treturn fieldTime.After(t) || fieldTime.Equal(t)\n\t\t}\n\n\t\t// Not Same underlying type i.e. struct and time\n\t\tif fieldType != currentField.Type() {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// default reflect.String\n\treturn len(field.String()) >= len(currentField.String())\n}\n\n// isGtField is the validation function for validating if the current field's value is greater than the field specified by the param's value.\nfunc isGtField(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tkind := field.Kind()\n\n\tcurrentField, currentKind, ok := fl.GetStructFieldOK()\n\tif !ok || currentKind != kind {\n\t\treturn false\n\t}\n\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\n\t\treturn field.Int() > currentField.Int()\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\n\t\treturn field.Uint() > currentField.Uint()\n\n\tcase reflect.Float32, reflect.Float64:\n\n\t\treturn field.Float() > currentField.Float()\n\n\tcase reflect.Struct:\n\n\t\tfieldType := field.Type()\n\n\t\tif fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {\n\t\t\tt := getValue(currentField.Convert(timeType)).(time.Time)\n\t\t\tfieldTime := getValue(field.Convert(timeType)).(time.Time)\n\n\t\t\treturn fieldTime.After(t)\n\t\t}\n\n\t\t// Not Same underlying type i.e. struct and time\n\t\tif fieldType != currentField.Type() {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// default reflect.String\n\treturn len(field.String()) > len(currentField.String())\n}\n\n// isGte is the validation function for validating if the current field's value is greater than or equal to the param's value.\nfunc isGte(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tparam := fl.Param()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\tp := asInt(param)\n\n\t\treturn int64(utf8.RuneCountInString(field.String())) >= p\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\tp := asInt(param)\n\n\t\treturn int64(field.Len()) >= p\n\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tp := asIntFromType(field.Type(), param)\n\n\t\treturn field.Int() >= p\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\tp := asUint(param)\n\n\t\treturn field.Uint() >= p\n\n\tcase reflect.Float32:\n\t\tp := asFloat32(param)\n\n\t\treturn field.Float() >= p\n\n\tcase reflect.Float64:\n\t\tp := asFloat64(param)\n\n\t\treturn field.Float() >= p\n\n\tcase reflect.Struct:\n\n\t\tif field.Type().ConvertibleTo(timeType) {\n\t\t\tnow := time.Now().UTC()\n\t\t\tt := getValue(field.Convert(timeType)).(time.Time)\n\n\t\t\treturn t.After(now) || t.Equal(now)\n\t\t}\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isGt is the validation function for validating if the current field's value is greater than the param's value.\nfunc isGt(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tparam := fl.Param()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\tp := asInt(param)\n\n\t\treturn int64(utf8.RuneCountInString(field.String())) > p\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\tp := asInt(param)\n\n\t\treturn int64(field.Len()) > p\n\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tp := asIntFromType(field.Type(), param)\n\n\t\treturn field.Int() > p\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\tp := asUint(param)\n\n\t\treturn field.Uint() > p\n\n\tcase reflect.Float32:\n\t\tp := asFloat32(param)\n\n\t\treturn field.Float() > p\n\n\tcase reflect.Float64:\n\t\tp := asFloat64(param)\n\n\t\treturn field.Float() > p\n\n\tcase reflect.Struct:\n\n\t\tif field.Type().ConvertibleTo(timeType) {\n\t\t\treturn getValue(field.Convert(timeType)).(time.Time).After(time.Now().UTC())\n\t\t}\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// hasLengthOf is the validation function for validating if the current field's value is equal to the param's value.\nfunc hasLengthOf(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tparam := fl.Param()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\tp := asInt(param)\n\n\t\treturn int64(utf8.RuneCountInString(field.String())) == p\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\tp := asInt(param)\n\n\t\treturn int64(field.Len()) == p\n\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tp := asIntFromType(field.Type(), param)\n\n\t\treturn field.Int() == p\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\tp := asUint(param)\n\n\t\treturn field.Uint() == p\n\n\tcase reflect.Float32:\n\t\tp := asFloat32(param)\n\n\t\treturn field.Float() == p\n\n\tcase reflect.Float64:\n\t\tp := asFloat64(param)\n\n\t\treturn field.Float() == p\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// hasMinOf is the validation function for validating if the current field's value is greater than or equal to the param's value.\nfunc hasMinOf(fl FieldLevel) bool {\n\treturn isGte(fl)\n}\n\n// 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.\nfunc isLteField(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tkind := field.Kind()\n\n\tcurrentField, currentKind, ok := fl.GetStructFieldOK()\n\tif !ok || currentKind != kind {\n\t\treturn false\n\t}\n\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\n\t\treturn field.Int() <= currentField.Int()\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\n\t\treturn field.Uint() <= currentField.Uint()\n\n\tcase reflect.Float32, reflect.Float64:\n\n\t\treturn field.Float() <= currentField.Float()\n\n\tcase reflect.Struct:\n\n\t\tfieldType := field.Type()\n\n\t\tif fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {\n\t\t\tt := getValue(currentField.Convert(timeType)).(time.Time)\n\t\t\tfieldTime := getValue(field.Convert(timeType)).(time.Time)\n\n\t\t\treturn fieldTime.Before(t) || fieldTime.Equal(t)\n\t\t}\n\n\t\t// Not Same underlying type i.e. struct and time\n\t\tif fieldType != currentField.Type() {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// default reflect.String\n\treturn len(field.String()) <= len(currentField.String())\n}\n\n// isLtField is the validation function for validating if the current field's value is less than the field specified by the param's value.\nfunc isLtField(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tkind := field.Kind()\n\n\tcurrentField, currentKind, ok := fl.GetStructFieldOK()\n\tif !ok || currentKind != kind {\n\t\treturn false\n\t}\n\n\tswitch kind {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\n\t\treturn field.Int() < currentField.Int()\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\n\t\treturn field.Uint() < currentField.Uint()\n\n\tcase reflect.Float32, reflect.Float64:\n\n\t\treturn field.Float() < currentField.Float()\n\n\tcase reflect.Struct:\n\n\t\tfieldType := field.Type()\n\n\t\tif fieldType.ConvertibleTo(timeType) && currentField.Type().ConvertibleTo(timeType) {\n\t\t\tt := getValue(currentField.Convert(timeType)).(time.Time)\n\t\t\tfieldTime := getValue(field.Convert(timeType)).(time.Time)\n\n\t\t\treturn fieldTime.Before(t)\n\t\t}\n\n\t\t// Not Same underlying type i.e. struct and time\n\t\tif fieldType != currentField.Type() {\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// default reflect.String\n\treturn len(field.String()) < len(currentField.String())\n}\n\n// isLte is the validation function for validating if the current field's value is less than or equal to the param's value.\nfunc isLte(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tparam := fl.Param()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\tp := asInt(param)\n\n\t\treturn int64(utf8.RuneCountInString(field.String())) <= p\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\tp := asInt(param)\n\n\t\treturn int64(field.Len()) <= p\n\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tp := asIntFromType(field.Type(), param)\n\n\t\treturn field.Int() <= p\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\tp := asUint(param)\n\n\t\treturn field.Uint() <= p\n\n\tcase reflect.Float32:\n\t\tp := asFloat32(param)\n\n\t\treturn field.Float() <= p\n\n\tcase reflect.Float64:\n\t\tp := asFloat64(param)\n\n\t\treturn field.Float() <= p\n\n\tcase reflect.Struct:\n\n\t\tif field.Type().ConvertibleTo(timeType) {\n\t\t\tnow := time.Now().UTC()\n\t\t\tt := getValue(field.Convert(timeType)).(time.Time)\n\n\t\t\treturn t.Before(now) || t.Equal(now)\n\t\t}\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isLt is the validation function for validating if the current field's value is less than the param's value.\nfunc isLt(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tparam := fl.Param()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\tp := asInt(param)\n\n\t\treturn int64(utf8.RuneCountInString(field.String())) < p\n\n\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\tp := asInt(param)\n\n\t\treturn int64(field.Len()) < p\n\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tp := asIntFromType(field.Type(), param)\n\n\t\treturn field.Int() < p\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\tp := asUint(param)\n\n\t\treturn field.Uint() < p\n\n\tcase reflect.Float32:\n\t\tp := asFloat32(param)\n\n\t\treturn field.Float() < p\n\n\tcase reflect.Float64:\n\t\tp := asFloat64(param)\n\n\t\treturn field.Float() < p\n\n\tcase reflect.Struct:\n\n\t\tif field.Type().ConvertibleTo(timeType) {\n\t\t\treturn getValue(field.Convert(timeType)).(time.Time).Before(time.Now().UTC())\n\t\t}\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// hasMaxOf is the validation function for validating if the current field's value is less than or equal to the param's value.\nfunc hasMaxOf(fl FieldLevel) bool {\n\treturn isLte(fl)\n}\n\n// isTCP4AddrResolvable is the validation function for validating if the field's value is a resolvable tcp4 address.\nfunc isTCP4AddrResolvable(fl FieldLevel) bool {\n\tif !isIP4Addr(fl) {\n\t\treturn false\n\t}\n\n\t_, err := net.ResolveTCPAddr(\"tcp4\", fl.Field().String())\n\treturn err == nil\n}\n\n// isTCP6AddrResolvable is the validation function for validating if the field's value is a resolvable tcp6 address.\nfunc isTCP6AddrResolvable(fl FieldLevel) bool {\n\tif !isIP6Addr(fl) {\n\t\treturn false\n\t}\n\n\t_, err := net.ResolveTCPAddr(\"tcp6\", fl.Field().String())\n\n\treturn err == nil\n}\n\n// isTCPAddrResolvable is the validation function for validating if the field's value is a resolvable tcp address.\nfunc isTCPAddrResolvable(fl FieldLevel) bool {\n\tif !isIP4Addr(fl) && !isIP6Addr(fl) {\n\t\treturn false\n\t}\n\n\t_, err := net.ResolveTCPAddr(\"tcp\", fl.Field().String())\n\n\treturn err == nil\n}\n\n// isUDP4AddrResolvable is the validation function for validating if the field's value is a resolvable udp4 address.\nfunc isUDP4AddrResolvable(fl FieldLevel) bool {\n\tif !isIP4Addr(fl) {\n\t\treturn false\n\t}\n\n\t_, err := net.ResolveUDPAddr(\"udp4\", fl.Field().String())\n\n\treturn err == nil\n}\n\n// isUDP6AddrResolvable is the validation function for validating if the field's value is a resolvable udp6 address.\nfunc isUDP6AddrResolvable(fl FieldLevel) bool {\n\tif !isIP6Addr(fl) {\n\t\treturn false\n\t}\n\n\t_, err := net.ResolveUDPAddr(\"udp6\", fl.Field().String())\n\n\treturn err == nil\n}\n\n// isUDPAddrResolvable is the validation function for validating if the field's value is a resolvable udp address.\nfunc isUDPAddrResolvable(fl FieldLevel) bool {\n\tif !isIP4Addr(fl) && !isIP6Addr(fl) {\n\t\treturn false\n\t}\n\n\t_, err := net.ResolveUDPAddr(\"udp\", fl.Field().String())\n\n\treturn err == nil\n}\n\n// isIP4AddrResolvable is the validation function for validating if the field's value is a resolvable ip4 address.\nfunc isIP4AddrResolvable(fl FieldLevel) bool {\n\tif !isIPv4(fl) {\n\t\treturn false\n\t}\n\n\t_, err := net.ResolveIPAddr(\"ip4\", fl.Field().String())\n\n\treturn err == nil\n}\n\n// isIP6AddrResolvable is the validation function for validating if the field's value is a resolvable ip6 address.\nfunc isIP6AddrResolvable(fl FieldLevel) bool {\n\tif !isIPv6(fl) {\n\t\treturn false\n\t}\n\n\t_, err := net.ResolveIPAddr(\"ip6\", fl.Field().String())\n\n\treturn err == nil\n}\n\n// isIPAddrResolvable is the validation function for validating if the field's value is a resolvable ip address.\nfunc isIPAddrResolvable(fl FieldLevel) bool {\n\tif !isIP(fl) {\n\t\treturn false\n\t}\n\n\t_, err := net.ResolveIPAddr(\"ip\", fl.Field().String())\n\n\treturn err == nil\n}\n\n// isUnixAddrResolvable is the validation function for validating if the field's value is a resolvable unix address.\nfunc isUnixAddrResolvable(fl FieldLevel) bool {\n\t_, err := net.ResolveUnixAddr(\"unix\", fl.Field().String())\n\n\treturn err == nil\n}\n\n// isUnixDomainSocketExists is the validation function for validating if the field's value is an existing Unix domain socket.\n// It handles both filesystem-based sockets and Linux abstract sockets.\n// It always returns false for Windows.\nfunc isUnixDomainSocketExists(fl FieldLevel) bool {\n\tif runtime.GOOS == \"windows\" {\n\t\treturn false\n\t}\n\n\tsockpath := fl.Field().String()\n\n\tif sockpath == \"\" {\n\t\treturn false\n\t}\n\n\t// On Linux, check for abstract sockets (prefixed with @)\n\tif runtime.GOOS == \"linux\" && strings.HasPrefix(sockpath, \"@\") {\n\t\treturn isAbstractSocketExists(sockpath)\n\t}\n\n\t// For filesystem-based sockets, check if the path exists and is a socket\n\tstats, err := os.Stat(sockpath)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn stats.Mode().Type() == fs.ModeSocket\n}\n\n// isAbstractSocketExists checks if a Linux abstract socket exists by reading /proc/net/unix.\n// Abstract sockets are identified by an @ prefix in human-readable form.\nfunc isAbstractSocketExists(sockpath string) bool {\n\tfile, err := os.Open(\"/proc/net/unix\")\n\tif err != nil {\n\t\treturn false\n\t}\n\tdefer func() {\n\t\t_ = file.Close()\n\t}()\n\n\tscanner := bufio.NewScanner(file)\n\n\t// Skip the header line\n\tif !scanner.Scan() {\n\t\treturn false\n\t}\n\n\t// Abstract sockets in /proc/net/unix are represented with @ prefix\n\t// The socket path is the last field in each line\n\tfor scanner.Scan() {\n\t\tline := scanner.Text()\n\t\tfields := strings.Fields(line)\n\n\t\t// The path is the last field (8th field typically)\n\t\tif len(fields) >= 8 {\n\t\t\tpath := fields[len(fields)-1]\n\t\t\tif path == sockpath {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc isIP4Addr(fl FieldLevel) bool {\n\tval := fl.Field().String()\n\n\tif idx := strings.LastIndex(val, \":\"); idx != -1 {\n\t\tval = val[0:idx]\n\t}\n\n\tip := net.ParseIP(val)\n\n\treturn ip != nil && ip.To4() != nil\n}\n\nfunc isIP6Addr(fl FieldLevel) bool {\n\tval := fl.Field().String()\n\n\tif idx := strings.LastIndex(val, \":\"); idx != -1 {\n\t\tif idx != 0 && val[idx-1:idx] == \"]\" {\n\t\t\tval = val[1 : idx-1]\n\t\t}\n\t}\n\n\tip := net.ParseIP(val)\n\n\treturn ip != nil && ip.To4() == nil\n}\n\nfunc isHostnameRFC952(fl FieldLevel) bool {\n\treturn hostnameRegexRFC952().MatchString(fl.Field().String())\n}\n\nfunc isHostnameRFC1123(fl FieldLevel) bool {\n\treturn hostnameRegexRFC1123().MatchString(fl.Field().String())\n}\n\nfunc isFQDN(fl FieldLevel) bool {\n\tval := fl.Field().String()\n\n\tif val == \"\" {\n\t\treturn false\n\t}\n\n\treturn fqdnRegexRFC1123().MatchString(val)\n}\n\n// isDir is the validation function for validating if the current field's value is a valid existing directory.\nfunc isDir(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tif field.Kind() == reflect.String {\n\t\tfileInfo, err := os.Stat(field.String())\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\n\t\treturn fileInfo.IsDir()\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isDirPath is the validation function for validating if the current field's value is a valid directory.\nfunc isDirPath(fl FieldLevel) bool {\n\tvar exists bool\n\tvar err error\n\n\tfield := fl.Field()\n\n\t// If it exists, it obviously is valid.\n\t// This is done first to avoid code duplication and unnecessary additional logic.\n\tif exists = isDir(fl); exists {\n\t\treturn true\n\t}\n\n\t// It does not exist but may still be a valid path.\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\t// Every OS allows for whitespace, but none\n\t\t// let you use a dir with no name (to my knowledge).\n\t\t// Unless you're dealing with raw inodes, but I digress.\n\t\tif strings.TrimSpace(field.String()) == \"\" {\n\t\t\treturn false\n\t\t}\n\t\tif _, err = os.Stat(field.String()); err != nil {\n\t\t\tswitch t := err.(type) {\n\t\t\tcase *fs.PathError:\n\t\t\t\tif t.Err == syscall.EINVAL {\n\t\t\t\t\t// It's definitely an invalid character in the path.\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\t// It could be a permission error, a does-not-exist error, etc.\n\t\t\t\t// Out-of-scope for this validation, though.\n\t\t\t\t// Lastly, we make sure it is a directory.\n\t\t\t\tif strings.HasSuffix(field.String(), string(os.PathSeparator)) {\n\t\t\t\t\treturn true\n\t\t\t\t} else {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\t// Something went *seriously* wrong.\n\t\t\t\t/*\n\t\t\t\t\tPer https://pkg.go.dev/os#Stat:\n\t\t\t\t\t\t\"If there is an error, it will be of type *PathError.\"\n\t\t\t\t*/\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}\n\t\t// We repeat the check here to make sure it is an explicit directory in case the above os.Stat didn't trigger an error.\n\t\tif strings.HasSuffix(field.String(), string(os.PathSeparator)) {\n\t\t\treturn true\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isJSON is the validation function for validating if the current field's value is a valid json string.\nfunc isJSON(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\tval := field.String()\n\t\treturn json.Valid([]byte(val))\n\tcase reflect.Slice:\n\t\tfieldType := field.Type()\n\n\t\tif fieldType.ConvertibleTo(byteSliceType) {\n\t\t\tb := getValue(field.Convert(byteSliceType)).([]byte)\n\t\t\treturn json.Valid(b)\n\t\t}\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isJWT is the validation function for validating if the current field's value is a valid JWT string.\nfunc isJWT(fl FieldLevel) bool {\n\treturn jWTRegex().MatchString(fl.Field().String())\n}\n\n// isHostnamePort validates a <dns>:<port> combination for fields typically used for socket address.\nfunc isHostnamePort(fl FieldLevel) bool {\n\tval := fl.Field().String()\n\thost, port, err := net.SplitHostPort(val)\n\tif err != nil {\n\t\treturn false\n\t}\n\t// Port must be a iny <= 65535.\n\tif portNum, err := strconv.ParseInt(\n\t\tport, 10, 32,\n\t); err != nil || portNum > 65535 || portNum < 1 {\n\t\treturn false\n\t}\n\n\t// If host is specified, it should match a DNS name\n\tif host != \"\" {\n\t\treturn hostnameRegexRFC1123().MatchString(host)\n\t}\n\treturn true\n}\n\n// IsPort validates if the current field's value represents a valid port\nfunc isPort(fl FieldLevel) bool {\n\tval := fl.Field().Uint()\n\n\treturn val >= 1 && val <= 65535\n}\n\n// isLowercase is the validation function for validating if the current field's value is a lowercase string.\nfunc isLowercase(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tif field.Kind() == reflect.String {\n\t\tif field.String() == \"\" {\n\t\t\treturn false\n\t\t}\n\t\treturn field.String() == strings.ToLower(field.String())\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isUppercase is the validation function for validating if the current field's value is an uppercase string.\nfunc isUppercase(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tif field.Kind() == reflect.String {\n\t\tif field.String() == \"\" {\n\t\t\treturn false\n\t\t}\n\t\treturn field.String() == strings.ToUpper(field.String())\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isDatetime is the validation function for validating if the current field's value is a valid datetime string.\nfunc isDatetime(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tparam := fl.Param()\n\n\tif field.Kind() == reflect.String {\n\t\t_, err := time.Parse(param, field.String())\n\n\t\treturn err == nil\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isTimeZone is the validation function for validating if the current field's value is a valid time zone string.\nfunc isTimeZone(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tif field.Kind() == reflect.String {\n\t\t// empty value is converted to UTC by time.LoadLocation but disallow it as it is not a valid time zone name\n\t\tif field.String() == \"\" {\n\t\t\treturn false\n\t\t}\n\n\t\t// 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\n\t\tif strings.ToLower(field.String()) == \"local\" {\n\t\t\treturn false\n\t\t}\n\n\t\t_, err := time.LoadLocation(field.String())\n\t\treturn err == nil\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isIso3166Alpha2 is the validation function for validating if the current field's value is a valid iso3166-1 alpha-2 country code.\nfunc isIso3166Alpha2(fl FieldLevel) bool {\n\t_, ok := iso3166_1_alpha2[fl.Field().String()]\n\treturn ok\n}\n\n// isIso3166Alpha2EU is the validation function for validating if the current field's value is a valid iso3166-1 alpha-2 European Union country code.\nfunc isIso3166Alpha2EU(fl FieldLevel) bool {\n\t_, ok := iso3166_1_alpha2_eu[fl.Field().String()]\n\treturn ok\n}\n\n// isIso3166Alpha3 is the validation function for validating if the current field's value is a valid iso3166-1 alpha-3 country code.\nfunc isIso3166Alpha3(fl FieldLevel) bool {\n\t_, ok := iso3166_1_alpha3[fl.Field().String()]\n\treturn ok\n}\n\n// isIso3166Alpha3EU is the validation function for validating if the current field's value is a valid iso3166-1 alpha-3 European Union country code.\nfunc isIso3166Alpha3EU(fl FieldLevel) bool {\n\t_, ok := iso3166_1_alpha3_eu[fl.Field().String()]\n\treturn ok\n}\n\n// isIso3166AlphaNumeric is the validation function for validating if the current field's value is a valid iso3166-1 alpha-numeric country code.\nfunc isIso3166AlphaNumeric(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tvar code int\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\ti, err := strconv.Atoi(field.String())\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t\tcode = i % 1000\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tcode = int(field.Int() % 1000)\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\tcode = int(field.Uint() % 1000)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n\t}\n\n\t_, ok := iso3166_1_alpha_numeric[code]\n\treturn ok\n}\n\n// isIso3166AlphaNumericEU is the validation function for validating if the current field's value is a valid iso3166-1 alpha-numeric European Union country code.\nfunc isIso3166AlphaNumericEU(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tvar code int\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\ti, err := strconv.Atoi(field.String())\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t\tcode = i % 1000\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tcode = int(field.Int() % 1000)\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\tcode = int(field.Uint() % 1000)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n\t}\n\n\t_, ok := iso3166_1_alpha_numeric_eu[code]\n\treturn ok\n}\n\n// isIso31662 is the validation function for validating if the current field's value is a valid iso3166-2 code.\nfunc isIso31662(fl FieldLevel) bool {\n\t_, ok := iso3166_2[fl.Field().String()]\n\treturn ok\n}\n\n// isIso4217 is the validation function for validating if the current field's value is a valid iso4217 currency code.\nfunc isIso4217(fl FieldLevel) bool {\n\t_, ok := iso4217[fl.Field().String()]\n\treturn ok\n}\n\n// isIso4217Numeric is the validation function for validating if the current field's value is a valid iso4217 numeric currency code.\nfunc isIso4217Numeric(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tvar code int\n\tswitch field.Kind() {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tcode = int(field.Int())\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\tcode = int(field.Uint())\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n\t}\n\n\t_, ok := iso4217_numeric[code]\n\treturn ok\n}\n\n// 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\nfunc isBCP47LanguageTag(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tif field.Kind() == reflect.String {\n\t\t_, err := language.Parse(field.String())\n\t\treturn err == nil\n\t}\n\n\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n}\n\n// isIsoBic2014Format is the validation function for validating if the current field's value is a valid Business Identifier Code (SWIFT code), defined in ISO 9362 2014\nfunc isIsoBic2014Format(fl FieldLevel) bool {\n\tbicString := fl.Field().String()\n\n\treturn bic2014Regex().MatchString(bicString)\n}\n\n// isIsoBic2022Format is the validation function for validating if the current field's value is a valid Business Identifier Code (SWIFT code), defined in ISO 9362 2022\nfunc isIsoBic2022Format(fl FieldLevel) bool {\n\tbicString := fl.Field().String()\n\n\treturn bic2022Regex().MatchString(bicString)\n}\n\n// 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\nfunc isSemverFormat(fl FieldLevel) bool {\n\tsemverString := fl.Field().String()\n\n\treturn semverRegex().MatchString(semverString)\n}\n\n// isCveFormat is the validation function for validating if the current field's value is a valid cve id, defined in CVE mitre org\nfunc isCveFormat(fl FieldLevel) bool {\n\tcveString := fl.Field().String()\n\n\treturn cveRegex().MatchString(cveString)\n}\n\n// isDnsRFC1035LabelFormat is the validation function\n// for validating if the current field's value is\n// a valid dns RFC 1035 label, defined in RFC 1035.\nfunc isDnsRFC1035LabelFormat(fl FieldLevel) bool {\n\tval := fl.Field().String()\n\n\tsize := len(val)\n\tif size > 63 {\n\t\treturn false\n\t}\n\n\treturn dnsRegexRFC1035Label().MatchString(val)\n}\n\n// digitsHaveLuhnChecksum returns true if and only if the last element of the given digits slice is the Luhn checksum of the previous elements\nfunc digitsHaveLuhnChecksum(digits []string) bool {\n\tsize := len(digits)\n\tsum := 0\n\tfor i, digit := range digits {\n\t\tvalue, err := strconv.Atoi(digit)\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t\tif size%2 == 0 && i%2 == 0 || size%2 == 1 && i%2 == 1 {\n\t\t\tv := value * 2\n\t\t\tif v >= 10 {\n\t\t\t\tsum += 1 + (v % 10)\n\t\t\t} else {\n\t\t\t\tsum += v\n\t\t\t}\n\t\t} else {\n\t\t\tsum += value\n\t\t}\n\t}\n\treturn (sum % 10) == 0\n}\n\n// isMongoDBObjectId is the validation function for validating if the current field's value is valid MongoDB ObjectID\nfunc isMongoDBObjectId(fl FieldLevel) bool {\n\tval := fl.Field().String()\n\treturn mongodbIdRegex().MatchString(val)\n}\n\n// isMongoDBConnectionString is the validation function for validating if the current field's value is valid MongoDB Connection String\nfunc isMongoDBConnectionString(fl FieldLevel) bool {\n\tval := fl.Field().String()\n\treturn mongodbConnectionRegex().MatchString(val)\n}\n\n// isSpiceDB is the validation function for validating if the current field's value is valid for use with Authzed SpiceDB in the indicated way\nfunc isSpiceDB(fl FieldLevel) bool {\n\tval := fl.Field().String()\n\tparam := fl.Param()\n\n\tswitch param {\n\tcase \"permission\":\n\t\treturn spicedbPermissionRegex().MatchString(val)\n\tcase \"type\":\n\t\treturn spicedbTypeRegex().MatchString(val)\n\tcase \"id\", \"\":\n\t\treturn spicedbIDRegex().MatchString(val)\n\t}\n\n\tpanic(\"Unrecognized parameter: \" + param)\n}\n\n// isCreditCard is the validation function for validating if the current field's value is a valid credit card number\nfunc isCreditCard(fl FieldLevel) bool {\n\tval := fl.Field().String()\n\tvar creditCard bytes.Buffer\n\tsegments := strings.Split(val, \" \")\n\tfor _, segment := range segments {\n\t\tif len(segment) < 3 {\n\t\t\treturn false\n\t\t}\n\t\tcreditCard.WriteString(segment)\n\t}\n\n\tccDigits := strings.Split(creditCard.String(), \"\")\n\tsize := len(ccDigits)\n\tif size < 12 || size > 19 {\n\t\treturn false\n\t}\n\n\treturn digitsHaveLuhnChecksum(ccDigits)\n}\n\n// hasLuhnChecksum is the validation for validating if the current field's value has a valid Luhn checksum\nfunc hasLuhnChecksum(fl FieldLevel) bool {\n\tfield := fl.Field()\n\tvar 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\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\tstr = field.String()\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tstr = strconv.FormatInt(field.Int(), 10)\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\tstr = strconv.FormatUint(field.Uint(), 10)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"Bad field type %s\", field.Type()))\n\t}\n\tsize := len(str)\n\tif size < 2 { // there has to be at least one digit that carries a meaning + the checksum\n\t\treturn false\n\t}\n\tdigits := strings.Split(str, \"\")\n\treturn digitsHaveLuhnChecksum(digits)\n}\n\n// isCron is the validation function for validating if the current field's value is a valid cron expression\nfunc isCron(fl FieldLevel) bool {\n\tcronString := fl.Field().String()\n\treturn cronRegex().MatchString(cronString)\n}\n\n// isEIN is the validation function for validating if the current field's value is a valid U.S. Employer Identification Number (EIN)\nfunc isEIN(fl FieldLevel) bool {\n\tfield := fl.Field()\n\n\tif field.Len() != 10 {\n\t\treturn false\n\t}\n\n\treturn einRegex().MatchString(field.String())\n}\n\nfunc isValidateFn(fl FieldLevel) bool {\n\tconst defaultParam = `Validate`\n\n\tfield := fl.Field()\n\tvalidateFn := cmp.Or(fl.Param(), defaultParam)\n\n\tok, err := tryCallValidateFn(field, validateFn)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn ok\n}\n\nvar (\n\terrMethodNotFound          = errors.New(`method not found`)\n\terrMethodReturnNoValues    = errors.New(`method return o values (void)`)\n\terrMethodReturnInvalidType = errors.New(`method should return invalid type`)\n)\n\nfunc tryCallValidateFn(field reflect.Value, validateFn string) (bool, error) {\n\tmethod := field.MethodByName(validateFn)\n\tif field.CanAddr() && !method.IsValid() {\n\t\tmethod = field.Addr().MethodByName(validateFn)\n\t}\n\n\tif !method.IsValid() {\n\t\treturn false, fmt.Errorf(\"unable to call %q on type %q: %w\",\n\t\t\tvalidateFn, field.Type().String(), errMethodNotFound)\n\t}\n\n\treturnValues := method.Call([]reflect.Value{})\n\tif len(returnValues) == 0 {\n\t\treturn false, fmt.Errorf(\"unable to use result of method %q on type %q: %w\",\n\t\t\tvalidateFn, field.Type().String(), errMethodReturnNoValues)\n\t}\n\n\tfirstReturnValue := returnValues[0]\n\n\tswitch firstReturnValue.Kind() {\n\tcase reflect.Bool:\n\t\treturn firstReturnValue.Bool(), nil\n\tcase reflect.Interface:\n\t\terrorType := reflect.TypeOf((*error)(nil)).Elem()\n\n\t\tif firstReturnValue.Type().Implements(errorType) {\n\t\t\treturn firstReturnValue.IsNil(), nil\n\t\t}\n\n\t\treturn false, fmt.Errorf(\"unable to use result of method %q on type %q: %w (got interface %v expect error)\",\n\t\t\tvalidateFn, field.Type().String(), errMethodReturnInvalidType, firstReturnValue.Type().String())\n\tdefault:\n\t\treturn false, fmt.Errorf(\"unable to use result of method %q on type %q: %w (got %v expect error or bool)\",\n\t\t\tvalidateFn, field.Type().String(), errMethodReturnInvalidType, firstReturnValue.Type().String())\n\t}\n}\n"
  },
  {
    "path": "benchmarks_test.go",
    "content": "package validator\n\nimport (\n\t\"bytes\"\n\tsql \"database/sql/driver\"\n\t\"errors\"\n\t\"testing\"\n\t\"time\"\n)\n\nfunc BenchmarkFieldSuccess(b *testing.B) {\n\tvalidate := New()\n\ts := \"1\"\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Var(&s, \"len=1\")\n\t}\n}\n\nfunc BenchmarkFieldSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\ts := \"1\"\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Var(&s, \"len=1\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkFieldFailure(b *testing.B) {\n\tvalidate := New()\n\ts := \"12\"\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Var(&s, \"len=1\")\n\t}\n}\n\nfunc BenchmarkFieldFailureParallel(b *testing.B) {\n\tvalidate := New()\n\ts := \"12\"\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Var(&s, \"len=1\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkFieldArrayDiveSuccess(b *testing.B) {\n\tvalidate := New()\n\tm := []string{\"val1\", \"val2\", \"val3\"}\n\n\tb.ResetTimer()\n\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Var(m, \"required,dive,required\")\n\t}\n}\n\nfunc BenchmarkFieldArrayDiveSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\tm := []string{\"val1\", \"val2\", \"val3\"}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Var(m, \"required,dive,required\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkFieldArrayDiveFailure(b *testing.B) {\n\tvalidate := New()\n\tm := []string{\"val1\", \"\", \"val3\"}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Var(m, \"required,dive,required\")\n\t}\n}\n\nfunc BenchmarkFieldArrayDiveFailureParallel(b *testing.B) {\n\tvalidate := New()\n\tm := []string{\"val1\", \"\", \"val3\"}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Var(m, \"required,dive,required\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkFieldMapDiveSuccess(b *testing.B) {\n\tvalidate := New()\n\tm := map[string]string{\"val1\": \"val1\", \"val2\": \"val2\", \"val3\": \"val3\"}\n\n\tb.ResetTimer()\n\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Var(m, \"required,dive,required\")\n\t}\n}\n\nfunc BenchmarkFieldMapDiveSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\tm := map[string]string{\"val1\": \"val1\", \"val2\": \"val2\", \"val3\": \"val3\"}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Var(m, \"required,dive,required\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkFieldMapDiveFailure(b *testing.B) {\n\tvalidate := New()\n\tm := map[string]string{\"\": \"\", \"val3\": \"val3\"}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Var(m, \"required,dive,required\")\n\t}\n}\n\nfunc BenchmarkFieldMapDiveFailureParallel(b *testing.B) {\n\tvalidate := New()\n\tm := map[string]string{\"\": \"\", \"val3\": \"val3\"}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Var(m, \"required,dive,required\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkFieldMapDiveWithKeysSuccess(b *testing.B) {\n\tvalidate := New()\n\tm := map[string]string{\"val1\": \"val1\", \"val2\": \"val2\", \"val3\": \"val3\"}\n\n\tb.ResetTimer()\n\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Var(m, \"required,dive,keys,required,endkeys,required\")\n\t}\n}\n\nfunc BenchmarkFieldMapDiveWithKeysSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\tm := map[string]string{\"val1\": \"val1\", \"val2\": \"val2\", \"val3\": \"val3\"}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Var(m, \"required,dive,keys,required,endkeys,required\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkFieldMapDiveWithKeysFailure(b *testing.B) {\n\tvalidate := New()\n\tm := map[string]string{\"\": \"\", \"val3\": \"val3\"}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Var(m, \"required,dive,keys,required,endkeys,required\")\n\t}\n}\n\nfunc BenchmarkFieldMapDiveWithKeysFailureParallel(b *testing.B) {\n\tvalidate := New()\n\tm := map[string]string{\"\": \"\", \"val3\": \"val3\"}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Var(m, \"required,dive,keys,required,endkeys,required\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkFieldCustomTypeSuccess(b *testing.B) {\n\tvalidate := New()\n\tvalidate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})\n\tval := valuer{\n\t\tName: \"1\",\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Var(val, \"len=1\")\n\t}\n}\n\nfunc BenchmarkFieldCustomTypeSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\tvalidate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})\n\tval := valuer{\n\t\tName: \"1\",\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Var(val, \"len=1\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkFieldCustomTypeFailure(b *testing.B) {\n\tvalidate := New()\n\tvalidate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})\n\tval := valuer{}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Var(val, \"len=1\")\n\t}\n}\n\nfunc BenchmarkFieldCustomTypeFailureParallel(b *testing.B) {\n\tvalidate := New()\n\tvalidate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})\n\tval := valuer{}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Var(val, \"len=1\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkFieldOrTagSuccess(b *testing.B) {\n\tvalidate := New()\n\ts := \"rgba(0,0,0,1)\"\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Var(s, \"rgb|rgba\")\n\t}\n}\n\nfunc BenchmarkFieldOrTagSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\ts := \"rgba(0,0,0,1)\"\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Var(s, \"rgb|rgba\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkFieldOrTagFailure(b *testing.B) {\n\tvalidate := New()\n\ts := \"#000\"\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Var(s, \"rgb|rgba\")\n\t}\n}\n\nfunc BenchmarkFieldOrTagFailureParallel(b *testing.B) {\n\tvalidate := New()\n\ts := \"#000\"\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Var(s, \"rgb|rgba\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructLevelValidationSuccess(b *testing.B) {\n\tvalidate := New()\n\tvalidate.RegisterStructValidation(StructValidationTestStructSuccess, TestStruct{})\n\n\ttst := TestStruct{\n\t\tString: \"good value\",\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Struct(tst)\n\t}\n}\n\nfunc BenchmarkStructLevelValidationSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\tvalidate.RegisterStructValidation(StructValidationTestStructSuccess, TestStruct{})\n\n\ttst := TestStruct{\n\t\tString: \"good value\",\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Struct(tst)\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructLevelValidationFailure(b *testing.B) {\n\tvalidate := New()\n\tvalidate.RegisterStructValidation(StructValidationTestStruct, TestStruct{})\n\n\ttst := TestStruct{\n\t\tString: \"good value\",\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Struct(tst)\n\t}\n}\n\nfunc BenchmarkStructLevelValidationFailureParallel(b *testing.B) {\n\tvalidate := New()\n\tvalidate.RegisterStructValidation(StructValidationTestStruct, TestStruct{})\n\n\ttst := TestStruct{\n\t\tString: \"good value\",\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Struct(tst)\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructSimpleCustomTypeSuccess(b *testing.B) {\n\tvalidate := New()\n\tvalidate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})\n\n\tval := valuer{\n\t\tName: \"1\",\n\t}\n\n\ttype Foo struct {\n\t\tValuer   valuer `validate:\"len=1\"`\n\t\tIntValue int    `validate:\"min=5,max=10\"`\n\t}\n\n\tvalidFoo := &Foo{Valuer: val, IntValue: 7}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Struct(validFoo)\n\t}\n}\n\nfunc BenchmarkStructSimpleCustomTypeSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\tvalidate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})\n\tval := valuer{\n\t\tName: \"1\",\n\t}\n\n\ttype Foo struct {\n\t\tValuer   valuer `validate:\"len=1\"`\n\t\tIntValue int    `validate:\"min=5,max=10\"`\n\t}\n\tvalidFoo := &Foo{Valuer: val, IntValue: 7}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Struct(validFoo)\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructSimpleCustomTypeFailure(b *testing.B) {\n\tvalidate := New()\n\tvalidate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})\n\n\tval := valuer{}\n\n\ttype Foo struct {\n\t\tValuer   valuer `validate:\"len=1\"`\n\t\tIntValue int    `validate:\"min=5,max=10\"`\n\t}\n\tvalidFoo := &Foo{Valuer: val, IntValue: 3}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Struct(validFoo)\n\t}\n}\n\nfunc BenchmarkStructSimpleCustomTypeFailureParallel(b *testing.B) {\n\tvalidate := New()\n\tvalidate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{})\n\n\tval := valuer{}\n\n\ttype Foo struct {\n\t\tValuer   valuer `validate:\"len=1\"`\n\t\tIntValue int    `validate:\"min=5,max=10\"`\n\t}\n\tvalidFoo := &Foo{Valuer: val, IntValue: 3}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Struct(validate.Struct(validFoo))\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructFilteredSuccess(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tName     string `validate:\"required\"`\n\t\tNickName string `validate:\"required\"`\n\t}\n\n\ttest := &Test{\n\t\tName: \"Joey Bloggs\",\n\t}\n\tbyts := []byte(\"Name\")\n\tfn := func(ns []byte) bool {\n\t\treturn !bytes.HasSuffix(ns, byts)\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.StructFiltered(test, fn)\n\t}\n}\n\nfunc BenchmarkStructFilteredSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tName     string `validate:\"required\"`\n\t\tNickName string `validate:\"required\"`\n\t}\n\n\ttest := &Test{\n\t\tName: \"Joey Bloggs\",\n\t}\n\tbyts := []byte(\"Name\")\n\tfn := func(ns []byte) bool {\n\t\treturn !bytes.HasSuffix(ns, byts)\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.StructFiltered(test, fn)\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructFilteredFailure(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tName     string `validate:\"required\"`\n\t\tNickName string `validate:\"required\"`\n\t}\n\n\ttest := &Test{\n\t\tName: \"Joey Bloggs\",\n\t}\n\n\tbyts := []byte(\"NickName\")\n\n\tfn := func(ns []byte) bool {\n\t\treturn !bytes.HasSuffix(ns, byts)\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.StructFiltered(test, fn)\n\t}\n}\n\nfunc BenchmarkStructFilteredFailureParallel(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tName     string `validate:\"required\"`\n\t\tNickName string `validate:\"required\"`\n\t}\n\n\ttest := &Test{\n\t\tName: \"Joey Bloggs\",\n\t}\n\tbyts := []byte(\"NickName\")\n\tfn := func(ns []byte) bool {\n\t\treturn !bytes.HasSuffix(ns, byts)\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.StructFiltered(test, fn)\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructPartialSuccess(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tName     string `validate:\"required\"`\n\t\tNickName string `validate:\"required\"`\n\t}\n\n\ttest := &Test{\n\t\tName: \"Joey Bloggs\",\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.StructPartial(test, \"Name\")\n\t}\n}\n\nfunc BenchmarkStructPartialSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tName     string `validate:\"required\"`\n\t\tNickName string `validate:\"required\"`\n\t}\n\n\ttest := &Test{\n\t\tName: \"Joey Bloggs\",\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.StructPartial(test, \"Name\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructPartialFailure(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tName     string `validate:\"required\"`\n\t\tNickName string `validate:\"required\"`\n\t}\n\n\ttest := &Test{\n\t\tName: \"Joey Bloggs\",\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.StructPartial(test, \"NickName\")\n\t}\n}\n\nfunc BenchmarkStructPartialFailureParallel(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tName     string `validate:\"required\"`\n\t\tNickName string `validate:\"required\"`\n\t}\n\n\ttest := &Test{\n\t\tName: \"Joey Bloggs\",\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.StructPartial(test, \"NickName\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructExceptSuccess(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tName     string `validate:\"required\"`\n\t\tNickName string `validate:\"required\"`\n\t}\n\n\ttest := &Test{\n\t\tName: \"Joey Bloggs\",\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.StructExcept(test, \"Nickname\")\n\t}\n}\n\nfunc BenchmarkStructExceptSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tName     string `validate:\"required\"`\n\t\tNickName string `validate:\"required\"`\n\t}\n\n\ttest := &Test{\n\t\tName: \"Joey Bloggs\",\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.StructExcept(test, \"NickName\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructExceptFailure(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tName     string `validate:\"required\"`\n\t\tNickName string `validate:\"required\"`\n\t}\n\n\ttest := &Test{\n\t\tName: \"Joey Bloggs\",\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.StructExcept(test, \"Name\")\n\t}\n}\n\nfunc BenchmarkStructExceptFailureParallel(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tName     string `validate:\"required\"`\n\t\tNickName string `validate:\"required\"`\n\t}\n\n\ttest := &Test{\n\t\tName: \"Joey Bloggs\",\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.StructExcept(test, \"Name\")\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructSimpleCrossFieldSuccess(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tStart time.Time\n\t\tEnd   time.Time `validate:\"gtfield=Start\"`\n\t}\n\n\tnow := time.Now().UTC()\n\tthen := now.Add(time.Hour * 5)\n\ttest := &Test{\n\t\tStart: now,\n\t\tEnd:   then,\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Struct(test)\n\t}\n}\n\nfunc BenchmarkStructSimpleCrossFieldSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tStart time.Time\n\t\tEnd   time.Time `validate:\"gtfield=Start\"`\n\t}\n\n\tnow := time.Now().UTC()\n\tthen := now.Add(time.Hour * 5)\n\ttest := &Test{\n\t\tStart: now,\n\t\tEnd:   then,\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Struct(test)\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructSimpleCrossFieldFailure(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tStart time.Time\n\t\tEnd   time.Time `validate:\"gtfield=Start\"`\n\t}\n\n\tnow := time.Now().UTC()\n\tthen := now.Add(time.Hour * -5)\n\n\ttest := &Test{\n\t\tStart: now,\n\t\tEnd:   then,\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Struct(test)\n\t}\n}\n\nfunc BenchmarkStructSimpleCrossFieldFailureParallel(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tStart time.Time\n\t\tEnd   time.Time `validate:\"gtfield=Start\"`\n\t}\n\n\tnow := time.Now().UTC()\n\tthen := now.Add(time.Hour * -5)\n\ttest := &Test{\n\t\tStart: now,\n\t\tEnd:   then,\n\t}\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Struct(test)\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructSimpleCrossStructCrossFieldSuccess(b *testing.B) {\n\tvalidate := New()\n\n\ttype Inner struct {\n\t\tStart time.Time\n\t}\n\n\ttype Outer struct {\n\t\tInner     *Inner\n\t\tCreatedAt time.Time `validate:\"eqcsfield=Inner.Start\"`\n\t}\n\n\tnow := time.Now().UTC()\n\tinner := &Inner{\n\t\tStart: now,\n\t}\n\touter := &Outer{\n\t\tInner:     inner,\n\t\tCreatedAt: now,\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Struct(outer)\n\t}\n}\n\nfunc BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\n\ttype Inner struct {\n\t\tStart time.Time\n\t}\n\n\ttype Outer struct {\n\t\tInner     *Inner\n\t\tCreatedAt time.Time `validate:\"eqcsfield=Inner.Start\"`\n\t}\n\n\tnow := time.Now().UTC()\n\tinner := &Inner{\n\t\tStart: now,\n\t}\n\touter := &Outer{\n\t\tInner:     inner,\n\t\tCreatedAt: now,\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Struct(outer)\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructSimpleCrossStructCrossFieldFailure(b *testing.B) {\n\tvalidate := New()\n\ttype Inner struct {\n\t\tStart time.Time\n\t}\n\n\ttype Outer struct {\n\t\tInner     *Inner\n\t\tCreatedAt time.Time `validate:\"eqcsfield=Inner.Start\"`\n\t}\n\n\tnow := time.Now().UTC()\n\tthen := now.Add(time.Hour * 5)\n\n\tinner := &Inner{\n\t\tStart: then,\n\t}\n\n\touter := &Outer{\n\t\tInner:     inner,\n\t\tCreatedAt: now,\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Struct(outer)\n\t}\n}\n\nfunc BenchmarkStructSimpleCrossStructCrossFieldFailureParallel(b *testing.B) {\n\tvalidate := New()\n\n\ttype Inner struct {\n\t\tStart time.Time\n\t}\n\n\ttype Outer struct {\n\t\tInner     *Inner\n\t\tCreatedAt time.Time `validate:\"eqcsfield=Inner.Start\"`\n\t}\n\n\tnow := time.Now().UTC()\n\tthen := now.Add(time.Hour * 5)\n\n\tinner := &Inner{\n\t\tStart: then,\n\t}\n\n\touter := &Outer{\n\t\tInner:     inner,\n\t\tCreatedAt: now,\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Struct(outer)\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructSimpleSuccess(b *testing.B) {\n\tvalidate := New()\n\ttype Foo struct {\n\t\tStringValue string `validate:\"min=5,max=10\"`\n\t\tIntValue    int    `validate:\"min=5,max=10\"`\n\t}\n\n\tvalidFoo := &Foo{StringValue: \"Foobar\", IntValue: 7}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Struct(validFoo)\n\t}\n}\n\nfunc BenchmarkStructSimpleSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\ttype Foo struct {\n\t\tStringValue string `validate:\"min=5,max=10\"`\n\t\tIntValue    int    `validate:\"min=5,max=10\"`\n\t}\n\tvalidFoo := &Foo{StringValue: \"Foobar\", IntValue: 7}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Struct(validFoo)\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructSimpleFailure(b *testing.B) {\n\tvalidate := New()\n\ttype Foo struct {\n\t\tStringValue string `validate:\"min=5,max=10\"`\n\t\tIntValue    int    `validate:\"min=5,max=10\"`\n\t}\n\n\tinvalidFoo := &Foo{StringValue: \"Fo\", IntValue: 3}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Struct(invalidFoo)\n\t}\n}\n\nfunc BenchmarkStructSimpleFailureParallel(b *testing.B) {\n\tvalidate := New()\n\ttype Foo struct {\n\t\tStringValue string `validate:\"min=5,max=10\"`\n\t\tIntValue    int    `validate:\"min=5,max=10\"`\n\t}\n\n\tinvalidFoo := &Foo{StringValue: \"Fo\", IntValue: 3}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Struct(invalidFoo)\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructComplexSuccess(b *testing.B) {\n\tvalidate := New()\n\ttSuccess := &TestString{\n\t\tRequired:  \"Required\",\n\t\tLen:       \"length==10\",\n\t\tMin:       \"min=1\",\n\t\tMax:       \"1234567890\",\n\t\tMinMax:    \"12345\",\n\t\tLt:        \"012345678\",\n\t\tLte:       \"0123456789\",\n\t\tGt:        \"01234567890\",\n\t\tGte:       \"0123456789\",\n\t\tOmitEmpty: \"\",\n\t\tSub: &SubTest{\n\t\t\tTest: \"1\",\n\t\t},\n\t\tSubIgnore: &SubTest{\n\t\t\tTest: \"\",\n\t\t},\n\t\tAnonymous: struct {\n\t\t\tA string `validate:\"required\"`\n\t\t}{\n\t\t\tA: \"1\",\n\t\t},\n\t\tIface: &Impl{\n\t\t\tF: \"123\",\n\t\t},\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Struct(tSuccess)\n\t}\n}\n\nfunc BenchmarkStructComplexSuccessParallel(b *testing.B) {\n\tvalidate := New()\n\ttSuccess := &TestString{\n\t\tRequired:  \"Required\",\n\t\tLen:       \"length==10\",\n\t\tMin:       \"min=1\",\n\t\tMax:       \"1234567890\",\n\t\tMinMax:    \"12345\",\n\t\tLt:        \"012345678\",\n\t\tLte:       \"0123456789\",\n\t\tGt:        \"01234567890\",\n\t\tGte:       \"0123456789\",\n\t\tOmitEmpty: \"\",\n\t\tSub: &SubTest{\n\t\t\tTest: \"1\",\n\t\t},\n\t\tSubIgnore: &SubTest{\n\t\t\tTest: \"\",\n\t\t},\n\t\tAnonymous: struct {\n\t\t\tA string `validate:\"required\"`\n\t\t}{\n\t\t\tA: \"1\",\n\t\t},\n\t\tIface: &Impl{\n\t\t\tF: \"123\",\n\t\t},\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Struct(tSuccess)\n\t\t}\n\t})\n}\n\nfunc BenchmarkStructComplexFailure(b *testing.B) {\n\tvalidate := New()\n\ttFail := &TestString{\n\t\tRequired:  \"\",\n\t\tLen:       \"\",\n\t\tMin:       \"\",\n\t\tMax:       \"12345678901\",\n\t\tMinMax:    \"\",\n\t\tLt:        \"0123456789\",\n\t\tLte:       \"01234567890\",\n\t\tGt:        \"1\",\n\t\tGte:       \"1\",\n\t\tOmitEmpty: \"12345678901\",\n\t\tSub: &SubTest{\n\t\t\tTest: \"\",\n\t\t},\n\t\tAnonymous: struct {\n\t\t\tA string `validate:\"required\"`\n\t\t}{\n\t\t\tA: \"\",\n\t\t},\n\t\tIface: &Impl{\n\t\t\tF: \"12\",\n\t\t},\n\t}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Struct(tFail)\n\t}\n}\n\nfunc BenchmarkStructComplexFailureParallel(b *testing.B) {\n\tvalidate := New()\n\ttFail := &TestString{\n\t\tRequired:  \"\",\n\t\tLen:       \"\",\n\t\tMin:       \"\",\n\t\tMax:       \"12345678901\",\n\t\tMinMax:    \"\",\n\t\tLt:        \"0123456789\",\n\t\tLte:       \"01234567890\",\n\t\tGt:        \"1\",\n\t\tGte:       \"1\",\n\t\tOmitEmpty: \"12345678901\",\n\t\tSub: &SubTest{\n\t\t\tTest: \"\",\n\t\t},\n\t\tAnonymous: struct {\n\t\t\tA string `validate:\"required\"`\n\t\t}{\n\t\t\tA: \"\",\n\t\t},\n\t\tIface: &Impl{\n\t\t\tF: \"12\",\n\t\t},\n\t}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Struct(tFail)\n\t\t}\n\t})\n}\n\ntype TestOneof struct {\n\tColor string `validate:\"oneof=red green\"`\n}\n\nfunc BenchmarkOneof(b *testing.B) {\n\tw := &TestOneof{Color: \"green\"}\n\tval := New()\n\tfor i := 0; i < b.N; i++ {\n\t\t_ = val.Struct(w)\n\t}\n}\n\nfunc BenchmarkOneofParallel(b *testing.B) {\n\tw := &TestOneof{Color: \"green\"}\n\tval := New()\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = val.Struct(w)\n\t\t}\n\t})\n}\n\ntype T struct{}\n\nfunc (*T) Validate() error { return errors.New(\"ops\") }\n\nfunc BenchmarkValidateFnSequential(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tT T `validate:\"validateFn\"`\n\t}\n\n\ttest := &Test{}\n\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\t_ = validate.Struct(test)\n\t}\n}\n\nfunc BenchmarkValidateFnParallel(b *testing.B) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tT T `validate:\"validateFn\"`\n\t}\n\n\ttest := &Test{}\n\n\tb.ResetTimer()\n\tb.RunParallel(func(pb *testing.PB) {\n\t\tfor pb.Next() {\n\t\t\t_ = validate.Struct(test)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "cache.go",
    "content": "package validator\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n)\n\ntype tagType uint8\n\nconst (\n\ttypeDefault tagType = iota\n\ttypeOmitEmpty\n\ttypeIsDefault\n\ttypeNoStructLevel\n\ttypeStructOnly\n\ttypeDive\n\ttypeOr\n\ttypeKeys\n\ttypeEndKeys\n\ttypeOmitNil\n\ttypeOmitZero\n)\n\nconst (\n\tinvalidValidation   = \"Invalid validation tag on field '%s'\"\n\tundefinedValidation = \"Undefined validation function '%s' on field '%s'\"\n\tkeysTagNotDefined   = \"'\" + endKeysTag + \"' tag encountered without a corresponding '\" + keysTag + \"' tag\"\n)\n\ntype structCache struct {\n\tlock sync.Mutex\n\tm    atomic.Value // map[reflect.Type]*cStruct\n}\n\nfunc (sc *structCache) Get(key reflect.Type) (c *cStruct, found bool) {\n\tc, found = sc.m.Load().(map[reflect.Type]*cStruct)[key]\n\treturn\n}\n\nfunc (sc *structCache) Set(key reflect.Type, value *cStruct) {\n\tm := sc.m.Load().(map[reflect.Type]*cStruct)\n\tnm := make(map[reflect.Type]*cStruct, len(m)+1)\n\tfor k, v := range m {\n\t\tnm[k] = v\n\t}\n\tnm[key] = value\n\tsc.m.Store(nm)\n}\n\ntype tagCache struct {\n\tlock sync.Mutex\n\tm    atomic.Value // map[string]*cTag\n}\n\nfunc (tc *tagCache) Get(key string) (c *cTag, found bool) {\n\tc, found = tc.m.Load().(map[string]*cTag)[key]\n\treturn\n}\n\nfunc (tc *tagCache) Set(key string, value *cTag) {\n\tm := tc.m.Load().(map[string]*cTag)\n\tnm := make(map[string]*cTag, len(m)+1)\n\tfor k, v := range m {\n\t\tnm[k] = v\n\t}\n\tnm[key] = value\n\ttc.m.Store(nm)\n}\n\ntype cStruct struct {\n\tname   string\n\tfields []*cField\n\tfn     StructLevelFuncCtx\n}\n\ntype cField struct {\n\tidx        int\n\tname       string\n\taltName    string\n\tnamesEqual bool\n\tcTags      *cTag\n}\n\ntype cTag struct {\n\ttag                  string\n\taliasTag             string\n\tactualAliasTag       string\n\tparam                string\n\tkeys                 *cTag // only populated when using tag's 'keys' and 'endkeys' for map key validation\n\tnext                 *cTag\n\tfn                   FuncCtx\n\ttypeof               tagType\n\thasTag               bool\n\thasAlias             bool\n\thasParam             bool // true if parameter used eg. eq= where the equal sign has been set\n\tisBlockEnd           bool // indicates the current tag represents the last validation in the block\n\trunValidationWhenNil bool\n}\n\nfunc (v *Validate) extractStructCache(current reflect.Value, sName string) *cStruct {\n\tv.structCache.lock.Lock()\n\tdefer v.structCache.lock.Unlock() // leave as defer! because if inner panics, it will never get unlocked otherwise!\n\n\ttyp := current.Type()\n\n\t// could have been multiple trying to access, but once first is done this ensures struct\n\t// isn't parsed again.\n\tcs, ok := v.structCache.Get(typ)\n\tif ok {\n\t\treturn cs\n\t}\n\n\tcs = &cStruct{name: sName, fields: make([]*cField, 0), fn: v.structLevelFuncs[typ]}\n\n\tnumFields := current.NumField()\n\trules := v.rules[typ]\n\n\tvar ctag *cTag\n\tvar fld reflect.StructField\n\tvar tag string\n\tvar customName string\n\n\tfor i := 0; i < numFields; i++ {\n\t\tfld = typ.Field(i)\n\n\t\tif !v.privateFieldValidation && !fld.Anonymous && len(fld.PkgPath) > 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tif rtag, ok := rules[fld.Name]; ok {\n\t\t\ttag = rtag\n\t\t} else {\n\t\t\ttag = fld.Tag.Get(v.tagName)\n\t\t}\n\n\t\tif tag == skipValidationTag {\n\t\t\tcontinue\n\t\t}\n\n\t\tcustomName = fld.Name\n\n\t\tif v.hasTagNameFunc {\n\t\t\tname := v.tagNameFunc(fld)\n\t\t\tif len(name) > 0 {\n\t\t\t\tcustomName = name\n\t\t\t}\n\t\t}\n\n\t\t// NOTE: cannot use shared tag cache, because tags may be equal, but things like alias may be different\n\t\t// and so only struct level caching can be used instead of combined with Field tag caching\n\n\t\tif len(tag) > 0 {\n\t\t\tctag, _ = v.parseFieldTagsRecursive(tag, fld.Name, \"\", false)\n\t\t} else {\n\t\t\t// even if field doesn't have validations need cTag for traversing to potential inner/nested\n\t\t\t// elements of the field.\n\t\t\tctag = new(cTag)\n\t\t}\n\n\t\tcs.fields = append(cs.fields, &cField{\n\t\t\tidx:        i,\n\t\t\tname:       fld.Name,\n\t\t\taltName:    customName,\n\t\t\tcTags:      ctag,\n\t\t\tnamesEqual: fld.Name == customName,\n\t\t})\n\t}\n\tv.structCache.Set(typ, cs)\n\treturn cs\n}\n\nfunc (v *Validate) parseFieldTagsRecursive(tag string, fieldName string, alias string, hasAlias bool) (firstCtag *cTag, current *cTag) {\n\tvar t string\n\tnoAlias := len(alias) == 0\n\ttags := strings.Split(tag, tagSeparator)\n\n\tfor i := 0; i < len(tags); i++ {\n\t\tt = tags[i]\n\t\tif noAlias {\n\t\t\talias = t\n\t\t}\n\n\t\t// check map for alias and process new tags, otherwise process as usual\n\t\tif tagsVal, found := v.aliases[t]; found {\n\t\t\tif i == 0 {\n\t\t\t\tfirstCtag, current = v.parseFieldTagsRecursive(tagsVal, fieldName, t, true)\n\t\t\t} else {\n\t\t\t\tnext, curr := v.parseFieldTagsRecursive(tagsVal, fieldName, t, true)\n\t\t\t\tcurrent.next, current = next, curr\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tvar prevTag tagType\n\n\t\tif i == 0 {\n\t\t\tcurrent = &cTag{aliasTag: alias, hasAlias: hasAlias, hasTag: true, typeof: typeDefault}\n\t\t\tfirstCtag = current\n\t\t} else {\n\t\t\tprevTag = current.typeof\n\t\t\tcurrent.next = &cTag{aliasTag: alias, hasAlias: hasAlias, hasTag: true}\n\t\t\tcurrent = current.next\n\t\t}\n\n\t\tswitch t {\n\t\tcase diveTag:\n\t\t\tcurrent.typeof = typeDive\n\n\t\tcase keysTag:\n\t\t\tcurrent.typeof = typeKeys\n\n\t\t\tif i == 0 || prevTag != typeDive {\n\t\t\t\tpanic(fmt.Sprintf(\"'%s' tag must be immediately preceded by the '%s' tag\", keysTag, diveTag))\n\t\t\t}\n\n\t\t\t// need to pass along only keys tag\n\t\t\t// need to increment i to skip over the keys tags\n\t\t\tb := make([]byte, 0, 64)\n\n\t\t\ti++\n\n\t\t\tfor ; i < len(tags); i++ {\n\t\t\t\tb = append(b, tags[i]...)\n\t\t\t\tb = append(b, ',')\n\n\t\t\t\tif tags[i] == endKeysTag {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrent.keys, _ = v.parseFieldTagsRecursive(string(b[:len(b)-1]), fieldName, \"\", false)\n\n\t\tcase endKeysTag:\n\t\t\tcurrent.typeof = typeEndKeys\n\n\t\t\t// if there are more in tags then there was no keysTag defined\n\t\t\t// and an error should be thrown\n\t\t\tif i != len(tags)-1 {\n\t\t\t\tpanic(keysTagNotDefined)\n\t\t\t}\n\t\t\treturn\n\n\t\tcase omitzero:\n\t\t\tcurrent.typeof = typeOmitZero\n\t\t\tcontinue\n\n\t\tcase omitempty:\n\t\t\tcurrent.typeof = typeOmitEmpty\n\n\t\tcase omitnil:\n\t\t\tcurrent.typeof = typeOmitNil\n\n\t\tcase structOnlyTag:\n\t\t\tcurrent.typeof = typeStructOnly\n\n\t\tcase noStructLevelTag:\n\t\t\tcurrent.typeof = typeNoStructLevel\n\n\t\tdefault:\n\t\t\tif t == isdefault {\n\t\t\t\tcurrent.typeof = typeIsDefault\n\t\t\t}\n\t\t\t// if a pipe character is needed within the param you must use the utf8Pipe representation \"0x7C\"\n\t\t\torVals := strings.Split(t, orSeparator)\n\n\t\t\tfor j := 0; j < len(orVals); j++ {\n\t\t\t\tvals := strings.SplitN(orVals[j], tagKeySeparator, 2)\n\t\t\t\tif noAlias {\n\t\t\t\t\talias = vals[0]\n\t\t\t\t\tcurrent.aliasTag = alias\n\t\t\t\t} else {\n\t\t\t\t\tcurrent.actualAliasTag = t\n\t\t\t\t}\n\n\t\t\t\tif j > 0 {\n\t\t\t\t\tcurrent.next = &cTag{aliasTag: alias, actualAliasTag: current.actualAliasTag, hasAlias: hasAlias, hasTag: true}\n\t\t\t\t\tcurrent = current.next\n\t\t\t\t}\n\t\t\t\tcurrent.hasParam = len(vals) > 1\n\n\t\t\t\tcurrent.tag = vals[0]\n\t\t\t\tif len(current.tag) == 0 {\n\t\t\t\t\tpanic(strings.TrimSpace(fmt.Sprintf(invalidValidation, fieldName)))\n\t\t\t\t}\n\n\t\t\t\tif wrapper, ok := v.validations[current.tag]; ok {\n\t\t\t\t\tcurrent.fn = wrapper.fn\n\t\t\t\t\tcurrent.runValidationWhenNil = wrapper.runValidationOnNil\n\t\t\t\t} else if aliasTag, isAlias := v.aliases[current.tag]; isAlias {\n\t\t\t\t\taliasFirst, aliasLast := v.parseFieldTagsRecursive(aliasTag, fieldName, current.tag, true)\n\n\t\t\t\t\tcurrent.tag = aliasFirst.tag\n\t\t\t\t\tcurrent.fn = aliasFirst.fn\n\t\t\t\t\tcurrent.runValidationWhenNil = aliasFirst.runValidationWhenNil\n\t\t\t\t\tcurrent.hasParam = aliasFirst.hasParam\n\t\t\t\t\tcurrent.param = aliasFirst.param\n\t\t\t\t\tcurrent.typeof = aliasFirst.typeof\n\t\t\t\t\tcurrent.hasAlias = true\n\n\t\t\t\t\tif aliasFirst.next != nil {\n\t\t\t\t\t\tnextInChain := current.next\n\t\t\t\t\t\tcurrent.next = aliasFirst.next\n\t\t\t\t\t\taliasLast.next = nextInChain\n\t\t\t\t\t\taliasLast.isBlockEnd = false\n\t\t\t\t\t\tcurrent = aliasLast\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpanic(strings.TrimSpace(fmt.Sprintf(undefinedValidation, current.tag, fieldName)))\n\t\t\t\t}\n\n\t\t\t\tif len(orVals) > 1 {\n\t\t\t\t\tcurrent.typeof = typeOr\n\t\t\t\t}\n\n\t\t\t\tif len(vals) > 1 {\n\t\t\t\t\tcurrent.param = strings.ReplaceAll(strings.ReplaceAll(vals[1], utf8HexComma, \",\"), utf8Pipe, \"|\")\n\t\t\t\t}\n\t\t\t}\n\t\t\tcurrent.isBlockEnd = true\n\t\t}\n\t}\n\treturn\n}\n\nfunc (v *Validate) fetchCacheTag(tag string) *cTag {\n\t// find cached tag\n\tctag, found := v.tagCache.Get(tag)\n\tif !found {\n\t\tv.tagCache.lock.Lock()\n\t\tdefer v.tagCache.lock.Unlock()\n\n\t\t// could have been multiple trying to access, but once first is done this ensures tag\n\t\t// isn't parsed again.\n\t\tctag, found = v.tagCache.Get(tag)\n\t\tif !found {\n\t\t\tctag, _ = v.parseFieldTagsRecursive(tag, \"\", \"\", false)\n\t\t\tv.tagCache.Set(tag, ctag)\n\t\t}\n\t}\n\treturn ctag\n}\n"
  },
  {
    "path": "country_codes.go",
    "content": "package validator\n\nvar iso3166_1_alpha2 = map[string]struct{}{\n\t// see: https://www.iso.org/iso-3166-country-codes.html\n\t\"AF\": {}, \"AX\": {}, \"AL\": {}, \"DZ\": {}, \"AS\": {},\n\t\"AD\": {}, \"AO\": {}, \"AI\": {}, \"AQ\": {}, \"AG\": {},\n\t\"AR\": {}, \"AM\": {}, \"AW\": {}, \"AU\": {}, \"AT\": {},\n\t\"AZ\": {}, \"BS\": {}, \"BH\": {}, \"BD\": {}, \"BB\": {},\n\t\"BY\": {}, \"BE\": {}, \"BZ\": {}, \"BJ\": {}, \"BM\": {},\n\t\"BT\": {}, \"BO\": {}, \"BQ\": {}, \"BA\": {}, \"BW\": {},\n\t\"BV\": {}, \"BR\": {}, \"IO\": {}, \"BN\": {}, \"BG\": {},\n\t\"BF\": {}, \"BI\": {}, \"KH\": {}, \"CM\": {}, \"CA\": {},\n\t\"CV\": {}, \"KY\": {}, \"CF\": {}, \"TD\": {}, \"CL\": {},\n\t\"CN\": {}, \"CX\": {}, \"CC\": {}, \"CO\": {}, \"KM\": {},\n\t\"CG\": {}, \"CD\": {}, \"CK\": {}, \"CR\": {}, \"CI\": {},\n\t\"HR\": {}, \"CU\": {}, \"CW\": {}, \"CY\": {}, \"CZ\": {},\n\t\"DK\": {}, \"DJ\": {}, \"DM\": {}, \"DO\": {}, \"EC\": {},\n\t\"EG\": {}, \"SV\": {}, \"GQ\": {}, \"ER\": {}, \"EE\": {},\n\t\"ET\": {}, \"FK\": {}, \"FO\": {}, \"FJ\": {}, \"FI\": {},\n\t\"FR\": {}, \"GF\": {}, \"PF\": {}, \"TF\": {}, \"GA\": {},\n\t\"GM\": {}, \"GE\": {}, \"DE\": {}, \"GH\": {}, \"GI\": {},\n\t\"GR\": {}, \"GL\": {}, \"GD\": {}, \"GP\": {}, \"GU\": {},\n\t\"GT\": {}, \"GG\": {}, \"GN\": {}, \"GW\": {}, \"GY\": {},\n\t\"HT\": {}, \"HM\": {}, \"VA\": {}, \"HN\": {}, \"HK\": {},\n\t\"HU\": {}, \"IS\": {}, \"IN\": {}, \"ID\": {}, \"IR\": {},\n\t\"IQ\": {}, \"IE\": {}, \"IM\": {}, \"IL\": {}, \"IT\": {},\n\t\"JM\": {}, \"JP\": {}, \"JE\": {}, \"JO\": {}, \"KZ\": {},\n\t\"KE\": {}, \"KI\": {}, \"KP\": {}, \"KR\": {}, \"KW\": {},\n\t\"KG\": {}, \"LA\": {}, \"LV\": {}, \"LB\": {}, \"LS\": {},\n\t\"LR\": {}, \"LY\": {}, \"LI\": {}, \"LT\": {}, \"LU\": {},\n\t\"MO\": {}, \"MK\": {}, \"MG\": {}, \"MW\": {}, \"MY\": {},\n\t\"MV\": {}, \"ML\": {}, \"MT\": {}, \"MH\": {}, \"MQ\": {},\n\t\"MR\": {}, \"MU\": {}, \"YT\": {}, \"MX\": {}, \"FM\": {},\n\t\"MD\": {}, \"MC\": {}, \"MN\": {}, \"ME\": {}, \"MS\": {},\n\t\"MA\": {}, \"MZ\": {}, \"MM\": {}, \"NA\": {}, \"NR\": {},\n\t\"NP\": {}, \"NL\": {}, \"NC\": {}, \"NZ\": {}, \"NI\": {},\n\t\"NE\": {}, \"NG\": {}, \"NU\": {}, \"NF\": {}, \"MP\": {},\n\t\"NO\": {}, \"OM\": {}, \"PK\": {}, \"PW\": {}, \"PS\": {},\n\t\"PA\": {}, \"PG\": {}, \"PY\": {}, \"PE\": {}, \"PH\": {},\n\t\"PN\": {}, \"PL\": {}, \"PT\": {}, \"PR\": {}, \"QA\": {},\n\t\"RE\": {}, \"RO\": {}, \"RU\": {}, \"RW\": {}, \"BL\": {},\n\t\"SH\": {}, \"KN\": {}, \"LC\": {}, \"MF\": {}, \"PM\": {},\n\t\"VC\": {}, \"WS\": {}, \"SM\": {}, \"ST\": {}, \"SA\": {},\n\t\"SN\": {}, \"RS\": {}, \"SC\": {}, \"SL\": {}, \"SG\": {},\n\t\"SX\": {}, \"SK\": {}, \"SI\": {}, \"SB\": {}, \"SO\": {},\n\t\"ZA\": {}, \"GS\": {}, \"SS\": {}, \"ES\": {}, \"LK\": {},\n\t\"SD\": {}, \"SR\": {}, \"SJ\": {}, \"SZ\": {}, \"SE\": {},\n\t\"CH\": {}, \"SY\": {}, \"TW\": {}, \"TJ\": {}, \"TZ\": {},\n\t\"TH\": {}, \"TL\": {}, \"TG\": {}, \"TK\": {}, \"TO\": {},\n\t\"TT\": {}, \"TN\": {}, \"TR\": {}, \"TM\": {}, \"TC\": {},\n\t\"TV\": {}, \"UG\": {}, \"UA\": {}, \"AE\": {}, \"GB\": {},\n\t\"US\": {}, \"UM\": {}, \"UY\": {}, \"UZ\": {}, \"VU\": {},\n\t\"VE\": {}, \"VN\": {}, \"VG\": {}, \"VI\": {}, \"WF\": {},\n\t\"EH\": {}, \"YE\": {}, \"ZM\": {}, \"ZW\": {}, \"XK\": {},\n}\n\nvar iso3166_1_alpha2_eu = map[string]struct{}{\n\t\"AT\": {}, \"BE\": {}, \"BG\": {}, \"HR\": {}, \"CY\": {},\n\t\"CZ\": {}, \"DK\": {}, \"EE\": {}, \"FI\": {}, \"FR\": {},\n\t\"DE\": {}, \"GR\": {}, \"HU\": {}, \"IE\": {}, \"IT\": {},\n\t\"LV\": {}, \"LT\": {}, \"LU\": {}, \"MT\": {}, \"NL\": {},\n\t\"PL\": {}, \"PT\": {}, \"RO\": {}, \"SK\": {}, \"SI\": {},\n\t\"ES\": {}, \"SE\": {},\n}\n\nvar iso3166_1_alpha3 = map[string]struct{}{\n\t// see: https://www.iso.org/iso-3166-country-codes.html\n\t\"AFG\": {}, \"ALB\": {}, \"DZA\": {}, \"ASM\": {}, \"AND\": {},\n\t\"AGO\": {}, \"AIA\": {}, \"ATA\": {}, \"ATG\": {}, \"ARG\": {},\n\t\"ARM\": {}, \"ABW\": {}, \"AUS\": {}, \"AUT\": {}, \"AZE\": {},\n\t\"BHS\": {}, \"BHR\": {}, \"BGD\": {}, \"BRB\": {}, \"BLR\": {},\n\t\"BEL\": {}, \"BLZ\": {}, \"BEN\": {}, \"BMU\": {}, \"BTN\": {},\n\t\"BOL\": {}, \"BES\": {}, \"BIH\": {}, \"BWA\": {}, \"BVT\": {},\n\t\"BRA\": {}, \"IOT\": {}, \"BRN\": {}, \"BGR\": {}, \"BFA\": {},\n\t\"BDI\": {}, \"CPV\": {}, \"KHM\": {}, \"CMR\": {}, \"CAN\": {},\n\t\"CYM\": {}, \"CAF\": {}, \"TCD\": {}, \"CHL\": {}, \"CHN\": {},\n\t\"CXR\": {}, \"CCK\": {}, \"COL\": {}, \"COM\": {}, \"COD\": {},\n\t\"COG\": {}, \"COK\": {}, \"CRI\": {}, \"HRV\": {}, \"CUB\": {},\n\t\"CUW\": {}, \"CYP\": {}, \"CZE\": {}, \"CIV\": {}, \"DNK\": {},\n\t\"DJI\": {}, \"DMA\": {}, \"DOM\": {}, \"ECU\": {}, \"EGY\": {},\n\t\"SLV\": {}, \"GNQ\": {}, \"ERI\": {}, \"EST\": {}, \"SWZ\": {},\n\t\"ETH\": {}, \"FLK\": {}, \"FRO\": {}, \"FJI\": {}, \"FIN\": {},\n\t\"FRA\": {}, \"GUF\": {}, \"PYF\": {}, \"ATF\": {}, \"GAB\": {},\n\t\"GMB\": {}, \"GEO\": {}, \"DEU\": {}, \"GHA\": {}, \"GIB\": {},\n\t\"GRC\": {}, \"GRL\": {}, \"GRD\": {}, \"GLP\": {}, \"GUM\": {},\n\t\"GTM\": {}, \"GGY\": {}, \"GIN\": {}, \"GNB\": {}, \"GUY\": {},\n\t\"HTI\": {}, \"HMD\": {}, \"VAT\": {}, \"HND\": {}, \"HKG\": {},\n\t\"HUN\": {}, \"ISL\": {}, \"IND\": {}, \"IDN\": {}, \"IRN\": {},\n\t\"IRQ\": {}, \"IRL\": {}, \"IMN\": {}, \"ISR\": {}, \"ITA\": {},\n\t\"JAM\": {}, \"JPN\": {}, \"JEY\": {}, \"JOR\": {}, \"KAZ\": {},\n\t\"KEN\": {}, \"KIR\": {}, \"PRK\": {}, \"KOR\": {}, \"KWT\": {},\n\t\"KGZ\": {}, \"LAO\": {}, \"LVA\": {}, \"LBN\": {}, \"LSO\": {},\n\t\"LBR\": {}, \"LBY\": {}, \"LIE\": {}, \"LTU\": {}, \"LUX\": {},\n\t\"MAC\": {}, \"MDG\": {}, \"MWI\": {}, \"MYS\": {}, \"MDV\": {},\n\t\"MLI\": {}, \"MLT\": {}, \"MHL\": {}, \"MTQ\": {}, \"MRT\": {},\n\t\"MUS\": {}, \"MYT\": {}, \"MEX\": {}, \"FSM\": {}, \"MDA\": {},\n\t\"MCO\": {}, \"MNG\": {}, \"MNE\": {}, \"MSR\": {}, \"MAR\": {},\n\t\"MOZ\": {}, \"MMR\": {}, \"NAM\": {}, \"NRU\": {}, \"NPL\": {},\n\t\"NLD\": {}, \"NCL\": {}, \"NZL\": {}, \"NIC\": {}, \"NER\": {},\n\t\"NGA\": {}, \"NIU\": {}, \"NFK\": {}, \"MKD\": {}, \"MNP\": {},\n\t\"NOR\": {}, \"OMN\": {}, \"PAK\": {}, \"PLW\": {}, \"PSE\": {},\n\t\"PAN\": {}, \"PNG\": {}, \"PRY\": {}, \"PER\": {}, \"PHL\": {},\n\t\"PCN\": {}, \"POL\": {}, \"PRT\": {}, \"PRI\": {}, \"QAT\": {},\n\t\"ROU\": {}, \"RUS\": {}, \"RWA\": {}, \"REU\": {}, \"BLM\": {},\n\t\"SHN\": {}, \"KNA\": {}, \"LCA\": {}, \"MAF\": {}, \"SPM\": {},\n\t\"VCT\": {}, \"WSM\": {}, \"SMR\": {}, \"STP\": {}, \"SAU\": {},\n\t\"SEN\": {}, \"SRB\": {}, \"SYC\": {}, \"SLE\": {}, \"SGP\": {},\n\t\"SXM\": {}, \"SVK\": {}, \"SVN\": {}, \"SLB\": {}, \"SOM\": {},\n\t\"ZAF\": {}, \"SGS\": {}, \"SSD\": {}, \"ESP\": {}, \"LKA\": {},\n\t\"SDN\": {}, \"SUR\": {}, \"SJM\": {}, \"SWE\": {}, \"CHE\": {},\n\t\"SYR\": {}, \"TWN\": {}, \"TJK\": {}, \"TZA\": {}, \"THA\": {},\n\t\"TLS\": {}, \"TGO\": {}, \"TKL\": {}, \"TON\": {}, \"TTO\": {},\n\t\"TUN\": {}, \"TUR\": {}, \"TKM\": {}, \"TCA\": {}, \"TUV\": {},\n\t\"UGA\": {}, \"UKR\": {}, \"ARE\": {}, \"GBR\": {}, \"UMI\": {},\n\t\"USA\": {}, \"URY\": {}, \"UZB\": {}, \"VUT\": {}, \"VEN\": {},\n\t\"VNM\": {}, \"VGB\": {}, \"VIR\": {}, \"WLF\": {}, \"ESH\": {},\n\t\"YEM\": {}, \"ZMB\": {}, \"ZWE\": {}, \"ALA\": {}, \"UNK\": {},\n}\n\nvar iso3166_1_alpha3_eu = map[string]struct{}{\n\t\"AUT\": {}, \"BEL\": {}, \"BGR\": {}, \"HRV\": {}, \"CYP\": {},\n\t\"CZE\": {}, \"DNK\": {}, \"EST\": {}, \"FIN\": {}, \"FRA\": {},\n\t\"DEU\": {}, \"GRC\": {}, \"HUN\": {}, \"IRL\": {}, \"ITA\": {},\n\t\"LVA\": {}, \"LTU\": {}, \"LUX\": {}, \"MLT\": {}, \"NLD\": {},\n\t\"POL\": {}, \"PRT\": {}, \"ROU\": {}, \"SVK\": {}, \"SVN\": {},\n\t\"ESP\": {}, \"SWE\": {},\n}\nvar iso3166_1_alpha_numeric = map[int]struct{}{\n\t// see: https://www.iso.org/iso-3166-country-codes.html\n\t4: {}, 8: {}, 12: {}, 16: {}, 20: {},\n\t24: {}, 660: {}, 10: {}, 28: {}, 32: {},\n\t51: {}, 533: {}, 36: {}, 40: {}, 31: {},\n\t44: {}, 48: {}, 50: {}, 52: {}, 112: {},\n\t56: {}, 84: {}, 204: {}, 60: {}, 64: {},\n\t68: {}, 535: {}, 70: {}, 72: {}, 74: {},\n\t76: {}, 86: {}, 96: {}, 100: {}, 854: {},\n\t108: {}, 132: {}, 116: {}, 120: {}, 124: {},\n\t136: {}, 140: {}, 148: {}, 152: {}, 156: {},\n\t162: {}, 166: {}, 170: {}, 174: {}, 180: {},\n\t178: {}, 184: {}, 188: {}, 191: {}, 192: {},\n\t531: {}, 196: {}, 203: {}, 384: {}, 208: {},\n\t262: {}, 212: {}, 214: {}, 218: {}, 818: {},\n\t222: {}, 226: {}, 232: {}, 233: {}, 748: {},\n\t231: {}, 238: {}, 234: {}, 242: {}, 246: {},\n\t250: {}, 254: {}, 258: {}, 260: {}, 266: {},\n\t270: {}, 268: {}, 276: {}, 288: {}, 292: {},\n\t300: {}, 304: {}, 308: {}, 312: {}, 316: {},\n\t320: {}, 831: {}, 324: {}, 624: {}, 328: {},\n\t332: {}, 334: {}, 336: {}, 340: {}, 344: {},\n\t348: {}, 352: {}, 356: {}, 360: {}, 364: {},\n\t368: {}, 372: {}, 833: {}, 376: {}, 380: {},\n\t388: {}, 392: {}, 832: {}, 400: {}, 398: {},\n\t404: {}, 296: {}, 408: {}, 410: {}, 414: {},\n\t417: {}, 418: {}, 428: {}, 422: {}, 426: {},\n\t430: {}, 434: {}, 438: {}, 440: {}, 442: {},\n\t446: {}, 450: {}, 454: {}, 458: {}, 462: {},\n\t466: {}, 470: {}, 584: {}, 474: {}, 478: {},\n\t480: {}, 175: {}, 484: {}, 583: {}, 498: {},\n\t492: {}, 496: {}, 499: {}, 500: {}, 504: {},\n\t508: {}, 104: {}, 516: {}, 520: {}, 524: {},\n\t528: {}, 540: {}, 554: {}, 558: {}, 562: {},\n\t566: {}, 570: {}, 574: {}, 807: {}, 580: {},\n\t578: {}, 512: {}, 586: {}, 585: {}, 275: {},\n\t591: {}, 598: {}, 600: {}, 604: {}, 608: {},\n\t612: {}, 616: {}, 620: {}, 630: {}, 634: {},\n\t642: {}, 643: {}, 646: {}, 638: {}, 652: {},\n\t654: {}, 659: {}, 662: {}, 663: {}, 666: {},\n\t670: {}, 882: {}, 674: {}, 678: {}, 682: {},\n\t686: {}, 688: {}, 690: {}, 694: {}, 702: {},\n\t534: {}, 703: {}, 705: {}, 90: {}, 706: {},\n\t710: {}, 239: {}, 728: {}, 724: {}, 144: {},\n\t729: {}, 740: {}, 744: {}, 752: {}, 756: {},\n\t760: {}, 158: {}, 762: {}, 834: {}, 764: {},\n\t626: {}, 768: {}, 772: {}, 776: {}, 780: {},\n\t788: {}, 792: {}, 795: {}, 796: {}, 798: {},\n\t800: {}, 804: {}, 784: {}, 826: {}, 581: {},\n\t840: {}, 858: {}, 860: {}, 548: {}, 862: {},\n\t704: {}, 92: {}, 850: {}, 876: {}, 732: {},\n\t887: {}, 894: {}, 716: {}, 248: {}, 153: {},\n}\n\nvar iso3166_1_alpha_numeric_eu = map[int]struct{}{\n\t40: {}, 56: {}, 100: {}, 191: {}, 196: {},\n\t200: {}, 208: {}, 233: {}, 246: {}, 250: {},\n\t276: {}, 300: {}, 348: {}, 372: {}, 380: {},\n\t428: {}, 440: {}, 442: {}, 470: {}, 528: {},\n\t616: {}, 620: {}, 642: {}, 703: {}, 705: {},\n\t724: {}, 752: {},\n}\n\nvar iso3166_2 = map[string]struct{}{\n\t\"AD-02\": {}, \"AD-03\": {}, \"AD-04\": {}, \"AD-05\": {}, \"AD-06\": {},\n\t\"AD-07\": {}, \"AD-08\": {}, \"AE-AJ\": {}, \"AE-AZ\": {}, \"AE-DU\": {},\n\t\"AE-FU\": {}, \"AE-RK\": {}, \"AE-SH\": {}, \"AE-UQ\": {}, \"AF-BAL\": {},\n\t\"AF-BAM\": {}, \"AF-BDG\": {}, \"AF-BDS\": {}, \"AF-BGL\": {}, \"AF-DAY\": {},\n\t\"AF-FRA\": {}, \"AF-FYB\": {}, \"AF-GHA\": {}, \"AF-GHO\": {}, \"AF-HEL\": {},\n\t\"AF-HER\": {}, \"AF-JOW\": {}, \"AF-KAB\": {}, \"AF-KAN\": {}, \"AF-KAP\": {},\n\t\"AF-KDZ\": {}, \"AF-KHO\": {}, \"AF-KNR\": {}, \"AF-LAG\": {}, \"AF-LOG\": {},\n\t\"AF-NAN\": {}, \"AF-NIM\": {}, \"AF-NUR\": {}, \"AF-PAN\": {}, \"AF-PAR\": {},\n\t\"AF-PIA\": {}, \"AF-PKA\": {}, \"AF-SAM\": {}, \"AF-SAR\": {}, \"AF-TAK\": {},\n\t\"AF-URU\": {}, \"AF-WAR\": {}, \"AF-ZAB\": {}, \"AG-03\": {}, \"AG-04\": {},\n\t\"AG-05\": {}, \"AG-06\": {}, \"AG-07\": {}, \"AG-08\": {}, \"AG-10\": {},\n\t\"AG-11\": {}, \"AL-01\": {}, \"AL-02\": {}, \"AL-03\": {}, \"AL-04\": {},\n\t\"AL-05\": {}, \"AL-06\": {}, \"AL-07\": {}, \"AL-08\": {}, \"AL-09\": {},\n\t\"AL-10\": {}, \"AL-11\": {}, \"AL-12\": {}, \"AL-BR\": {}, \"AL-BU\": {},\n\t\"AL-DI\": {}, \"AL-DL\": {}, \"AL-DR\": {}, \"AL-DV\": {}, \"AL-EL\": {},\n\t\"AL-ER\": {}, \"AL-FR\": {}, \"AL-GJ\": {}, \"AL-GR\": {}, \"AL-HA\": {},\n\t\"AL-KA\": {}, \"AL-KB\": {}, \"AL-KC\": {}, \"AL-KO\": {}, \"AL-KR\": {},\n\t\"AL-KU\": {}, \"AL-LB\": {}, \"AL-LE\": {}, \"AL-LU\": {}, \"AL-MK\": {},\n\t\"AL-MM\": {}, \"AL-MR\": {}, \"AL-MT\": {}, \"AL-PG\": {}, \"AL-PQ\": {},\n\t\"AL-PR\": {}, \"AL-PU\": {}, \"AL-SH\": {}, \"AL-SK\": {}, \"AL-SR\": {},\n\t\"AL-TE\": {}, \"AL-TP\": {}, \"AL-TR\": {}, \"AL-VL\": {}, \"AM-AG\": {},\n\t\"AM-AR\": {}, \"AM-AV\": {}, \"AM-ER\": {}, \"AM-GR\": {}, \"AM-KT\": {},\n\t\"AM-LO\": {}, \"AM-SH\": {}, \"AM-SU\": {}, \"AM-TV\": {}, \"AM-VD\": {},\n\t\"AO-BGO\": {}, \"AO-BGU\": {}, \"AO-BIE\": {}, \"AO-CAB\": {}, \"AO-CCU\": {},\n\t\"AO-CNN\": {}, \"AO-CNO\": {}, \"AO-CUS\": {}, \"AO-HUA\": {}, \"AO-HUI\": {},\n\t\"AO-LNO\": {}, \"AO-LSU\": {}, \"AO-LUA\": {}, \"AO-MAL\": {}, \"AO-MOX\": {},\n\t\"AO-NAM\": {}, \"AO-UIG\": {}, \"AO-ZAI\": {}, \"AR-A\": {}, \"AR-B\": {},\n\t\"AR-C\": {}, \"AR-D\": {}, \"AR-E\": {}, \"AR-F\": {}, \"AR-G\": {}, \"AR-H\": {},\n\t\"AR-J\": {}, \"AR-K\": {}, \"AR-L\": {}, \"AR-M\": {}, \"AR-N\": {},\n\t\"AR-P\": {}, \"AR-Q\": {}, \"AR-R\": {}, \"AR-S\": {}, \"AR-T\": {},\n\t\"AR-U\": {}, \"AR-V\": {}, \"AR-W\": {}, \"AR-X\": {}, \"AR-Y\": {},\n\t\"AR-Z\": {}, \"AT-1\": {}, \"AT-2\": {}, \"AT-3\": {}, \"AT-4\": {},\n\t\"AT-5\": {}, \"AT-6\": {}, \"AT-7\": {}, \"AT-8\": {}, \"AT-9\": {},\n\t\"AU-ACT\": {}, \"AU-NSW\": {}, \"AU-NT\": {}, \"AU-QLD\": {}, \"AU-SA\": {},\n\t\"AU-TAS\": {}, \"AU-VIC\": {}, \"AU-WA\": {}, \"AZ-ABS\": {}, \"AZ-AGA\": {},\n\t\"AZ-AGC\": {}, \"AZ-AGM\": {}, \"AZ-AGS\": {}, \"AZ-AGU\": {}, \"AZ-AST\": {},\n\t\"AZ-BA\": {}, \"AZ-BAB\": {}, \"AZ-BAL\": {}, \"AZ-BAR\": {}, \"AZ-BEY\": {},\n\t\"AZ-BIL\": {}, \"AZ-CAB\": {}, \"AZ-CAL\": {}, \"AZ-CUL\": {}, \"AZ-DAS\": {},\n\t\"AZ-FUZ\": {}, \"AZ-GA\": {}, \"AZ-GAD\": {}, \"AZ-GOR\": {}, \"AZ-GOY\": {},\n\t\"AZ-GYG\": {}, \"AZ-HAC\": {}, \"AZ-IMI\": {}, \"AZ-ISM\": {}, \"AZ-KAL\": {},\n\t\"AZ-KAN\": {}, \"AZ-KUR\": {}, \"AZ-LA\": {}, \"AZ-LAC\": {}, \"AZ-LAN\": {},\n\t\"AZ-LER\": {}, \"AZ-MAS\": {}, \"AZ-MI\": {}, \"AZ-NA\": {}, \"AZ-NEF\": {},\n\t\"AZ-NV\": {}, \"AZ-NX\": {}, \"AZ-OGU\": {}, \"AZ-ORD\": {}, \"AZ-QAB\": {},\n\t\"AZ-QAX\": {}, \"AZ-QAZ\": {}, \"AZ-QBA\": {}, \"AZ-QBI\": {}, \"AZ-QOB\": {},\n\t\"AZ-QUS\": {}, \"AZ-SA\": {}, \"AZ-SAB\": {}, \"AZ-SAD\": {}, \"AZ-SAH\": {},\n\t\"AZ-SAK\": {}, \"AZ-SAL\": {}, \"AZ-SAR\": {}, \"AZ-SAT\": {}, \"AZ-SBN\": {},\n\t\"AZ-SIY\": {}, \"AZ-SKR\": {}, \"AZ-SM\": {}, \"AZ-SMI\": {}, \"AZ-SMX\": {},\n\t\"AZ-SR\": {}, \"AZ-SUS\": {}, \"AZ-TAR\": {}, \"AZ-TOV\": {}, \"AZ-UCA\": {},\n\t\"AZ-XA\": {}, \"AZ-XAC\": {}, \"AZ-XCI\": {}, \"AZ-XIZ\": {}, \"AZ-XVD\": {},\n\t\"AZ-YAR\": {}, \"AZ-YE\": {}, \"AZ-YEV\": {}, \"AZ-ZAN\": {}, \"AZ-ZAQ\": {},\n\t\"AZ-ZAR\": {}, \"BA-01\": {}, \"BA-02\": {}, \"BA-03\": {}, \"BA-04\": {},\n\t\"BA-05\": {}, \"BA-06\": {}, \"BA-07\": {}, \"BA-08\": {}, \"BA-09\": {},\n\t\"BA-10\": {}, \"BA-BIH\": {}, \"BA-BRC\": {}, \"BA-SRP\": {}, \"BB-01\": {},\n\t\"BB-02\": {}, \"BB-03\": {}, \"BB-04\": {}, \"BB-05\": {}, \"BB-06\": {},\n\t\"BB-07\": {}, \"BB-08\": {}, \"BB-09\": {}, \"BB-10\": {}, \"BB-11\": {},\n\t\"BD-01\": {}, \"BD-02\": {}, \"BD-03\": {}, \"BD-04\": {}, \"BD-05\": {},\n\t\"BD-06\": {}, \"BD-07\": {}, \"BD-08\": {}, \"BD-09\": {}, \"BD-10\": {},\n\t\"BD-11\": {}, \"BD-12\": {}, \"BD-13\": {}, \"BD-14\": {}, \"BD-15\": {},\n\t\"BD-16\": {}, \"BD-17\": {}, \"BD-18\": {}, \"BD-19\": {}, \"BD-20\": {},\n\t\"BD-21\": {}, \"BD-22\": {}, \"BD-23\": {}, \"BD-24\": {}, \"BD-25\": {},\n\t\"BD-26\": {}, \"BD-27\": {}, \"BD-28\": {}, \"BD-29\": {}, \"BD-30\": {},\n\t\"BD-31\": {}, \"BD-32\": {}, \"BD-33\": {}, \"BD-34\": {}, \"BD-35\": {},\n\t\"BD-36\": {}, \"BD-37\": {}, \"BD-38\": {}, \"BD-39\": {}, \"BD-40\": {},\n\t\"BD-41\": {}, \"BD-42\": {}, \"BD-43\": {}, \"BD-44\": {}, \"BD-45\": {},\n\t\"BD-46\": {}, \"BD-47\": {}, \"BD-48\": {}, \"BD-49\": {}, \"BD-50\": {},\n\t\"BD-51\": {}, \"BD-52\": {}, \"BD-53\": {}, \"BD-54\": {}, \"BD-55\": {},\n\t\"BD-56\": {}, \"BD-57\": {}, \"BD-58\": {}, \"BD-59\": {}, \"BD-60\": {},\n\t\"BD-61\": {}, \"BD-62\": {}, \"BD-63\": {}, \"BD-64\": {}, \"BD-A\": {},\n\t\"BD-B\": {}, \"BD-C\": {}, \"BD-D\": {}, \"BD-E\": {}, \"BD-F\": {},\n\t\"BD-G\": {}, \"BD-H\": {}, \"BE-BRU\": {}, \"BE-VAN\": {}, \"BE-VBR\": {}, \"BE-VLG\": {},\n\t\"BE-VLI\": {}, \"BE-VOV\": {}, \"BE-VWV\": {}, \"BE-WAL\": {}, \"BE-WBR\": {},\n\t\"BE-WHT\": {}, \"BE-WLG\": {}, \"BE-WLX\": {}, \"BE-WNA\": {}, \"BF-01\": {},\n\t\"BF-02\": {}, \"BF-03\": {}, \"BF-04\": {}, \"BF-05\": {}, \"BF-06\": {},\n\t\"BF-07\": {}, \"BF-08\": {}, \"BF-09\": {}, \"BF-10\": {}, \"BF-11\": {},\n\t\"BF-12\": {}, \"BF-13\": {}, \"BF-BAL\": {}, \"BF-BAM\": {}, \"BF-BAN\": {},\n\t\"BF-BAZ\": {}, \"BF-BGR\": {}, \"BF-BLG\": {}, \"BF-BLK\": {}, \"BF-COM\": {},\n\t\"BF-GAN\": {}, \"BF-GNA\": {}, \"BF-GOU\": {}, \"BF-HOU\": {}, \"BF-IOB\": {},\n\t\"BF-KAD\": {}, \"BF-KEN\": {}, \"BF-KMD\": {}, \"BF-KMP\": {}, \"BF-KOP\": {},\n\t\"BF-KOS\": {}, \"BF-KOT\": {}, \"BF-KOW\": {}, \"BF-LER\": {}, \"BF-LOR\": {},\n\t\"BF-MOU\": {}, \"BF-NAM\": {}, \"BF-NAO\": {}, \"BF-NAY\": {}, \"BF-NOU\": {},\n\t\"BF-OUB\": {}, \"BF-OUD\": {}, \"BF-PAS\": {}, \"BF-PON\": {}, \"BF-SEN\": {},\n\t\"BF-SIS\": {}, \"BF-SMT\": {}, \"BF-SNG\": {}, \"BF-SOM\": {}, \"BF-SOR\": {},\n\t\"BF-TAP\": {}, \"BF-TUI\": {}, \"BF-YAG\": {}, \"BF-YAT\": {}, \"BF-ZIR\": {},\n\t\"BF-ZON\": {}, \"BF-ZOU\": {}, \"BG-01\": {}, \"BG-02\": {}, \"BG-03\": {},\n\t\"BG-04\": {}, \"BG-05\": {}, \"BG-06\": {}, \"BG-07\": {}, \"BG-08\": {},\n\t\"BG-09\": {}, \"BG-10\": {}, \"BG-11\": {}, \"BG-12\": {}, \"BG-13\": {},\n\t\"BG-14\": {}, \"BG-15\": {}, \"BG-16\": {}, \"BG-17\": {}, \"BG-18\": {},\n\t\"BG-19\": {}, \"BG-20\": {}, \"BG-21\": {}, \"BG-22\": {}, \"BG-23\": {},\n\t\"BG-24\": {}, \"BG-25\": {}, \"BG-26\": {}, \"BG-27\": {}, \"BG-28\": {},\n\t\"BH-13\": {}, \"BH-14\": {}, \"BH-15\": {}, \"BH-16\": {}, \"BH-17\": {},\n\t\"BI-BB\": {}, \"BI-BL\": {}, \"BI-BM\": {}, \"BI-BR\": {}, \"BI-CA\": {},\n\t\"BI-CI\": {}, \"BI-GI\": {}, \"BI-KI\": {}, \"BI-KR\": {}, \"BI-KY\": {},\n\t\"BI-MA\": {}, \"BI-MU\": {}, \"BI-MW\": {}, \"BI-NG\": {}, \"BI-RM\": {}, \"BI-RT\": {},\n\t\"BI-RY\": {}, \"BJ-AK\": {}, \"BJ-AL\": {}, \"BJ-AQ\": {}, \"BJ-BO\": {},\n\t\"BJ-CO\": {}, \"BJ-DO\": {}, \"BJ-KO\": {}, \"BJ-LI\": {}, \"BJ-MO\": {},\n\t\"BJ-OU\": {}, \"BJ-PL\": {}, \"BJ-ZO\": {}, \"BN-BE\": {}, \"BN-BM\": {},\n\t\"BN-TE\": {}, \"BN-TU\": {}, \"BO-B\": {}, \"BO-C\": {}, \"BO-H\": {},\n\t\"BO-L\": {}, \"BO-N\": {}, \"BO-O\": {}, \"BO-P\": {}, \"BO-S\": {},\n\t\"BO-T\": {}, \"BQ-BO\": {}, \"BQ-SA\": {}, \"BQ-SE\": {}, \"BR-AC\": {},\n\t\"BR-AL\": {}, \"BR-AM\": {}, \"BR-AP\": {}, \"BR-BA\": {}, \"BR-CE\": {},\n\t\"BR-DF\": {}, \"BR-ES\": {}, \"BR-FN\": {}, \"BR-GO\": {}, \"BR-MA\": {},\n\t\"BR-MG\": {}, \"BR-MS\": {}, \"BR-MT\": {}, \"BR-PA\": {}, \"BR-PB\": {},\n\t\"BR-PE\": {}, \"BR-PI\": {}, \"BR-PR\": {}, \"BR-RJ\": {}, \"BR-RN\": {},\n\t\"BR-RO\": {}, \"BR-RR\": {}, \"BR-RS\": {}, \"BR-SC\": {}, \"BR-SE\": {},\n\t\"BR-SP\": {}, \"BR-TO\": {}, \"BS-AK\": {}, \"BS-BI\": {}, \"BS-BP\": {},\n\t\"BS-BY\": {}, \"BS-CE\": {}, \"BS-CI\": {}, \"BS-CK\": {}, \"BS-CO\": {},\n\t\"BS-CS\": {}, \"BS-EG\": {}, \"BS-EX\": {}, \"BS-FP\": {}, \"BS-GC\": {},\n\t\"BS-HI\": {}, \"BS-HT\": {}, \"BS-IN\": {}, \"BS-LI\": {}, \"BS-MC\": {},\n\t\"BS-MG\": {}, \"BS-MI\": {}, \"BS-NE\": {}, \"BS-NO\": {}, \"BS-NP\": {}, \"BS-NS\": {},\n\t\"BS-RC\": {}, \"BS-RI\": {}, \"BS-SA\": {}, \"BS-SE\": {}, \"BS-SO\": {},\n\t\"BS-SS\": {}, \"BS-SW\": {}, \"BS-WG\": {}, \"BT-11\": {}, \"BT-12\": {},\n\t\"BT-13\": {}, \"BT-14\": {}, \"BT-15\": {}, \"BT-21\": {}, \"BT-22\": {},\n\t\"BT-23\": {}, \"BT-24\": {}, \"BT-31\": {}, \"BT-32\": {}, \"BT-33\": {},\n\t\"BT-34\": {}, \"BT-41\": {}, \"BT-42\": {}, \"BT-43\": {}, \"BT-44\": {},\n\t\"BT-45\": {}, \"BT-GA\": {}, \"BT-TY\": {}, \"BW-CE\": {}, \"BW-CH\": {}, \"BW-GH\": {},\n\t\"BW-KG\": {}, \"BW-KL\": {}, \"BW-KW\": {}, \"BW-NE\": {}, \"BW-NW\": {},\n\t\"BW-SE\": {}, \"BW-SO\": {}, \"BY-BR\": {}, \"BY-HM\": {}, \"BY-HO\": {},\n\t\"BY-HR\": {}, \"BY-MA\": {}, \"BY-MI\": {}, \"BY-VI\": {}, \"BZ-BZ\": {},\n\t\"BZ-CY\": {}, \"BZ-CZL\": {}, \"BZ-OW\": {}, \"BZ-SC\": {}, \"BZ-TOL\": {},\n\t\"CA-AB\": {}, \"CA-BC\": {}, \"CA-MB\": {}, \"CA-NB\": {}, \"CA-NL\": {},\n\t\"CA-NS\": {}, \"CA-NT\": {}, \"CA-NU\": {}, \"CA-ON\": {}, \"CA-PE\": {},\n\t\"CA-QC\": {}, \"CA-SK\": {}, \"CA-YT\": {}, \"CD-BC\": {}, \"CD-BN\": {},\n\t\"CD-EQ\": {}, \"CD-HK\": {}, \"CD-IT\": {}, \"CD-KA\": {}, \"CD-KC\": {}, \"CD-KE\": {}, \"CD-KG\": {}, \"CD-KN\": {},\n\t\"CD-KW\": {}, \"CD-KS\": {}, \"CD-LU\": {}, \"CD-MA\": {}, \"CD-NK\": {}, \"CD-OR\": {}, \"CD-SA\": {}, \"CD-SK\": {},\n\t\"CD-TA\": {}, \"CD-TO\": {}, \"CF-AC\": {}, \"CF-BB\": {}, \"CF-BGF\": {}, \"CF-BK\": {}, \"CF-HK\": {}, \"CF-HM\": {},\n\t\"CF-HS\": {}, \"CF-KB\": {}, \"CF-KG\": {}, \"CF-LB\": {}, \"CF-MB\": {},\n\t\"CF-MP\": {}, \"CF-NM\": {}, \"CF-OP\": {}, \"CF-SE\": {}, \"CF-UK\": {},\n\t\"CF-VK\": {}, \"CG-11\": {}, \"CG-12\": {}, \"CG-13\": {}, \"CG-14\": {},\n\t\"CG-15\": {}, \"CG-16\": {}, \"CG-2\": {}, \"CG-5\": {}, \"CG-7\": {}, \"CG-8\": {},\n\t\"CG-9\": {}, \"CG-BZV\": {}, \"CH-AG\": {}, \"CH-AI\": {}, \"CH-AR\": {},\n\t\"CH-BE\": {}, \"CH-BL\": {}, \"CH-BS\": {}, \"CH-FR\": {}, \"CH-GE\": {},\n\t\"CH-GL\": {}, \"CH-GR\": {}, \"CH-JU\": {}, \"CH-LU\": {}, \"CH-NE\": {},\n\t\"CH-NW\": {}, \"CH-OW\": {}, \"CH-SG\": {}, \"CH-SH\": {}, \"CH-SO\": {},\n\t\"CH-SZ\": {}, \"CH-TG\": {}, \"CH-TI\": {}, \"CH-UR\": {}, \"CH-VD\": {},\n\t\"CH-VS\": {}, \"CH-ZG\": {}, \"CH-ZH\": {}, \"CI-AB\": {}, \"CI-BS\": {},\n\t\"CI-CM\": {}, \"CI-DN\": {}, \"CI-GD\": {}, \"CI-LC\": {}, \"CI-LG\": {},\n\t\"CI-MG\": {}, \"CI-SM\": {}, \"CI-SV\": {}, \"CI-VB\": {}, \"CI-WR\": {},\n\t\"CI-YM\": {}, \"CI-ZZ\": {}, \"CL-AI\": {}, \"CL-AN\": {}, \"CL-AP\": {},\n\t\"CL-AR\": {}, \"CL-AT\": {}, \"CL-BI\": {}, \"CL-CO\": {}, \"CL-LI\": {},\n\t\"CL-LL\": {}, \"CL-LR\": {}, \"CL-MA\": {}, \"CL-ML\": {}, \"CL-NB\": {}, \"CL-RM\": {},\n\t\"CL-TA\": {}, \"CL-VS\": {}, \"CM-AD\": {}, \"CM-CE\": {}, \"CM-EN\": {},\n\t\"CM-ES\": {}, \"CM-LT\": {}, \"CM-NO\": {}, \"CM-NW\": {}, \"CM-OU\": {},\n\t\"CM-SU\": {}, \"CM-SW\": {}, \"CN-AH\": {}, \"CN-BJ\": {}, \"CN-CQ\": {},\n\t\"CN-FJ\": {}, \"CN-GS\": {}, \"CN-GD\": {}, \"CN-GX\": {}, \"CN-GZ\": {},\n\t\"CN-HI\": {}, \"CN-HE\": {}, \"CN-HL\": {}, \"CN-HA\": {}, \"CN-HB\": {},\n\t\"CN-HN\": {}, \"CN-JS\": {}, \"CN-JX\": {}, \"CN-JL\": {}, \"CN-LN\": {},\n\t\"CN-NM\": {}, \"CN-NX\": {}, \"CN-QH\": {}, \"CN-SN\": {}, \"CN-SD\": {}, \"CN-SH\": {},\n\t\"CN-SX\": {}, \"CN-SC\": {}, \"CN-TJ\": {}, \"CN-XJ\": {}, \"CN-XZ\": {}, \"CN-YN\": {},\n\t\"CN-ZJ\": {}, \"CO-AMA\": {}, \"CO-ANT\": {}, \"CO-ARA\": {}, \"CO-ATL\": {},\n\t\"CO-BOL\": {}, \"CO-BOY\": {}, \"CO-CAL\": {}, \"CO-CAQ\": {}, \"CO-CAS\": {},\n\t\"CO-CAU\": {}, \"CO-CES\": {}, \"CO-CHO\": {}, \"CO-COR\": {}, \"CO-CUN\": {},\n\t\"CO-DC\": {}, \"CO-GUA\": {}, \"CO-GUV\": {}, \"CO-HUI\": {}, \"CO-LAG\": {},\n\t\"CO-MAG\": {}, \"CO-MET\": {}, \"CO-NAR\": {}, \"CO-NSA\": {}, \"CO-PUT\": {},\n\t\"CO-QUI\": {}, \"CO-RIS\": {}, \"CO-SAN\": {}, \"CO-SAP\": {}, \"CO-SUC\": {},\n\t\"CO-TOL\": {}, \"CO-VAC\": {}, \"CO-VAU\": {}, \"CO-VID\": {}, \"CR-A\": {},\n\t\"CR-C\": {}, \"CR-G\": {}, \"CR-H\": {}, \"CR-L\": {}, \"CR-P\": {},\n\t\"CR-SJ\": {}, \"CU-01\": {}, \"CU-02\": {}, \"CU-03\": {}, \"CU-04\": {},\n\t\"CU-05\": {}, \"CU-06\": {}, \"CU-07\": {}, \"CU-08\": {}, \"CU-09\": {},\n\t\"CU-10\": {}, \"CU-11\": {}, \"CU-12\": {}, \"CU-13\": {}, \"CU-14\": {}, \"CU-15\": {},\n\t\"CU-16\": {}, \"CU-99\": {}, \"CV-B\": {}, \"CV-BR\": {}, \"CV-BV\": {}, \"CV-CA\": {},\n\t\"CV-CF\": {}, \"CV-CR\": {}, \"CV-MA\": {}, \"CV-MO\": {}, \"CV-PA\": {},\n\t\"CV-PN\": {}, \"CV-PR\": {}, \"CV-RB\": {}, \"CV-RG\": {}, \"CV-RS\": {},\n\t\"CV-S\": {}, \"CV-SD\": {}, \"CV-SF\": {}, \"CV-SL\": {}, \"CV-SM\": {},\n\t\"CV-SO\": {}, \"CV-SS\": {}, \"CV-SV\": {}, \"CV-TA\": {}, \"CV-TS\": {},\n\t\"CY-01\": {}, \"CY-02\": {}, \"CY-03\": {}, \"CY-04\": {}, \"CY-05\": {},\n\t\"CY-06\": {}, \"CZ-10\": {}, \"CZ-101\": {}, \"CZ-102\": {}, \"CZ-103\": {},\n\t\"CZ-104\": {}, \"CZ-105\": {}, \"CZ-106\": {}, \"CZ-107\": {}, \"CZ-108\": {},\n\t\"CZ-109\": {}, \"CZ-110\": {}, \"CZ-111\": {}, \"CZ-112\": {}, \"CZ-113\": {},\n\t\"CZ-114\": {}, \"CZ-115\": {}, \"CZ-116\": {}, \"CZ-117\": {}, \"CZ-118\": {},\n\t\"CZ-119\": {}, \"CZ-120\": {}, \"CZ-121\": {}, \"CZ-122\": {}, \"CZ-20\": {},\n\t\"CZ-201\": {}, \"CZ-202\": {}, \"CZ-203\": {}, \"CZ-204\": {}, \"CZ-205\": {},\n\t\"CZ-206\": {}, \"CZ-207\": {}, \"CZ-208\": {}, \"CZ-209\": {}, \"CZ-20A\": {},\n\t\"CZ-20B\": {}, \"CZ-20C\": {}, \"CZ-31\": {}, \"CZ-311\": {}, \"CZ-312\": {},\n\t\"CZ-313\": {}, \"CZ-314\": {}, \"CZ-315\": {}, \"CZ-316\": {}, \"CZ-317\": {},\n\t\"CZ-32\": {}, \"CZ-321\": {}, \"CZ-322\": {}, \"CZ-323\": {}, \"CZ-324\": {},\n\t\"CZ-325\": {}, \"CZ-326\": {}, \"CZ-327\": {}, \"CZ-41\": {}, \"CZ-411\": {},\n\t\"CZ-412\": {}, \"CZ-413\": {}, \"CZ-42\": {}, \"CZ-421\": {}, \"CZ-422\": {},\n\t\"CZ-423\": {}, \"CZ-424\": {}, \"CZ-425\": {}, \"CZ-426\": {}, \"CZ-427\": {},\n\t\"CZ-51\": {}, \"CZ-511\": {}, \"CZ-512\": {}, \"CZ-513\": {}, \"CZ-514\": {},\n\t\"CZ-52\": {}, \"CZ-521\": {}, \"CZ-522\": {}, \"CZ-523\": {}, \"CZ-524\": {},\n\t\"CZ-525\": {}, \"CZ-53\": {}, \"CZ-531\": {}, \"CZ-532\": {}, \"CZ-533\": {},\n\t\"CZ-534\": {}, \"CZ-63\": {}, \"CZ-631\": {}, \"CZ-632\": {}, \"CZ-633\": {},\n\t\"CZ-634\": {}, \"CZ-635\": {}, \"CZ-64\": {}, \"CZ-641\": {}, \"CZ-642\": {},\n\t\"CZ-643\": {}, \"CZ-644\": {}, \"CZ-645\": {}, \"CZ-646\": {}, \"CZ-647\": {},\n\t\"CZ-71\": {}, \"CZ-711\": {}, \"CZ-712\": {}, \"CZ-713\": {}, \"CZ-714\": {},\n\t\"CZ-715\": {}, \"CZ-72\": {}, \"CZ-721\": {}, \"CZ-722\": {}, \"CZ-723\": {},\n\t\"CZ-724\": {}, \"CZ-80\": {}, \"CZ-801\": {}, \"CZ-802\": {}, \"CZ-803\": {},\n\t\"CZ-804\": {}, \"CZ-805\": {}, \"CZ-806\": {}, \"DE-BB\": {}, \"DE-BE\": {},\n\t\"DE-BW\": {}, \"DE-BY\": {}, \"DE-HB\": {}, \"DE-HE\": {}, \"DE-HH\": {},\n\t\"DE-MV\": {}, \"DE-NI\": {}, \"DE-NW\": {}, \"DE-RP\": {}, \"DE-SH\": {},\n\t\"DE-SL\": {}, \"DE-SN\": {}, \"DE-ST\": {}, \"DE-TH\": {}, \"DJ-AR\": {},\n\t\"DJ-AS\": {}, \"DJ-DI\": {}, \"DJ-DJ\": {}, \"DJ-OB\": {}, \"DJ-TA\": {},\n\t\"DK-81\": {}, \"DK-82\": {}, \"DK-83\": {}, \"DK-84\": {}, \"DK-85\": {},\n\t\"DM-01\": {}, \"DM-02\": {}, \"DM-03\": {}, \"DM-04\": {}, \"DM-05\": {},\n\t\"DM-06\": {}, \"DM-07\": {}, \"DM-08\": {}, \"DM-09\": {}, \"DM-10\": {},\n\t\"DO-01\": {}, \"DO-02\": {}, \"DO-03\": {}, \"DO-04\": {}, \"DO-05\": {},\n\t\"DO-06\": {}, \"DO-07\": {}, \"DO-08\": {}, \"DO-09\": {}, \"DO-10\": {},\n\t\"DO-11\": {}, \"DO-12\": {}, \"DO-13\": {}, \"DO-14\": {}, \"DO-15\": {},\n\t\"DO-16\": {}, \"DO-17\": {}, \"DO-18\": {}, \"DO-19\": {}, \"DO-20\": {},\n\t\"DO-21\": {}, \"DO-22\": {}, \"DO-23\": {}, \"DO-24\": {}, \"DO-25\": {},\n\t\"DO-26\": {}, \"DO-27\": {}, \"DO-28\": {}, \"DO-29\": {}, \"DO-30\": {}, \"DO-31\": {},\n\t\"DZ-01\": {}, \"DZ-02\": {}, \"DZ-03\": {}, \"DZ-04\": {}, \"DZ-05\": {},\n\t\"DZ-06\": {}, \"DZ-07\": {}, \"DZ-08\": {}, \"DZ-09\": {}, \"DZ-10\": {},\n\t\"DZ-11\": {}, \"DZ-12\": {}, \"DZ-13\": {}, \"DZ-14\": {}, \"DZ-15\": {},\n\t\"DZ-16\": {}, \"DZ-17\": {}, \"DZ-18\": {}, \"DZ-19\": {}, \"DZ-20\": {},\n\t\"DZ-21\": {}, \"DZ-22\": {}, \"DZ-23\": {}, \"DZ-24\": {}, \"DZ-25\": {},\n\t\"DZ-26\": {}, \"DZ-27\": {}, \"DZ-28\": {}, \"DZ-29\": {}, \"DZ-30\": {},\n\t\"DZ-31\": {}, \"DZ-32\": {}, \"DZ-33\": {}, \"DZ-34\": {}, \"DZ-35\": {},\n\t\"DZ-36\": {}, \"DZ-37\": {}, \"DZ-38\": {}, \"DZ-39\": {}, \"DZ-40\": {},\n\t\"DZ-41\": {}, \"DZ-42\": {}, \"DZ-43\": {}, \"DZ-44\": {}, \"DZ-45\": {},\n\t\"DZ-46\": {}, \"DZ-47\": {}, \"DZ-48\": {}, \"DZ-49\": {}, \"DZ-51\": {},\n\t\"DZ-53\": {}, \"DZ-55\": {}, \"DZ-56\": {}, \"DZ-57\": {}, \"EC-A\": {}, \"EC-B\": {},\n\t\"EC-C\": {}, \"EC-D\": {}, \"EC-E\": {}, \"EC-F\": {}, \"EC-G\": {},\n\t\"EC-H\": {}, \"EC-I\": {}, \"EC-L\": {}, \"EC-M\": {}, \"EC-N\": {},\n\t\"EC-O\": {}, \"EC-P\": {}, \"EC-R\": {}, \"EC-S\": {}, \"EC-SD\": {},\n\t\"EC-SE\": {}, \"EC-T\": {}, \"EC-U\": {}, \"EC-W\": {}, \"EC-X\": {},\n\t\"EC-Y\": {}, \"EC-Z\": {}, \"EE-37\": {}, \"EE-39\": {}, \"EE-44\": {}, \"EE-45\": {},\n\t\"EE-49\": {}, \"EE-50\": {}, \"EE-51\": {}, \"EE-52\": {}, \"EE-56\": {}, \"EE-57\": {},\n\t\"EE-59\": {}, \"EE-60\": {}, \"EE-64\": {}, \"EE-65\": {}, \"EE-67\": {}, \"EE-68\": {},\n\t\"EE-70\": {}, \"EE-71\": {}, \"EE-74\": {}, \"EE-78\": {}, \"EE-79\": {}, \"EE-81\": {}, \"EE-82\": {},\n\t\"EE-84\": {}, \"EE-86\": {}, \"EE-87\": {}, \"EG-ALX\": {}, \"EG-ASN\": {}, \"EG-AST\": {},\n\t\"EG-BA\": {}, \"EG-BH\": {}, \"EG-BNS\": {}, \"EG-C\": {}, \"EG-DK\": {},\n\t\"EG-DT\": {}, \"EG-FYM\": {}, \"EG-GH\": {}, \"EG-GZ\": {}, \"EG-HU\": {},\n\t\"EG-IS\": {}, \"EG-JS\": {}, \"EG-KB\": {}, \"EG-KFS\": {}, \"EG-KN\": {},\n\t\"EG-LX\": {}, \"EG-MN\": {}, \"EG-MNF\": {}, \"EG-MT\": {}, \"EG-PTS\": {}, \"EG-SHG\": {},\n\t\"EG-SHR\": {}, \"EG-SIN\": {}, \"EG-SU\": {}, \"EG-SUZ\": {}, \"EG-WAD\": {},\n\t\"ER-AN\": {}, \"ER-DK\": {}, \"ER-DU\": {}, \"ER-GB\": {}, \"ER-MA\": {},\n\t\"ER-SK\": {}, \"ES-A\": {}, \"ES-AB\": {}, \"ES-AL\": {}, \"ES-AN\": {},\n\t\"ES-AR\": {}, \"ES-AS\": {}, \"ES-AV\": {}, \"ES-B\": {}, \"ES-BA\": {},\n\t\"ES-BI\": {}, \"ES-BU\": {}, \"ES-C\": {}, \"ES-CA\": {}, \"ES-CB\": {},\n\t\"ES-CC\": {}, \"ES-CE\": {}, \"ES-CL\": {}, \"ES-CM\": {}, \"ES-CN\": {},\n\t\"ES-CO\": {}, \"ES-CR\": {}, \"ES-CS\": {}, \"ES-CT\": {}, \"ES-CU\": {},\n\t\"ES-EX\": {}, \"ES-GA\": {}, \"ES-GC\": {}, \"ES-GI\": {}, \"ES-GR\": {},\n\t\"ES-GU\": {}, \"ES-H\": {}, \"ES-HU\": {}, \"ES-IB\": {}, \"ES-J\": {},\n\t\"ES-L\": {}, \"ES-LE\": {}, \"ES-LO\": {}, \"ES-LU\": {}, \"ES-M\": {},\n\t\"ES-MA\": {}, \"ES-MC\": {}, \"ES-MD\": {}, \"ES-ML\": {}, \"ES-MU\": {},\n\t\"ES-NA\": {}, \"ES-NC\": {}, \"ES-O\": {}, \"ES-OR\": {}, \"ES-P\": {},\n\t\"ES-PM\": {}, \"ES-PO\": {}, \"ES-PV\": {}, \"ES-RI\": {}, \"ES-S\": {},\n\t\"ES-SA\": {}, \"ES-SE\": {}, \"ES-SG\": {}, \"ES-SO\": {}, \"ES-SS\": {},\n\t\"ES-T\": {}, \"ES-TE\": {}, \"ES-TF\": {}, \"ES-TO\": {}, \"ES-V\": {},\n\t\"ES-VA\": {}, \"ES-VC\": {}, \"ES-VI\": {}, \"ES-Z\": {}, \"ES-ZA\": {},\n\t\"ET-AA\": {}, \"ET-AF\": {}, \"ET-AM\": {}, \"ET-BE\": {}, \"ET-DD\": {},\n\t\"ET-GA\": {}, \"ET-HA\": {}, \"ET-OR\": {}, \"ET-SN\": {}, \"ET-SO\": {},\n\t\"ET-TI\": {}, \"FI-01\": {}, \"FI-02\": {}, \"FI-03\": {}, \"FI-04\": {},\n\t\"FI-05\": {}, \"FI-06\": {}, \"FI-07\": {}, \"FI-08\": {}, \"FI-09\": {},\n\t\"FI-10\": {}, \"FI-11\": {}, \"FI-12\": {}, \"FI-13\": {}, \"FI-14\": {},\n\t\"FI-15\": {}, \"FI-16\": {}, \"FI-17\": {}, \"FI-18\": {}, \"FI-19\": {},\n\t\"FJ-C\": {}, \"FJ-E\": {}, \"FJ-N\": {}, \"FJ-R\": {}, \"FJ-W\": {},\n\t\"FM-KSA\": {}, \"FM-PNI\": {}, \"FM-TRK\": {}, \"FM-YAP\": {}, \"FR-01\": {},\n\t\"FR-02\": {}, \"FR-03\": {}, \"FR-04\": {}, \"FR-05\": {}, \"FR-06\": {},\n\t\"FR-07\": {}, \"FR-08\": {}, \"FR-09\": {}, \"FR-10\": {}, \"FR-11\": {},\n\t\"FR-12\": {}, \"FR-13\": {}, \"FR-14\": {}, \"FR-15\": {}, \"FR-16\": {},\n\t\"FR-17\": {}, \"FR-18\": {}, \"FR-19\": {}, \"FR-20R\": {}, \"FR-21\": {}, \"FR-22\": {},\n\t\"FR-23\": {}, \"FR-24\": {}, \"FR-25\": {}, \"FR-26\": {}, \"FR-27\": {},\n\t\"FR-28\": {}, \"FR-29\": {}, \"FR-2A\": {}, \"FR-2B\": {}, \"FR-30\": {},\n\t\"FR-31\": {}, \"FR-32\": {}, \"FR-33\": {}, \"FR-34\": {}, \"FR-35\": {},\n\t\"FR-36\": {}, \"FR-37\": {}, \"FR-38\": {}, \"FR-39\": {}, \"FR-40\": {},\n\t\"FR-41\": {}, \"FR-42\": {}, \"FR-43\": {}, \"FR-44\": {}, \"FR-45\": {},\n\t\"FR-46\": {}, \"FR-47\": {}, \"FR-48\": {}, \"FR-49\": {}, \"FR-50\": {},\n\t\"FR-51\": {}, \"FR-52\": {}, \"FR-53\": {}, \"FR-54\": {}, \"FR-55\": {},\n\t\"FR-56\": {}, \"FR-57\": {}, \"FR-58\": {}, \"FR-59\": {}, \"FR-60\": {},\n\t\"FR-61\": {}, \"FR-62\": {}, \"FR-63\": {}, \"FR-64\": {}, \"FR-65\": {},\n\t\"FR-66\": {}, \"FR-67\": {}, \"FR-68\": {}, \"FR-69\": {}, \"FR-70\": {},\n\t\"FR-71\": {}, \"FR-72\": {}, \"FR-73\": {}, \"FR-74\": {}, \"FR-75\": {},\n\t\"FR-76\": {}, \"FR-77\": {}, \"FR-78\": {}, \"FR-79\": {}, \"FR-80\": {},\n\t\"FR-81\": {}, \"FR-82\": {}, \"FR-83\": {}, \"FR-84\": {}, \"FR-85\": {},\n\t\"FR-86\": {}, \"FR-87\": {}, \"FR-88\": {}, \"FR-89\": {}, \"FR-90\": {},\n\t\"FR-91\": {}, \"FR-92\": {}, \"FR-93\": {}, \"FR-94\": {}, \"FR-95\": {},\n\t\"FR-ARA\": {}, \"FR-BFC\": {}, \"FR-BL\": {}, \"FR-BRE\": {}, \"FR-COR\": {},\n\t\"FR-CP\": {}, \"FR-CVL\": {}, \"FR-GES\": {}, \"FR-GF\": {}, \"FR-GP\": {},\n\t\"FR-GUA\": {}, \"FR-HDF\": {}, \"FR-IDF\": {}, \"FR-LRE\": {}, \"FR-MAY\": {},\n\t\"FR-MF\": {}, \"FR-MQ\": {}, \"FR-NAQ\": {}, \"FR-NC\": {}, \"FR-NOR\": {},\n\t\"FR-OCC\": {}, \"FR-PAC\": {}, \"FR-PDL\": {}, \"FR-PF\": {}, \"FR-PM\": {},\n\t\"FR-RE\": {}, \"FR-TF\": {}, \"FR-WF\": {}, \"FR-YT\": {}, \"GA-1\": {},\n\t\"GA-2\": {}, \"GA-3\": {}, \"GA-4\": {}, \"GA-5\": {}, \"GA-6\": {},\n\t\"GA-7\": {}, \"GA-8\": {}, \"GA-9\": {}, \"GB-ABC\": {}, \"GB-ABD\": {},\n\t\"GB-ABE\": {}, \"GB-AGB\": {}, \"GB-AGY\": {}, \"GB-AND\": {}, \"GB-ANN\": {},\n\t\"GB-ANS\": {}, \"GB-BAS\": {}, \"GB-BBD\": {}, \"GB-BDF\": {}, \"GB-BDG\": {},\n\t\"GB-BEN\": {}, \"GB-BEX\": {}, \"GB-BFS\": {}, \"GB-BGE\": {}, \"GB-BGW\": {},\n\t\"GB-BIR\": {}, \"GB-BKM\": {}, \"GB-BMH\": {}, \"GB-BNE\": {}, \"GB-BNH\": {},\n\t\"GB-BNS\": {}, \"GB-BOL\": {}, \"GB-BPL\": {}, \"GB-BRC\": {}, \"GB-BRD\": {},\n\t\"GB-BRY\": {}, \"GB-BST\": {}, \"GB-BUR\": {}, \"GB-CAM\": {}, \"GB-CAY\": {},\n\t\"GB-CBF\": {}, \"GB-CCG\": {}, \"GB-CGN\": {}, \"GB-CHE\": {}, \"GB-CHW\": {},\n\t\"GB-CLD\": {}, \"GB-CLK\": {}, \"GB-CMA\": {}, \"GB-CMD\": {}, \"GB-CMN\": {},\n\t\"GB-CON\": {}, \"GB-COV\": {}, \"GB-CRF\": {}, \"GB-CRY\": {}, \"GB-CWY\": {},\n\t\"GB-DAL\": {}, \"GB-DBY\": {}, \"GB-DEN\": {}, \"GB-DER\": {}, \"GB-DEV\": {},\n\t\"GB-DGY\": {}, \"GB-DNC\": {}, \"GB-DND\": {}, \"GB-DOR\": {}, \"GB-DRS\": {},\n\t\"GB-DUD\": {}, \"GB-DUR\": {}, \"GB-EAL\": {}, \"GB-EAW\": {}, \"GB-EAY\": {},\n\t\"GB-EDH\": {}, \"GB-EDU\": {}, \"GB-ELN\": {}, \"GB-ELS\": {}, \"GB-ENF\": {},\n\t\"GB-ENG\": {}, \"GB-ERW\": {}, \"GB-ERY\": {}, \"GB-ESS\": {}, \"GB-ESX\": {},\n\t\"GB-FAL\": {}, \"GB-FIF\": {}, \"GB-FLN\": {}, \"GB-FMO\": {}, \"GB-GAT\": {},\n\t\"GB-GBN\": {}, \"GB-GLG\": {}, \"GB-GLS\": {}, \"GB-GRE\": {}, \"GB-GWN\": {},\n\t\"GB-HAL\": {}, \"GB-HAM\": {}, \"GB-HAV\": {}, \"GB-HCK\": {}, \"GB-HEF\": {},\n\t\"GB-HIL\": {}, \"GB-HLD\": {}, \"GB-HMF\": {}, \"GB-HNS\": {}, \"GB-HPL\": {},\n\t\"GB-HRT\": {}, \"GB-HRW\": {}, \"GB-HRY\": {}, \"GB-IOS\": {}, \"GB-IOW\": {},\n\t\"GB-ISL\": {}, \"GB-IVC\": {}, \"GB-KEC\": {}, \"GB-KEN\": {}, \"GB-KHL\": {},\n\t\"GB-KIR\": {}, \"GB-KTT\": {}, \"GB-KWL\": {}, \"GB-LAN\": {}, \"GB-LBC\": {},\n\t\"GB-LBH\": {}, \"GB-LCE\": {}, \"GB-LDS\": {}, \"GB-LEC\": {}, \"GB-LEW\": {},\n\t\"GB-LIN\": {}, \"GB-LIV\": {}, \"GB-LND\": {}, \"GB-LUT\": {}, \"GB-MAN\": {},\n\t\"GB-MDB\": {}, \"GB-MDW\": {}, \"GB-MEA\": {}, \"GB-MIK\": {}, \"GD-01\": {},\n\t\"GB-MLN\": {}, \"GB-MON\": {}, \"GB-MRT\": {}, \"GB-MRY\": {}, \"GB-MTY\": {},\n\t\"GB-MUL\": {}, \"GB-NAY\": {}, \"GB-NBL\": {}, \"GB-NEL\": {}, \"GB-NET\": {},\n\t\"GB-NFK\": {}, \"GB-NGM\": {}, \"GB-NIR\": {}, \"GB-NLK\": {}, \"GB-NLN\": {},\n\t\"GB-NMD\": {}, \"GB-NSM\": {}, \"GB-NTH\": {}, \"GB-NTL\": {}, \"GB-NTT\": {},\n\t\"GB-NTY\": {}, \"GB-NWM\": {}, \"GB-NWP\": {}, \"GB-NYK\": {}, \"GB-OLD\": {},\n\t\"GB-ORK\": {}, \"GB-OXF\": {}, \"GB-PEM\": {}, \"GB-PKN\": {}, \"GB-PLY\": {},\n\t\"GB-POL\": {}, \"GB-POR\": {}, \"GB-POW\": {}, \"GB-PTE\": {}, \"GB-RCC\": {},\n\t\"GB-RCH\": {}, \"GB-RCT\": {}, \"GB-RDB\": {}, \"GB-RDG\": {}, \"GB-RFW\": {},\n\t\"GB-RIC\": {}, \"GB-ROT\": {}, \"GB-RUT\": {}, \"GB-SAW\": {}, \"GB-SAY\": {},\n\t\"GB-SCB\": {}, \"GB-SCT\": {}, \"GB-SFK\": {}, \"GB-SFT\": {}, \"GB-SGC\": {},\n\t\"GB-SHF\": {}, \"GB-SHN\": {}, \"GB-SHR\": {}, \"GB-SKP\": {}, \"GB-SLF\": {},\n\t\"GB-SLG\": {}, \"GB-SLK\": {}, \"GB-SND\": {}, \"GB-SOL\": {}, \"GB-SOM\": {},\n\t\"GB-SOS\": {}, \"GB-SRY\": {}, \"GB-STE\": {}, \"GB-STG\": {}, \"GB-STH\": {},\n\t\"GB-STN\": {}, \"GB-STS\": {}, \"GB-STT\": {}, \"GB-STY\": {}, \"GB-SWA\": {},\n\t\"GB-SWD\": {}, \"GB-SWK\": {}, \"GB-TAM\": {}, \"GB-TFW\": {}, \"GB-THR\": {},\n\t\"GB-TOB\": {}, \"GB-TOF\": {}, \"GB-TRF\": {}, \"GB-TWH\": {}, \"GB-UKM\": {},\n\t\"GB-VGL\": {}, \"GB-WAR\": {}, \"GB-WBK\": {}, \"GB-WDU\": {}, \"GB-WFT\": {},\n\t\"GB-WGN\": {}, \"GB-WIL\": {}, \"GB-WKF\": {}, \"GB-WLL\": {}, \"GB-WLN\": {},\n\t\"GB-WLS\": {}, \"GB-WLV\": {}, \"GB-WND\": {}, \"GB-WNM\": {}, \"GB-WOK\": {},\n\t\"GB-WOR\": {}, \"GB-WRL\": {}, \"GB-WRT\": {}, \"GB-WRX\": {}, \"GB-WSM\": {},\n\t\"GB-WSX\": {}, \"GB-YOR\": {}, \"GB-ZET\": {}, \"GD-02\": {}, \"GD-03\": {},\n\t\"GD-04\": {}, \"GD-05\": {}, \"GD-06\": {}, \"GD-10\": {}, \"GE-AB\": {},\n\t\"GE-AJ\": {}, \"GE-GU\": {}, \"GE-IM\": {}, \"GE-KA\": {}, \"GE-KK\": {},\n\t\"GE-MM\": {}, \"GE-RL\": {}, \"GE-SJ\": {}, \"GE-SK\": {}, \"GE-SZ\": {},\n\t\"GE-TB\": {}, \"GH-AA\": {}, \"GH-AH\": {}, \"GH-AF\": {}, \"GH-BA\": {}, \"GH-BO\": {}, \"GH-BE\": {}, \"GH-CP\": {},\n\t\"GH-EP\": {}, \"GH-NP\": {}, \"GH-TV\": {}, \"GH-UE\": {}, \"GH-UW\": {},\n\t\"GH-WP\": {}, \"GL-AV\": {}, \"GL-KU\": {}, \"GL-QA\": {}, \"GL-QT\": {}, \"GL-QE\": {}, \"GL-SM\": {},\n\t\"GM-B\": {}, \"GM-L\": {}, \"GM-M\": {}, \"GM-N\": {}, \"GM-U\": {},\n\t\"GM-W\": {}, \"GN-B\": {}, \"GN-BE\": {}, \"GN-BF\": {}, \"GN-BK\": {},\n\t\"GN-C\": {}, \"GN-CO\": {}, \"GN-D\": {}, \"GN-DB\": {}, \"GN-DI\": {},\n\t\"GN-DL\": {}, \"GN-DU\": {}, \"GN-F\": {}, \"GN-FA\": {}, \"GN-FO\": {},\n\t\"GN-FR\": {}, \"GN-GA\": {}, \"GN-GU\": {}, \"GN-K\": {}, \"GN-KA\": {},\n\t\"GN-KB\": {}, \"GN-KD\": {}, \"GN-KE\": {}, \"GN-KN\": {}, \"GN-KO\": {},\n\t\"GN-KS\": {}, \"GN-L\": {}, \"GN-LA\": {}, \"GN-LE\": {}, \"GN-LO\": {},\n\t\"GN-M\": {}, \"GN-MC\": {}, \"GN-MD\": {}, \"GN-ML\": {}, \"GN-MM\": {},\n\t\"GN-N\": {}, \"GN-NZ\": {}, \"GN-PI\": {}, \"GN-SI\": {}, \"GN-TE\": {},\n\t\"GN-TO\": {}, \"GN-YO\": {}, \"GQ-AN\": {}, \"GQ-BN\": {}, \"GQ-BS\": {},\n\t\"GQ-C\": {}, \"GQ-CS\": {}, \"GQ-I\": {}, \"GQ-KN\": {}, \"GQ-LI\": {},\n\t\"GQ-WN\": {}, \"GR-01\": {}, \"GR-03\": {}, \"GR-04\": {}, \"GR-05\": {},\n\t\"GR-06\": {}, \"GR-07\": {}, \"GR-11\": {}, \"GR-12\": {}, \"GR-13\": {},\n\t\"GR-14\": {}, \"GR-15\": {}, \"GR-16\": {}, \"GR-17\": {}, \"GR-21\": {},\n\t\"GR-22\": {}, \"GR-23\": {}, \"GR-24\": {}, \"GR-31\": {}, \"GR-32\": {},\n\t\"GR-33\": {}, \"GR-34\": {}, \"GR-41\": {}, \"GR-42\": {}, \"GR-43\": {},\n\t\"GR-44\": {}, \"GR-51\": {}, \"GR-52\": {}, \"GR-53\": {}, \"GR-54\": {},\n\t\"GR-55\": {}, \"GR-56\": {}, \"GR-57\": {}, \"GR-58\": {}, \"GR-59\": {},\n\t\"GR-61\": {}, \"GR-62\": {}, \"GR-63\": {}, \"GR-64\": {}, \"GR-69\": {},\n\t\"GR-71\": {}, \"GR-72\": {}, \"GR-73\": {}, \"GR-81\": {}, \"GR-82\": {},\n\t\"GR-83\": {}, \"GR-84\": {}, \"GR-85\": {}, \"GR-91\": {}, \"GR-92\": {},\n\t\"GR-93\": {}, \"GR-94\": {}, \"GR-A\": {}, \"GR-A1\": {}, \"GR-B\": {},\n\t\"GR-C\": {}, \"GR-D\": {}, \"GR-E\": {}, \"GR-F\": {}, \"GR-G\": {},\n\t\"GR-H\": {}, \"GR-I\": {}, \"GR-J\": {}, \"GR-K\": {}, \"GR-L\": {},\n\t\"GR-M\": {}, \"GT-01\": {}, \"GT-02\": {}, \"GT-03\": {}, \"GT-04\": {},\n\t\"GT-05\": {}, \"GT-06\": {}, \"GT-07\": {}, \"GT-08\": {}, \"GT-09\": {},\n\t\"GT-10\": {}, \"GT-11\": {}, \"GT-12\": {}, \"GT-13\": {}, \"GT-14\": {},\n\t\"GT-15\": {}, \"GT-16\": {}, \"GT-17\": {}, \"GT-18\": {}, \"GT-19\": {},\n\t\"GT-20\": {}, \"GT-21\": {}, \"GT-22\": {}, \"GW-BA\": {}, \"GW-BL\": {},\n\t\"GW-BM\": {}, \"GW-BS\": {}, \"GW-CA\": {}, \"GW-GA\": {}, \"GW-L\": {},\n\t\"GW-N\": {}, \"GW-OI\": {}, \"GW-QU\": {}, \"GW-S\": {}, \"GW-TO\": {},\n\t\"GY-BA\": {}, \"GY-CU\": {}, \"GY-DE\": {}, \"GY-EB\": {}, \"GY-ES\": {},\n\t\"GY-MA\": {}, \"GY-PM\": {}, \"GY-PT\": {}, \"GY-UD\": {}, \"GY-UT\": {},\n\t\"HN-AT\": {}, \"HN-CH\": {}, \"HN-CL\": {}, \"HN-CM\": {}, \"HN-CP\": {},\n\t\"HN-CR\": {}, \"HN-EP\": {}, \"HN-FM\": {}, \"HN-GD\": {}, \"HN-IB\": {},\n\t\"HN-IN\": {}, \"HN-LE\": {}, \"HN-LP\": {}, \"HN-OC\": {}, \"HN-OL\": {},\n\t\"HN-SB\": {}, \"HN-VA\": {}, \"HN-YO\": {}, \"HR-01\": {}, \"HR-02\": {},\n\t\"HR-03\": {}, \"HR-04\": {}, \"HR-05\": {}, \"HR-06\": {}, \"HR-07\": {},\n\t\"HR-08\": {}, \"HR-09\": {}, \"HR-10\": {}, \"HR-11\": {}, \"HR-12\": {},\n\t\"HR-13\": {}, \"HR-14\": {}, \"HR-15\": {}, \"HR-16\": {}, \"HR-17\": {},\n\t\"HR-18\": {}, \"HR-19\": {}, \"HR-20\": {}, \"HR-21\": {}, \"HT-AR\": {},\n\t\"HT-CE\": {}, \"HT-GA\": {}, \"HT-ND\": {}, \"HT-NE\": {}, \"HT-NO\": {}, \"HT-NI\": {},\n\t\"HT-OU\": {}, \"HT-SD\": {}, \"HT-SE\": {}, \"HU-BA\": {}, \"HU-BC\": {},\n\t\"HU-BE\": {}, \"HU-BK\": {}, \"HU-BU\": {}, \"HU-BZ\": {}, \"HU-CS\": {},\n\t\"HU-DE\": {}, \"HU-DU\": {}, \"HU-EG\": {}, \"HU-ER\": {}, \"HU-FE\": {},\n\t\"HU-GS\": {}, \"HU-GY\": {}, \"HU-HB\": {}, \"HU-HE\": {}, \"HU-HV\": {},\n\t\"HU-JN\": {}, \"HU-KE\": {}, \"HU-KM\": {}, \"HU-KV\": {}, \"HU-MI\": {},\n\t\"HU-NK\": {}, \"HU-NO\": {}, \"HU-NY\": {}, \"HU-PE\": {}, \"HU-PS\": {},\n\t\"HU-SD\": {}, \"HU-SF\": {}, \"HU-SH\": {}, \"HU-SK\": {}, \"HU-SN\": {},\n\t\"HU-SO\": {}, \"HU-SS\": {}, \"HU-ST\": {}, \"HU-SZ\": {}, \"HU-TB\": {},\n\t\"HU-TO\": {}, \"HU-VA\": {}, \"HU-VE\": {}, \"HU-VM\": {}, \"HU-ZA\": {},\n\t\"HU-ZE\": {}, \"ID-AC\": {}, \"ID-BA\": {}, \"ID-BB\": {}, \"ID-BE\": {},\n\t\"ID-BT\": {}, \"ID-GO\": {}, \"ID-IJ\": {}, \"ID-JA\": {}, \"ID-JB\": {},\n\t\"ID-JI\": {}, \"ID-JK\": {}, \"ID-JT\": {}, \"ID-JW\": {}, \"ID-KA\": {},\n\t\"ID-KB\": {}, \"ID-KI\": {}, \"ID-KU\": {}, \"ID-KR\": {}, \"ID-KS\": {},\n\t\"ID-KT\": {}, \"ID-LA\": {}, \"ID-MA\": {}, \"ID-ML\": {}, \"ID-MU\": {},\n\t\"ID-NB\": {}, \"ID-NT\": {}, \"ID-NU\": {}, \"ID-PA\": {}, \"ID-PB\": {},\n\t\"ID-PD\": {}, \"ID-PE\": {}, \"ID-PP\": {}, \"ID-PS\": {}, \"ID-PT\": {}, \"ID-RI\": {},\n\t\"ID-SA\": {}, \"ID-SB\": {}, \"ID-SG\": {}, \"ID-SL\": {}, \"ID-SM\": {},\n\t\"ID-SN\": {}, \"ID-SR\": {}, \"ID-SS\": {}, \"ID-ST\": {}, \"ID-SU\": {},\n\t\"ID-YO\": {}, \"IE-C\": {}, \"IE-CE\": {}, \"IE-CN\": {}, \"IE-CO\": {},\n\t\"IE-CW\": {}, \"IE-D\": {}, \"IE-DL\": {}, \"IE-G\": {}, \"IE-KE\": {},\n\t\"IE-KK\": {}, \"IE-KY\": {}, \"IE-L\": {}, \"IE-LD\": {}, \"IE-LH\": {},\n\t\"IE-LK\": {}, \"IE-LM\": {}, \"IE-LS\": {}, \"IE-M\": {}, \"IE-MH\": {},\n\t\"IE-MN\": {}, \"IE-MO\": {}, \"IE-OY\": {}, \"IE-RN\": {}, \"IE-SO\": {},\n\t\"IE-TA\": {}, \"IE-U\": {}, \"IE-WD\": {}, \"IE-WH\": {}, \"IE-WW\": {},\n\t\"IE-WX\": {}, \"IL-D\": {}, \"IL-HA\": {}, \"IL-JM\": {}, \"IL-M\": {},\n\t\"IL-TA\": {}, \"IL-Z\": {}, \"IN-AN\": {}, \"IN-AP\": {}, \"IN-AR\": {},\n\t\"IN-AS\": {}, \"IN-BR\": {}, \"IN-CH\": {}, \"IN-CT\": {}, \"IN-DH\": {},\n\t\"IN-DL\": {}, \"IN-DN\": {}, \"IN-GA\": {}, \"IN-GJ\": {}, \"IN-HP\": {},\n\t\"IN-HR\": {}, \"IN-JH\": {}, \"IN-JK\": {}, \"IN-KA\": {}, \"IN-KL\": {},\n\t\"IN-LA\": {}, \"IN-LD\": {}, \"IN-MH\": {}, \"IN-ML\": {}, \"IN-MN\": {}, \"IN-MP\": {},\n\t\"IN-MZ\": {}, \"IN-NL\": {}, \"IN-TG\": {}, \"IN-OR\": {}, \"IN-PB\": {}, \"IN-PY\": {},\n\t\"IN-RJ\": {}, \"IN-SK\": {}, \"IN-TN\": {}, \"IN-TR\": {}, \"IN-UP\": {},\n\t\"IN-UT\": {}, \"IN-WB\": {}, \"IQ-AN\": {}, \"IQ-AR\": {}, \"IQ-BA\": {},\n\t\"IQ-BB\": {}, \"IQ-BG\": {}, \"IQ-DA\": {}, \"IQ-DI\": {}, \"IQ-DQ\": {},\n\t\"IQ-KA\": {}, \"IQ-KI\": {}, \"IQ-MA\": {}, \"IQ-MU\": {}, \"IQ-NA\": {}, \"IQ-NI\": {},\n\t\"IQ-QA\": {}, \"IQ-SD\": {}, \"IQ-SW\": {}, \"IQ-SU\": {}, \"IQ-TS\": {}, \"IQ-WA\": {},\n\t\"IR-00\": {}, \"IR-01\": {}, \"IR-02\": {}, \"IR-03\": {}, \"IR-04\": {}, \"IR-05\": {},\n\t\"IR-06\": {}, \"IR-07\": {}, \"IR-08\": {}, \"IR-09\": {}, \"IR-10\": {}, \"IR-11\": {},\n\t\"IR-12\": {}, \"IR-13\": {}, \"IR-14\": {}, \"IR-15\": {}, \"IR-16\": {},\n\t\"IR-17\": {}, \"IR-18\": {}, \"IR-19\": {}, \"IR-20\": {}, \"IR-21\": {},\n\t\"IR-22\": {}, \"IR-23\": {}, \"IR-24\": {}, \"IR-25\": {}, \"IR-26\": {},\n\t\"IR-27\": {}, \"IR-28\": {}, \"IR-29\": {}, \"IR-30\": {}, \"IR-31\": {},\n\t\"IS-0\": {}, \"IS-1\": {}, \"IS-2\": {}, \"IS-3\": {}, \"IS-4\": {},\n\t\"IS-5\": {}, \"IS-6\": {}, \"IS-7\": {}, \"IS-8\": {}, \"IT-21\": {},\n\t\"IT-23\": {}, \"IT-25\": {}, \"IT-32\": {}, \"IT-34\": {}, \"IT-36\": {},\n\t\"IT-42\": {}, \"IT-45\": {}, \"IT-52\": {}, \"IT-55\": {}, \"IT-57\": {},\n\t\"IT-62\": {}, \"IT-65\": {}, \"IT-67\": {}, \"IT-72\": {}, \"IT-75\": {},\n\t\"IT-77\": {}, \"IT-78\": {}, \"IT-82\": {}, \"IT-88\": {}, \"IT-AG\": {},\n\t\"IT-AL\": {}, \"IT-AN\": {}, \"IT-AO\": {}, \"IT-AP\": {}, \"IT-AQ\": {},\n\t\"IT-AR\": {}, \"IT-AT\": {}, \"IT-AV\": {}, \"IT-BA\": {}, \"IT-BG\": {},\n\t\"IT-BI\": {}, \"IT-BL\": {}, \"IT-BN\": {}, \"IT-BO\": {}, \"IT-BR\": {},\n\t\"IT-BS\": {}, \"IT-BT\": {}, \"IT-BZ\": {}, \"IT-CA\": {}, \"IT-CB\": {},\n\t\"IT-CE\": {}, \"IT-CH\": {}, \"IT-CI\": {}, \"IT-CL\": {}, \"IT-CN\": {},\n\t\"IT-CO\": {}, \"IT-CR\": {}, \"IT-CS\": {}, \"IT-CT\": {}, \"IT-CZ\": {},\n\t\"IT-EN\": {}, \"IT-FC\": {}, \"IT-FE\": {}, \"IT-FG\": {}, \"IT-FI\": {},\n\t\"IT-FM\": {}, \"IT-FR\": {}, \"IT-GE\": {}, \"IT-GO\": {}, \"IT-GR\": {},\n\t\"IT-IM\": {}, \"IT-IS\": {}, \"IT-KR\": {}, \"IT-LC\": {}, \"IT-LE\": {},\n\t\"IT-LI\": {}, \"IT-LO\": {}, \"IT-LT\": {}, \"IT-LU\": {}, \"IT-MB\": {},\n\t\"IT-MC\": {}, \"IT-ME\": {}, \"IT-MI\": {}, \"IT-MN\": {}, \"IT-MO\": {},\n\t\"IT-MS\": {}, \"IT-MT\": {}, \"IT-NA\": {}, \"IT-NO\": {}, \"IT-NU\": {},\n\t\"IT-OG\": {}, \"IT-OR\": {}, \"IT-OT\": {}, \"IT-PA\": {}, \"IT-PC\": {},\n\t\"IT-PD\": {}, \"IT-PE\": {}, \"IT-PG\": {}, \"IT-PI\": {}, \"IT-PN\": {},\n\t\"IT-PO\": {}, \"IT-PR\": {}, \"IT-PT\": {}, \"IT-PU\": {}, \"IT-PV\": {},\n\t\"IT-PZ\": {}, \"IT-RA\": {}, \"IT-RC\": {}, \"IT-RE\": {}, \"IT-RG\": {},\n\t\"IT-RI\": {}, \"IT-RM\": {}, \"IT-RN\": {}, \"IT-RO\": {}, \"IT-SA\": {},\n\t\"IT-SI\": {}, \"IT-SO\": {}, \"IT-SP\": {}, \"IT-SR\": {}, \"IT-SS\": {},\n\t\"IT-SV\": {}, \"IT-TA\": {}, \"IT-TE\": {}, \"IT-TN\": {}, \"IT-TO\": {},\n\t\"IT-TP\": {}, \"IT-TR\": {}, \"IT-TS\": {}, \"IT-TV\": {}, \"IT-UD\": {},\n\t\"IT-VA\": {}, \"IT-VB\": {}, \"IT-VC\": {}, \"IT-VE\": {}, \"IT-VI\": {},\n\t\"IT-VR\": {}, \"IT-VS\": {}, \"IT-VT\": {}, \"IT-VV\": {}, \"JM-01\": {},\n\t\"JM-02\": {}, \"JM-03\": {}, \"JM-04\": {}, \"JM-05\": {}, \"JM-06\": {},\n\t\"JM-07\": {}, \"JM-08\": {}, \"JM-09\": {}, \"JM-10\": {}, \"JM-11\": {},\n\t\"JM-12\": {}, \"JM-13\": {}, \"JM-14\": {}, \"JO-AJ\": {}, \"JO-AM\": {},\n\t\"JO-AQ\": {}, \"JO-AT\": {}, \"JO-AZ\": {}, \"JO-BA\": {}, \"JO-IR\": {},\n\t\"JO-JA\": {}, \"JO-KA\": {}, \"JO-MA\": {}, \"JO-MD\": {}, \"JO-MN\": {},\n\t\"JP-01\": {}, \"JP-02\": {}, \"JP-03\": {}, \"JP-04\": {}, \"JP-05\": {},\n\t\"JP-06\": {}, \"JP-07\": {}, \"JP-08\": {}, \"JP-09\": {}, \"JP-10\": {},\n\t\"JP-11\": {}, \"JP-12\": {}, \"JP-13\": {}, \"JP-14\": {}, \"JP-15\": {},\n\t\"JP-16\": {}, \"JP-17\": {}, \"JP-18\": {}, \"JP-19\": {}, \"JP-20\": {},\n\t\"JP-21\": {}, \"JP-22\": {}, \"JP-23\": {}, \"JP-24\": {}, \"JP-25\": {},\n\t\"JP-26\": {}, \"JP-27\": {}, \"JP-28\": {}, \"JP-29\": {}, \"JP-30\": {},\n\t\"JP-31\": {}, \"JP-32\": {}, \"JP-33\": {}, \"JP-34\": {}, \"JP-35\": {},\n\t\"JP-36\": {}, \"JP-37\": {}, \"JP-38\": {}, \"JP-39\": {}, \"JP-40\": {},\n\t\"JP-41\": {}, \"JP-42\": {}, \"JP-43\": {}, \"JP-44\": {}, \"JP-45\": {},\n\t\"JP-46\": {}, \"JP-47\": {}, \"KE-01\": {}, \"KE-02\": {}, \"KE-03\": {},\n\t\"KE-04\": {}, \"KE-05\": {}, \"KE-06\": {}, \"KE-07\": {}, \"KE-08\": {},\n\t\"KE-09\": {}, \"KE-10\": {}, \"KE-11\": {}, \"KE-12\": {}, \"KE-13\": {},\n\t\"KE-14\": {}, \"KE-15\": {}, \"KE-16\": {}, \"KE-17\": {}, \"KE-18\": {},\n\t\"KE-19\": {}, \"KE-20\": {}, \"KE-21\": {}, \"KE-22\": {}, \"KE-23\": {},\n\t\"KE-24\": {}, \"KE-25\": {}, \"KE-26\": {}, \"KE-27\": {}, \"KE-28\": {},\n\t\"KE-29\": {}, \"KE-30\": {}, \"KE-31\": {}, \"KE-32\": {}, \"KE-33\": {},\n\t\"KE-34\": {}, \"KE-35\": {}, \"KE-36\": {}, \"KE-37\": {}, \"KE-38\": {},\n\t\"KE-39\": {}, \"KE-40\": {}, \"KE-41\": {}, \"KE-42\": {}, \"KE-43\": {},\n\t\"KE-44\": {}, \"KE-45\": {}, \"KE-46\": {}, \"KE-47\": {}, \"KG-B\": {},\n\t\"KG-C\": {}, \"KG-GB\": {}, \"KG-GO\": {}, \"KG-J\": {}, \"KG-N\": {}, \"KG-O\": {},\n\t\"KG-T\": {}, \"KG-Y\": {}, \"KH-1\": {}, \"KH-10\": {}, \"KH-11\": {},\n\t\"KH-12\": {}, \"KH-13\": {}, \"KH-14\": {}, \"KH-15\": {}, \"KH-16\": {},\n\t\"KH-17\": {}, \"KH-18\": {}, \"KH-19\": {}, \"KH-2\": {}, \"KH-20\": {},\n\t\"KH-21\": {}, \"KH-22\": {}, \"KH-23\": {}, \"KH-24\": {}, \"KH-3\": {},\n\t\"KH-4\": {}, \"KH-5\": {}, \"KH-6\": {}, \"KH-7\": {}, \"KH-8\": {},\n\t\"KH-9\": {}, \"KI-G\": {}, \"KI-L\": {}, \"KI-P\": {}, \"KM-A\": {},\n\t\"KM-G\": {}, \"KM-M\": {}, \"KN-01\": {}, \"KN-02\": {}, \"KN-03\": {},\n\t\"KN-04\": {}, \"KN-05\": {}, \"KN-06\": {}, \"KN-07\": {}, \"KN-08\": {},\n\t\"KN-09\": {}, \"KN-10\": {}, \"KN-11\": {}, \"KN-12\": {}, \"KN-13\": {},\n\t\"KN-15\": {}, \"KN-K\": {}, \"KN-N\": {}, \"KP-01\": {}, \"KP-02\": {},\n\t\"KP-03\": {}, \"KP-04\": {}, \"KP-05\": {}, \"KP-06\": {}, \"KP-07\": {},\n\t\"KP-08\": {}, \"KP-09\": {}, \"KP-10\": {}, \"KP-13\": {}, \"KR-11\": {},\n\t\"KR-26\": {}, \"KR-27\": {}, \"KR-28\": {}, \"KR-29\": {}, \"KR-30\": {},\n\t\"KR-31\": {}, \"KR-41\": {}, \"KR-42\": {}, \"KR-43\": {}, \"KR-44\": {},\n\t\"KR-45\": {}, \"KR-46\": {}, \"KR-47\": {}, \"KR-48\": {}, \"KR-49\": {}, \"KR-50\": {},\n\t\"KW-AH\": {}, \"KW-FA\": {}, \"KW-HA\": {}, \"KW-JA\": {}, \"KW-KU\": {},\n\t\"KW-MU\": {}, \"KZ-10\": {}, \"KZ-75\": {}, \"KZ-19\": {}, \"KZ-11\": {},\n\t\"KZ-15\": {}, \"KZ-71\": {}, \"KZ-23\": {}, \"KZ-27\": {}, \"KZ-47\": {},\n\t\"KZ-55\": {}, \"KZ-35\": {}, \"KZ-39\": {}, \"KZ-43\": {}, \"KZ-63\": {},\n\t\"KZ-79\": {}, \"KZ-59\": {}, \"KZ-61\": {}, \"KZ-62\": {}, \"KZ-31\": {},\n\t\"KZ-33\": {}, \"LA-AT\": {}, \"LA-BK\": {}, \"LA-BL\": {},\n\t\"LA-CH\": {}, \"LA-HO\": {}, \"LA-KH\": {}, \"LA-LM\": {}, \"LA-LP\": {},\n\t\"LA-OU\": {}, \"LA-PH\": {}, \"LA-SL\": {}, \"LA-SV\": {}, \"LA-VI\": {},\n\t\"LA-VT\": {}, \"LA-XA\": {}, \"LA-XE\": {}, \"LA-XI\": {}, \"LA-XS\": {},\n\t\"LB-AK\": {}, \"LB-AS\": {}, \"LB-BA\": {}, \"LB-BH\": {}, \"LB-BI\": {},\n\t\"LB-JA\": {}, \"LB-JL\": {}, \"LB-NA\": {}, \"LC-01\": {}, \"LC-02\": {},\n\t\"LC-03\": {}, \"LC-05\": {}, \"LC-06\": {}, \"LC-07\": {}, \"LC-08\": {},\n\t\"LC-10\": {}, \"LC-11\": {}, \"LI-01\": {}, \"LI-02\": {},\n\t\"LI-03\": {}, \"LI-04\": {}, \"LI-05\": {}, \"LI-06\": {}, \"LI-07\": {},\n\t\"LI-08\": {}, \"LI-09\": {}, \"LI-10\": {}, \"LI-11\": {}, \"LK-1\": {},\n\t\"LK-11\": {}, \"LK-12\": {}, \"LK-13\": {}, \"LK-2\": {}, \"LK-21\": {},\n\t\"LK-22\": {}, \"LK-23\": {}, \"LK-3\": {}, \"LK-31\": {}, \"LK-32\": {},\n\t\"LK-33\": {}, \"LK-4\": {}, \"LK-41\": {}, \"LK-42\": {}, \"LK-43\": {},\n\t\"LK-44\": {}, \"LK-45\": {}, \"LK-5\": {}, \"LK-51\": {}, \"LK-52\": {},\n\t\"LK-53\": {}, \"LK-6\": {}, \"LK-61\": {}, \"LK-62\": {}, \"LK-7\": {},\n\t\"LK-71\": {}, \"LK-72\": {}, \"LK-8\": {}, \"LK-81\": {}, \"LK-82\": {},\n\t\"LK-9\": {}, \"LK-91\": {}, \"LK-92\": {}, \"LR-BG\": {}, \"LR-BM\": {},\n\t\"LR-CM\": {}, \"LR-GB\": {}, \"LR-GG\": {}, \"LR-GK\": {}, \"LR-LO\": {},\n\t\"LR-MG\": {}, \"LR-MO\": {}, \"LR-MY\": {}, \"LR-NI\": {}, \"LR-RI\": {},\n\t\"LR-SI\": {}, \"LS-A\": {}, \"LS-B\": {}, \"LS-C\": {}, \"LS-D\": {},\n\t\"LS-E\": {}, \"LS-F\": {}, \"LS-G\": {}, \"LS-H\": {}, \"LS-J\": {},\n\t\"LS-K\": {}, \"LT-AL\": {}, \"LT-KL\": {}, \"LT-KU\": {}, \"LT-MR\": {},\n\t\"LT-PN\": {}, \"LT-SA\": {}, \"LT-TA\": {}, \"LT-TE\": {}, \"LT-UT\": {},\n\t\"LT-VL\": {}, \"LU-CA\": {}, \"LU-CL\": {}, \"LU-DI\": {}, \"LU-EC\": {},\n\t\"LU-ES\": {}, \"LU-GR\": {}, \"LU-LU\": {}, \"LU-ME\": {}, \"LU-RD\": {},\n\t\"LU-RM\": {}, \"LU-VD\": {}, \"LU-WI\": {}, \"LU-D\": {}, \"LU-G\": {}, \"LU-L\": {},\n\t\"LV-001\": {}, \"LV-111\": {}, \"LV-112\": {}, \"LV-113\": {},\n\t\"LV-002\": {}, \"LV-003\": {}, \"LV-004\": {}, \"LV-005\": {}, \"LV-006\": {},\n\t\"LV-007\": {}, \"LV-008\": {}, \"LV-009\": {}, \"LV-010\": {}, \"LV-011\": {},\n\t\"LV-012\": {}, \"LV-013\": {}, \"LV-014\": {}, \"LV-015\": {}, \"LV-016\": {},\n\t\"LV-017\": {}, \"LV-018\": {}, \"LV-019\": {}, \"LV-020\": {}, \"LV-021\": {},\n\t\"LV-022\": {}, \"LV-023\": {}, \"LV-024\": {}, \"LV-025\": {}, \"LV-026\": {},\n\t\"LV-027\": {}, \"LV-028\": {}, \"LV-029\": {}, \"LV-030\": {}, \"LV-031\": {},\n\t\"LV-032\": {}, \"LV-033\": {}, \"LV-034\": {}, \"LV-035\": {}, \"LV-036\": {},\n\t\"LV-037\": {}, \"LV-038\": {}, \"LV-039\": {}, \"LV-040\": {}, \"LV-041\": {},\n\t\"LV-042\": {}, \"LV-043\": {}, \"LV-044\": {}, \"LV-045\": {}, \"LV-046\": {},\n\t\"LV-047\": {}, \"LV-048\": {}, \"LV-049\": {}, \"LV-050\": {}, \"LV-051\": {},\n\t\"LV-052\": {}, \"LV-053\": {}, \"LV-054\": {}, \"LV-055\": {}, \"LV-056\": {},\n\t\"LV-057\": {}, \"LV-058\": {}, \"LV-059\": {}, \"LV-060\": {}, \"LV-061\": {},\n\t\"LV-062\": {}, \"LV-063\": {}, \"LV-064\": {}, \"LV-065\": {}, \"LV-066\": {},\n\t\"LV-067\": {}, \"LV-068\": {}, \"LV-069\": {}, \"LV-070\": {}, \"LV-071\": {},\n\t\"LV-072\": {}, \"LV-073\": {}, \"LV-074\": {}, \"LV-075\": {}, \"LV-076\": {},\n\t\"LV-077\": {}, \"LV-078\": {}, \"LV-079\": {}, \"LV-080\": {}, \"LV-081\": {},\n\t\"LV-082\": {}, \"LV-083\": {}, \"LV-084\": {}, \"LV-085\": {}, \"LV-086\": {},\n\t\"LV-087\": {}, \"LV-088\": {}, \"LV-089\": {}, \"LV-090\": {}, \"LV-091\": {},\n\t\"LV-092\": {}, \"LV-093\": {}, \"LV-094\": {}, \"LV-095\": {}, \"LV-096\": {},\n\t\"LV-097\": {}, \"LV-098\": {}, \"LV-099\": {}, \"LV-100\": {}, \"LV-101\": {},\n\t\"LV-102\": {}, \"LV-103\": {}, \"LV-104\": {}, \"LV-105\": {}, \"LV-106\": {},\n\t\"LV-107\": {}, \"LV-108\": {}, \"LV-109\": {}, \"LV-110\": {}, \"LV-DGV\": {},\n\t\"LV-JEL\": {}, \"LV-JKB\": {}, \"LV-JUR\": {}, \"LV-LPX\": {}, \"LV-REZ\": {},\n\t\"LV-RIX\": {}, \"LV-VEN\": {}, \"LV-VMR\": {}, \"LY-BA\": {}, \"LY-BU\": {},\n\t\"LY-DR\": {}, \"LY-GT\": {}, \"LY-JA\": {}, \"LY-JB\": {}, \"LY-JG\": {},\n\t\"LY-JI\": {}, \"LY-JU\": {}, \"LY-KF\": {}, \"LY-MB\": {}, \"LY-MI\": {},\n\t\"LY-MJ\": {}, \"LY-MQ\": {}, \"LY-NL\": {}, \"LY-NQ\": {}, \"LY-SB\": {},\n\t\"LY-SR\": {}, \"LY-TB\": {}, \"LY-WA\": {}, \"LY-WD\": {}, \"LY-WS\": {},\n\t\"LY-ZA\": {}, \"MA-01\": {}, \"MA-02\": {}, \"MA-03\": {}, \"MA-04\": {},\n\t\"MA-05\": {}, \"MA-06\": {}, \"MA-07\": {}, \"MA-08\": {}, \"MA-09\": {},\n\t\"MA-10\": {}, \"MA-11\": {}, \"MA-12\": {}, \"MA-13\": {}, \"MA-14\": {},\n\t\"MA-15\": {}, \"MA-16\": {}, \"MA-AGD\": {}, \"MA-AOU\": {}, \"MA-ASZ\": {},\n\t\"MA-AZI\": {}, \"MA-BEM\": {}, \"MA-BER\": {}, \"MA-BES\": {}, \"MA-BOD\": {},\n\t\"MA-BOM\": {}, \"MA-CAS\": {}, \"MA-CHE\": {}, \"MA-CHI\": {}, \"MA-CHT\": {},\n\t\"MA-ERR\": {}, \"MA-ESI\": {}, \"MA-ESM\": {}, \"MA-FAH\": {}, \"MA-FES\": {},\n\t\"MA-FIG\": {}, \"MA-GUE\": {}, \"MA-HAJ\": {}, \"MA-HAO\": {}, \"MA-HOC\": {},\n\t\"MA-IFR\": {}, \"MA-INE\": {}, \"MA-JDI\": {}, \"MA-JRA\": {}, \"MA-KEN\": {},\n\t\"MA-KES\": {}, \"MA-KHE\": {}, \"MA-KHN\": {}, \"MA-KHO\": {}, \"MA-LAA\": {},\n\t\"MA-LAR\": {}, \"MA-MED\": {}, \"MA-MEK\": {}, \"MA-MMD\": {}, \"MA-MMN\": {},\n\t\"MA-MOH\": {}, \"MA-MOU\": {}, \"MA-NAD\": {}, \"MA-NOU\": {}, \"MA-OUA\": {},\n\t\"MA-OUD\": {}, \"MA-OUJ\": {}, \"MA-RAB\": {}, \"MA-SAF\": {}, \"MA-SAL\": {},\n\t\"MA-SEF\": {}, \"MA-SET\": {}, \"MA-SIK\": {}, \"MA-SKH\": {}, \"MA-SYB\": {},\n\t\"MA-TAI\": {}, \"MA-TAO\": {}, \"MA-TAR\": {}, \"MA-TAT\": {}, \"MA-TAZ\": {},\n\t\"MA-TET\": {}, \"MA-TIZ\": {}, \"MA-TNG\": {}, \"MA-TNT\": {}, \"MA-ZAG\": {},\n\t\"MC-CL\": {}, \"MC-CO\": {}, \"MC-FO\": {}, \"MC-GA\": {}, \"MC-JE\": {},\n\t\"MC-LA\": {}, \"MC-MA\": {}, \"MC-MC\": {}, \"MC-MG\": {}, \"MC-MO\": {},\n\t\"MC-MU\": {}, \"MC-PH\": {}, \"MC-SD\": {}, \"MC-SO\": {}, \"MC-SP\": {},\n\t\"MC-SR\": {}, \"MC-VR\": {}, \"MD-AN\": {}, \"MD-BA\": {}, \"MD-BD\": {},\n\t\"MD-BR\": {}, \"MD-BS\": {}, \"MD-CA\": {}, \"MD-CL\": {}, \"MD-CM\": {},\n\t\"MD-CR\": {}, \"MD-CS\": {}, \"MD-CT\": {}, \"MD-CU\": {}, \"MD-DO\": {},\n\t\"MD-DR\": {}, \"MD-DU\": {}, \"MD-ED\": {}, \"MD-FA\": {}, \"MD-FL\": {},\n\t\"MD-GA\": {}, \"MD-GL\": {}, \"MD-HI\": {}, \"MD-IA\": {}, \"MD-LE\": {},\n\t\"MD-NI\": {}, \"MD-OC\": {}, \"MD-OR\": {}, \"MD-RE\": {}, \"MD-RI\": {},\n\t\"MD-SD\": {}, \"MD-SI\": {}, \"MD-SN\": {}, \"MD-SO\": {}, \"MD-ST\": {},\n\t\"MD-SV\": {}, \"MD-TA\": {}, \"MD-TE\": {}, \"MD-UN\": {}, \"ME-01\": {},\n\t\"ME-02\": {}, \"ME-03\": {}, \"ME-04\": {}, \"ME-05\": {}, \"ME-06\": {},\n\t\"ME-07\": {}, \"ME-08\": {}, \"ME-09\": {}, \"ME-10\": {}, \"ME-11\": {},\n\t\"ME-12\": {}, \"ME-13\": {}, \"ME-14\": {}, \"ME-15\": {}, \"ME-16\": {},\n\t\"ME-17\": {}, \"ME-18\": {}, \"ME-19\": {}, \"ME-20\": {}, \"ME-21\": {}, \"ME-22\": {}, \"ME-23\": {}, \"ME-24\": {}, \"ME-25\": {},\n\t\"MG-A\": {}, \"MG-D\": {}, \"MG-F\": {}, \"MG-M\": {}, \"MG-T\": {},\n\t\"MG-U\": {}, \"MH-ALK\": {}, \"MH-ALL\": {}, \"MH-ARN\": {}, \"MH-AUR\": {},\n\t\"MH-EBO\": {}, \"MH-ENI\": {}, \"MH-JAB\": {}, \"MH-JAL\": {}, \"MH-KIL\": {},\n\t\"MH-KWA\": {}, \"MH-L\": {}, \"MH-LAE\": {}, \"MH-LIB\": {}, \"MH-LIK\": {},\n\t\"MH-MAJ\": {}, \"MH-MAL\": {}, \"MH-MEJ\": {}, \"MH-MIL\": {}, \"MH-NMK\": {},\n\t\"MH-NMU\": {}, \"MH-RON\": {}, \"MH-T\": {}, \"MH-UJA\": {}, \"MH-UTI\": {},\n\t\"MH-WTJ\": {}, \"MH-WTN\": {}, \"MK-101\": {}, \"MK-102\": {}, \"MK-103\": {},\n\t\"MK-104\": {}, \"MK-105\": {},\n\t\"MK-106\": {}, \"MK-107\": {}, \"MK-108\": {}, \"MK-109\": {}, \"MK-201\": {},\n\t\"MK-202\": {}, \"MK-205\": {}, \"MK-206\": {}, \"MK-207\": {}, \"MK-208\": {},\n\t\"MK-209\": {}, \"MK-210\": {}, \"MK-211\": {}, \"MK-301\": {}, \"MK-303\": {},\n\t\"MK-307\": {}, \"MK-308\": {}, \"MK-310\": {}, \"MK-311\": {}, \"MK-312\": {},\n\t\"MK-401\": {}, \"MK-402\": {}, \"MK-403\": {}, \"MK-404\": {}, \"MK-405\": {},\n\t\"MK-406\": {}, \"MK-408\": {}, \"MK-409\": {}, \"MK-410\": {}, \"MK-501\": {},\n\t\"MK-502\": {}, \"MK-503\": {}, \"MK-505\": {}, \"MK-506\": {}, \"MK-507\": {},\n\t\"MK-508\": {}, \"MK-509\": {}, \"MK-601\": {}, \"MK-602\": {}, \"MK-604\": {},\n\t\"MK-605\": {}, \"MK-606\": {}, \"MK-607\": {}, \"MK-608\": {}, \"MK-609\": {},\n\t\"MK-701\": {}, \"MK-702\": {}, \"MK-703\": {}, \"MK-704\": {}, \"MK-705\": {},\n\t\"MK-803\": {}, \"MK-804\": {}, \"MK-806\": {}, \"MK-807\": {}, \"MK-809\": {},\n\t\"MK-810\": {}, \"MK-811\": {}, \"MK-812\": {}, \"MK-813\": {}, \"MK-814\": {},\n\t\"MK-816\": {}, \"ML-1\": {}, \"ML-2\": {}, \"ML-3\": {}, \"ML-4\": {},\n\t\"ML-5\": {}, \"ML-6\": {}, \"ML-7\": {}, \"ML-8\": {}, \"ML-BKO\": {},\n\t\"MM-01\": {}, \"MM-02\": {}, \"MM-03\": {}, \"MM-04\": {}, \"MM-05\": {},\n\t\"MM-06\": {}, \"MM-07\": {}, \"MM-11\": {}, \"MM-12\": {}, \"MM-13\": {},\n\t\"MM-14\": {}, \"MM-15\": {}, \"MM-16\": {}, \"MM-17\": {}, \"MM-18\": {}, \"MN-035\": {},\n\t\"MN-037\": {}, \"MN-039\": {}, \"MN-041\": {}, \"MN-043\": {}, \"MN-046\": {},\n\t\"MN-047\": {}, \"MN-049\": {}, \"MN-051\": {}, \"MN-053\": {}, \"MN-055\": {},\n\t\"MN-057\": {}, \"MN-059\": {}, \"MN-061\": {}, \"MN-063\": {}, \"MN-064\": {},\n\t\"MN-065\": {}, \"MN-067\": {}, \"MN-069\": {}, \"MN-071\": {}, \"MN-073\": {},\n\t\"MN-1\": {}, \"MR-01\": {}, \"MR-02\": {}, \"MR-03\": {}, \"MR-04\": {},\n\t\"MR-05\": {}, \"MR-06\": {}, \"MR-07\": {}, \"MR-08\": {}, \"MR-09\": {},\n\t\"MR-10\": {}, \"MR-11\": {}, \"MR-12\": {}, \"MR-13\": {}, \"MR-NKC\": {}, \"MT-01\": {},\n\t\"MT-02\": {}, \"MT-03\": {}, \"MT-04\": {}, \"MT-05\": {}, \"MT-06\": {},\n\t\"MT-07\": {}, \"MT-08\": {}, \"MT-09\": {}, \"MT-10\": {}, \"MT-11\": {},\n\t\"MT-12\": {}, \"MT-13\": {}, \"MT-14\": {}, \"MT-15\": {}, \"MT-16\": {},\n\t\"MT-17\": {}, \"MT-18\": {}, \"MT-19\": {}, \"MT-20\": {}, \"MT-21\": {},\n\t\"MT-22\": {}, \"MT-23\": {}, \"MT-24\": {}, \"MT-25\": {}, \"MT-26\": {},\n\t\"MT-27\": {}, \"MT-28\": {}, \"MT-29\": {}, \"MT-30\": {}, \"MT-31\": {},\n\t\"MT-32\": {}, \"MT-33\": {}, \"MT-34\": {}, \"MT-35\": {}, \"MT-36\": {},\n\t\"MT-37\": {}, \"MT-38\": {}, \"MT-39\": {}, \"MT-40\": {}, \"MT-41\": {},\n\t\"MT-42\": {}, \"MT-43\": {}, \"MT-44\": {}, \"MT-45\": {}, \"MT-46\": {},\n\t\"MT-47\": {}, \"MT-48\": {}, \"MT-49\": {}, \"MT-50\": {}, \"MT-51\": {},\n\t\"MT-52\": {}, \"MT-53\": {}, \"MT-54\": {}, \"MT-55\": {}, \"MT-56\": {},\n\t\"MT-57\": {}, \"MT-58\": {}, \"MT-59\": {}, \"MT-60\": {}, \"MT-61\": {},\n\t\"MT-62\": {}, \"MT-63\": {}, \"MT-64\": {}, \"MT-65\": {}, \"MT-66\": {},\n\t\"MT-67\": {}, \"MT-68\": {}, \"MU-AG\": {}, \"MU-BL\": {}, \"MU-BR\": {},\n\t\"MU-CC\": {}, \"MU-CU\": {}, \"MU-FL\": {}, \"MU-GP\": {}, \"MU-MO\": {},\n\t\"MU-PA\": {}, \"MU-PL\": {}, \"MU-PU\": {}, \"MU-PW\": {}, \"MU-QB\": {},\n\t\"MU-RO\": {}, \"MU-RP\": {}, \"MU-RR\": {}, \"MU-SA\": {}, \"MU-VP\": {}, \"MV-00\": {},\n\t\"MV-01\": {}, \"MV-02\": {}, \"MV-03\": {}, \"MV-04\": {}, \"MV-05\": {},\n\t\"MV-07\": {}, \"MV-08\": {}, \"MV-12\": {}, \"MV-13\": {}, \"MV-14\": {},\n\t\"MV-17\": {}, \"MV-20\": {}, \"MV-23\": {}, \"MV-24\": {}, \"MV-25\": {},\n\t\"MV-26\": {}, \"MV-27\": {}, \"MV-28\": {}, \"MV-29\": {}, \"MV-CE\": {},\n\t\"MV-MLE\": {}, \"MV-NC\": {}, \"MV-NO\": {}, \"MV-SC\": {}, \"MV-SU\": {},\n\t\"MV-UN\": {}, \"MV-US\": {}, \"MW-BA\": {}, \"MW-BL\": {}, \"MW-C\": {},\n\t\"MW-CK\": {}, \"MW-CR\": {}, \"MW-CT\": {}, \"MW-DE\": {}, \"MW-DO\": {},\n\t\"MW-KR\": {}, \"MW-KS\": {}, \"MW-LI\": {}, \"MW-LK\": {}, \"MW-MC\": {},\n\t\"MW-MG\": {}, \"MW-MH\": {}, \"MW-MU\": {}, \"MW-MW\": {}, \"MW-MZ\": {},\n\t\"MW-N\": {}, \"MW-NB\": {}, \"MW-NE\": {}, \"MW-NI\": {}, \"MW-NK\": {},\n\t\"MW-NS\": {}, \"MW-NU\": {}, \"MW-PH\": {}, \"MW-RU\": {}, \"MW-S\": {},\n\t\"MW-SA\": {}, \"MW-TH\": {}, \"MW-ZO\": {}, \"MX-AGU\": {}, \"MX-BCN\": {},\n\t\"MX-BCS\": {}, \"MX-CAM\": {}, \"MX-CHH\": {}, \"MX-CHP\": {}, \"MX-COA\": {},\n\t\"MX-COL\": {}, \"MX-CMX\": {}, \"MX-DIF\": {}, \"MX-DUR\": {}, \"MX-GRO\": {}, \"MX-GUA\": {},\n\t\"MX-HID\": {}, \"MX-JAL\": {}, \"MX-MEX\": {}, \"MX-MIC\": {}, \"MX-MOR\": {},\n\t\"MX-NAY\": {}, \"MX-NLE\": {}, \"MX-OAX\": {}, \"MX-PUE\": {}, \"MX-QUE\": {},\n\t\"MX-ROO\": {}, \"MX-SIN\": {}, \"MX-SLP\": {}, \"MX-SON\": {}, \"MX-TAB\": {},\n\t\"MX-TAM\": {}, \"MX-TLA\": {}, \"MX-VER\": {}, \"MX-YUC\": {}, \"MX-ZAC\": {},\n\t\"MY-01\": {}, \"MY-02\": {}, \"MY-03\": {}, \"MY-04\": {}, \"MY-05\": {},\n\t\"MY-06\": {}, \"MY-07\": {}, \"MY-08\": {}, \"MY-09\": {}, \"MY-10\": {},\n\t\"MY-11\": {}, \"MY-12\": {}, \"MY-13\": {}, \"MY-14\": {}, \"MY-15\": {},\n\t\"MY-16\": {}, \"MZ-A\": {}, \"MZ-B\": {}, \"MZ-G\": {}, \"MZ-I\": {},\n\t\"MZ-L\": {}, \"MZ-MPM\": {}, \"MZ-N\": {}, \"MZ-P\": {}, \"MZ-Q\": {},\n\t\"MZ-S\": {}, \"MZ-T\": {}, \"NA-CA\": {}, \"NA-ER\": {}, \"NA-HA\": {},\n\t\"NA-KA\": {}, \"NA-KE\": {}, \"NA-KH\": {}, \"NA-KU\": {}, \"NA-KW\": {}, \"NA-OD\": {}, \"NA-OH\": {},\n\t\"NA-OK\": {}, \"NA-ON\": {}, \"NA-OS\": {}, \"NA-OT\": {}, \"NA-OW\": {},\n\t\"NE-1\": {}, \"NE-2\": {}, \"NE-3\": {}, \"NE-4\": {}, \"NE-5\": {},\n\t\"NE-6\": {}, \"NE-7\": {}, \"NE-8\": {}, \"NG-AB\": {}, \"NG-AD\": {},\n\t\"NG-AK\": {}, \"NG-AN\": {}, \"NG-BA\": {}, \"NG-BE\": {}, \"NG-BO\": {},\n\t\"NG-BY\": {}, \"NG-CR\": {}, \"NG-DE\": {}, \"NG-EB\": {}, \"NG-ED\": {},\n\t\"NG-EK\": {}, \"NG-EN\": {}, \"NG-FC\": {}, \"NG-GO\": {}, \"NG-IM\": {},\n\t\"NG-JI\": {}, \"NG-KD\": {}, \"NG-KE\": {}, \"NG-KN\": {}, \"NG-KO\": {},\n\t\"NG-KT\": {}, \"NG-KW\": {}, \"NG-LA\": {}, \"NG-NA\": {}, \"NG-NI\": {},\n\t\"NG-OG\": {}, \"NG-ON\": {}, \"NG-OS\": {}, \"NG-OY\": {}, \"NG-PL\": {},\n\t\"NG-RI\": {}, \"NG-SO\": {}, \"NG-TA\": {}, \"NG-YO\": {}, \"NG-ZA\": {},\n\t\"NI-AN\": {}, \"NI-AS\": {}, \"NI-BO\": {}, \"NI-CA\": {}, \"NI-CI\": {},\n\t\"NI-CO\": {}, \"NI-ES\": {}, \"NI-GR\": {}, \"NI-JI\": {}, \"NI-LE\": {},\n\t\"NI-MD\": {}, \"NI-MN\": {}, \"NI-MS\": {}, \"NI-MT\": {}, \"NI-NS\": {},\n\t\"NI-RI\": {}, \"NI-SJ\": {}, \"NL-AW\": {}, \"NL-BQ1\": {}, \"NL-BQ2\": {},\n\t\"NL-BQ3\": {}, \"NL-CW\": {}, \"NL-DR\": {}, \"NL-FL\": {}, \"NL-FR\": {},\n\t\"NL-GE\": {}, \"NL-GR\": {}, \"NL-LI\": {}, \"NL-NB\": {}, \"NL-NH\": {},\n\t\"NL-OV\": {}, \"NL-SX\": {}, \"NL-UT\": {}, \"NL-ZE\": {}, \"NL-ZH\": {},\n\t\"NO-03\": {}, \"NO-11\": {}, \"NO-15\": {}, \"NO-16\": {}, \"NO-17\": {},\n\t\"NO-18\": {}, \"NO-21\": {}, \"NO-30\": {}, \"NO-34\": {}, \"NO-38\": {},\n\t\"NO-42\": {}, \"NO-46\": {}, \"NO-50\": {}, \"NO-54\": {},\n\t\"NO-22\": {}, \"NP-1\": {}, \"NP-2\": {}, \"NP-3\": {}, \"NP-4\": {},\n\t\"NP-5\": {}, \"NP-BA\": {}, \"NP-BH\": {}, \"NP-DH\": {}, \"NP-GA\": {},\n\t\"NP-JA\": {}, \"NP-KA\": {}, \"NP-KO\": {}, \"NP-LU\": {}, \"NP-MA\": {},\n\t\"NP-ME\": {}, \"NP-NA\": {}, \"NP-P1\": {}, \"NP-P2\": {}, \"NP-P3\": {}, \"NP-P4\": {}, \"NP-P5\": {}, \"NP-P6\": {}, \"NP-P7\": {}, \"NP-RA\": {}, \"NP-SA\": {}, \"NP-SE\": {},\n\t\"NR-01\": {}, \"NR-02\": {}, \"NR-03\": {}, \"NR-04\": {}, \"NR-05\": {},\n\t\"NR-06\": {}, \"NR-07\": {}, \"NR-08\": {}, \"NR-09\": {}, \"NR-10\": {},\n\t\"NR-11\": {}, \"NR-12\": {}, \"NR-13\": {}, \"NR-14\": {}, \"NZ-AUK\": {},\n\t\"NZ-BOP\": {}, \"NZ-CAN\": {}, \"NZ-CIT\": {}, \"NZ-GIS\": {}, \"NZ-HKB\": {},\n\t\"NZ-MBH\": {}, \"NZ-MWT\": {}, \"NZ-N\": {}, \"NZ-NSN\": {}, \"NZ-NTL\": {},\n\t\"NZ-OTA\": {}, \"NZ-S\": {}, \"NZ-STL\": {}, \"NZ-TAS\": {}, \"NZ-TKI\": {},\n\t\"NZ-WGN\": {}, \"NZ-WKO\": {}, \"NZ-WTC\": {}, \"OM-BA\": {}, \"OM-BS\": {}, \"OM-BU\": {}, \"OM-BJ\": {},\n\t\"OM-DA\": {}, \"OM-MA\": {}, \"OM-MU\": {}, \"OM-SH\": {}, \"OM-SJ\": {}, \"OM-SS\": {}, \"OM-WU\": {},\n\t\"OM-ZA\": {}, \"OM-ZU\": {}, \"PA-1\": {}, \"PA-2\": {}, \"PA-3\": {},\n\t\"PA-4\": {}, \"PA-5\": {}, \"PA-6\": {}, \"PA-7\": {}, \"PA-8\": {},\n\t\"PA-9\": {}, \"PA-EM\": {}, \"PA-KY\": {}, \"PA-NB\": {}, \"PE-AMA\": {},\n\t\"PE-ANC\": {}, \"PE-APU\": {}, \"PE-ARE\": {}, \"PE-AYA\": {}, \"PE-CAJ\": {},\n\t\"PE-CAL\": {}, \"PE-CUS\": {}, \"PE-HUC\": {}, \"PE-HUV\": {}, \"PE-ICA\": {},\n\t\"PE-JUN\": {}, \"PE-LAL\": {}, \"PE-LAM\": {}, \"PE-LIM\": {}, \"PE-LMA\": {},\n\t\"PE-LOR\": {}, \"PE-MDD\": {}, \"PE-MOQ\": {}, \"PE-PAS\": {}, \"PE-PIU\": {},\n\t\"PE-PUN\": {}, \"PE-SAM\": {}, \"PE-TAC\": {}, \"PE-TUM\": {}, \"PE-UCA\": {},\n\t\"PG-CPK\": {}, \"PG-CPM\": {}, \"PG-EBR\": {}, \"PG-EHG\": {}, \"PG-EPW\": {},\n\t\"PG-ESW\": {}, \"PG-GPK\": {}, \"PG-MBA\": {}, \"PG-MPL\": {}, \"PG-MPM\": {},\n\t\"PG-MRL\": {}, \"PG-NCD\": {}, \"PG-NIK\": {}, \"PG-NPP\": {}, \"PG-NSB\": {},\n\t\"PG-SAN\": {}, \"PG-SHM\": {}, \"PG-WBK\": {}, \"PG-WHM\": {}, \"PG-WPD\": {},\n\t\"PH-00\": {}, \"PH-01\": {}, \"PH-02\": {}, \"PH-03\": {}, \"PH-05\": {},\n\t\"PH-06\": {}, \"PH-07\": {}, \"PH-08\": {}, \"PH-09\": {}, \"PH-10\": {},\n\t\"PH-11\": {}, \"PH-12\": {}, \"PH-13\": {}, \"PH-14\": {}, \"PH-15\": {},\n\t\"PH-40\": {}, \"PH-41\": {}, \"PH-ABR\": {}, \"PH-AGN\": {}, \"PH-AGS\": {},\n\t\"PH-AKL\": {}, \"PH-ALB\": {}, \"PH-ANT\": {}, \"PH-APA\": {}, \"PH-AUR\": {},\n\t\"PH-BAN\": {}, \"PH-BAS\": {}, \"PH-BEN\": {}, \"PH-BIL\": {}, \"PH-BOH\": {},\n\t\"PH-BTG\": {}, \"PH-BTN\": {}, \"PH-BUK\": {}, \"PH-BUL\": {}, \"PH-CAG\": {},\n\t\"PH-CAM\": {}, \"PH-CAN\": {}, \"PH-CAP\": {}, \"PH-CAS\": {}, \"PH-CAT\": {},\n\t\"PH-CAV\": {}, \"PH-CEB\": {}, \"PH-COM\": {}, \"PH-DAO\": {}, \"PH-DAS\": {},\n\t\"PH-DAV\": {}, \"PH-DIN\": {}, \"PH-EAS\": {}, \"PH-GUI\": {}, \"PH-IFU\": {},\n\t\"PH-ILI\": {}, \"PH-ILN\": {}, \"PH-ILS\": {}, \"PH-ISA\": {}, \"PH-KAL\": {},\n\t\"PH-LAG\": {}, \"PH-LAN\": {}, \"PH-LAS\": {}, \"PH-LEY\": {}, \"PH-LUN\": {},\n\t\"PH-MAD\": {}, \"PH-MAG\": {}, \"PH-MAS\": {}, \"PH-MDC\": {}, \"PH-MDR\": {},\n\t\"PH-MOU\": {}, \"PH-MSC\": {}, \"PH-MSR\": {}, \"PH-NCO\": {}, \"PH-NEC\": {},\n\t\"PH-NER\": {}, \"PH-NSA\": {}, \"PH-NUE\": {}, \"PH-NUV\": {}, \"PH-PAM\": {},\n\t\"PH-PAN\": {}, \"PH-PLW\": {}, \"PH-QUE\": {}, \"PH-QUI\": {}, \"PH-RIZ\": {},\n\t\"PH-ROM\": {}, \"PH-SAR\": {}, \"PH-SCO\": {}, \"PH-SIG\": {}, \"PH-SLE\": {},\n\t\"PH-SLU\": {}, \"PH-SOR\": {}, \"PH-SUK\": {}, \"PH-SUN\": {}, \"PH-SUR\": {},\n\t\"PH-TAR\": {}, \"PH-TAW\": {}, \"PH-WSA\": {}, \"PH-ZAN\": {}, \"PH-ZAS\": {},\n\t\"PH-ZMB\": {}, \"PH-ZSI\": {}, \"PK-BA\": {}, \"PK-GB\": {}, \"PK-IS\": {},\n\t\"PK-JK\": {}, \"PK-KP\": {}, \"PK-PB\": {}, \"PK-SD\": {}, \"PK-TA\": {},\n\t\"PL-02\": {}, \"PL-04\": {}, \"PL-06\": {}, \"PL-08\": {}, \"PL-10\": {},\n\t\"PL-12\": {}, \"PL-14\": {}, \"PL-16\": {}, \"PL-18\": {}, \"PL-20\": {},\n\t\"PL-22\": {}, \"PL-24\": {}, \"PL-26\": {}, \"PL-28\": {}, \"PL-30\": {}, \"PL-32\": {},\n\t\"PS-BTH\": {}, \"PS-DEB\": {}, \"PS-GZA\": {}, \"PS-HBN\": {},\n\t\"PS-JEM\": {}, \"PS-JEN\": {}, \"PS-JRH\": {}, \"PS-KYS\": {}, \"PS-NBS\": {},\n\t\"PS-NGZ\": {}, \"PS-QQA\": {}, \"PS-RBH\": {}, \"PS-RFH\": {}, \"PS-SLT\": {},\n\t\"PS-TBS\": {}, \"PS-TKM\": {}, \"PT-01\": {}, \"PT-02\": {}, \"PT-03\": {},\n\t\"PT-04\": {}, \"PT-05\": {}, \"PT-06\": {}, \"PT-07\": {}, \"PT-08\": {},\n\t\"PT-09\": {}, \"PT-10\": {}, \"PT-11\": {}, \"PT-12\": {}, \"PT-13\": {},\n\t\"PT-14\": {}, \"PT-15\": {}, \"PT-16\": {}, \"PT-17\": {}, \"PT-18\": {},\n\t\"PT-20\": {}, \"PT-30\": {}, \"PW-002\": {}, \"PW-004\": {}, \"PW-010\": {},\n\t\"PW-050\": {}, \"PW-100\": {}, \"PW-150\": {}, \"PW-212\": {}, \"PW-214\": {},\n\t\"PW-218\": {}, \"PW-222\": {}, \"PW-224\": {}, \"PW-226\": {}, \"PW-227\": {},\n\t\"PW-228\": {}, \"PW-350\": {}, \"PW-370\": {}, \"PY-1\": {}, \"PY-10\": {},\n\t\"PY-11\": {}, \"PY-12\": {}, \"PY-13\": {}, \"PY-14\": {}, \"PY-15\": {},\n\t\"PY-16\": {}, \"PY-19\": {}, \"PY-2\": {}, \"PY-3\": {}, \"PY-4\": {},\n\t\"PY-5\": {}, \"PY-6\": {}, \"PY-7\": {}, \"PY-8\": {}, \"PY-9\": {},\n\t\"PY-ASU\": {}, \"QA-DA\": {}, \"QA-KH\": {}, \"QA-MS\": {}, \"QA-RA\": {},\n\t\"QA-US\": {}, \"QA-WA\": {}, \"QA-ZA\": {}, \"RO-AB\": {}, \"RO-AG\": {},\n\t\"RO-AR\": {}, \"RO-B\": {}, \"RO-BC\": {}, \"RO-BH\": {}, \"RO-BN\": {},\n\t\"RO-BR\": {}, \"RO-BT\": {}, \"RO-BV\": {}, \"RO-BZ\": {}, \"RO-CJ\": {},\n\t\"RO-CL\": {}, \"RO-CS\": {}, \"RO-CT\": {}, \"RO-CV\": {}, \"RO-DB\": {},\n\t\"RO-DJ\": {}, \"RO-GJ\": {}, \"RO-GL\": {}, \"RO-GR\": {}, \"RO-HD\": {},\n\t\"RO-HR\": {}, \"RO-IF\": {}, \"RO-IL\": {}, \"RO-IS\": {}, \"RO-MH\": {},\n\t\"RO-MM\": {}, \"RO-MS\": {}, \"RO-NT\": {}, \"RO-OT\": {}, \"RO-PH\": {},\n\t\"RO-SB\": {}, \"RO-SJ\": {}, \"RO-SM\": {}, \"RO-SV\": {}, \"RO-TL\": {},\n\t\"RO-TM\": {}, \"RO-TR\": {}, \"RO-VL\": {}, \"RO-VN\": {}, \"RO-VS\": {},\n\t\"RS-00\": {}, \"RS-01\": {}, \"RS-02\": {}, \"RS-03\": {}, \"RS-04\": {},\n\t\"RS-05\": {}, \"RS-06\": {}, \"RS-07\": {}, \"RS-08\": {}, \"RS-09\": {},\n\t\"RS-10\": {}, \"RS-11\": {}, \"RS-12\": {}, \"RS-13\": {}, \"RS-14\": {},\n\t\"RS-15\": {}, \"RS-16\": {}, \"RS-17\": {}, \"RS-18\": {}, \"RS-19\": {},\n\t\"RS-20\": {}, \"RS-21\": {}, \"RS-22\": {}, \"RS-23\": {}, \"RS-24\": {},\n\t\"RS-25\": {}, \"RS-26\": {}, \"RS-27\": {}, \"RS-28\": {}, \"RS-29\": {},\n\t\"RS-KM\": {}, \"RS-VO\": {}, \"RU-AD\": {}, \"RU-AL\": {}, \"RU-ALT\": {},\n\t\"RU-AMU\": {}, \"RU-ARK\": {}, \"RU-AST\": {}, \"RU-BA\": {}, \"RU-BEL\": {},\n\t\"RU-BRY\": {}, \"RU-BU\": {}, \"RU-CE\": {}, \"RU-CHE\": {}, \"RU-CHU\": {},\n\t\"RU-CU\": {}, \"RU-DA\": {}, \"RU-IN\": {}, \"RU-IRK\": {}, \"RU-IVA\": {},\n\t\"RU-KAM\": {}, \"RU-KB\": {}, \"RU-KC\": {}, \"RU-KDA\": {}, \"RU-KEM\": {},\n\t\"RU-KGD\": {}, \"RU-KGN\": {}, \"RU-KHA\": {}, \"RU-KHM\": {}, \"RU-KIR\": {},\n\t\"RU-KK\": {}, \"RU-KL\": {}, \"RU-KLU\": {}, \"RU-KO\": {}, \"RU-KOS\": {},\n\t\"RU-KR\": {}, \"RU-KRS\": {}, \"RU-KYA\": {}, \"RU-LEN\": {}, \"RU-LIP\": {},\n\t\"RU-MAG\": {}, \"RU-ME\": {}, \"RU-MO\": {}, \"RU-MOS\": {}, \"RU-MOW\": {},\n\t\"RU-MUR\": {}, \"RU-NEN\": {}, \"RU-NGR\": {}, \"RU-NIZ\": {}, \"RU-NVS\": {},\n\t\"RU-OMS\": {}, \"RU-ORE\": {}, \"RU-ORL\": {}, \"RU-PER\": {}, \"RU-PNZ\": {},\n\t\"RU-PRI\": {}, \"RU-PSK\": {}, \"RU-ROS\": {}, \"RU-RYA\": {}, \"RU-SA\": {},\n\t\"RU-SAK\": {}, \"RU-SAM\": {}, \"RU-SAR\": {}, \"RU-SE\": {}, \"RU-SMO\": {},\n\t\"RU-SPE\": {}, \"RU-STA\": {}, \"RU-SVE\": {}, \"RU-TA\": {}, \"RU-TAM\": {},\n\t\"RU-TOM\": {}, \"RU-TUL\": {}, \"RU-TVE\": {}, \"RU-TY\": {}, \"RU-TYU\": {},\n\t\"RU-UD\": {}, \"RU-ULY\": {}, \"RU-VGG\": {}, \"RU-VLA\": {}, \"RU-VLG\": {},\n\t\"RU-VOR\": {}, \"RU-YAN\": {}, \"RU-YAR\": {}, \"RU-YEV\": {}, \"RU-ZAB\": {},\n\t\"RW-01\": {}, \"RW-02\": {}, \"RW-03\": {}, \"RW-04\": {}, \"RW-05\": {},\n\t\"SA-01\": {}, \"SA-02\": {}, \"SA-03\": {}, \"SA-04\": {}, \"SA-05\": {},\n\t\"SA-06\": {}, \"SA-07\": {}, \"SA-08\": {}, \"SA-09\": {}, \"SA-10\": {},\n\t\"SA-11\": {}, \"SA-12\": {}, \"SA-14\": {}, \"SB-CE\": {}, \"SB-CH\": {},\n\t\"SB-CT\": {}, \"SB-GU\": {}, \"SB-IS\": {}, \"SB-MK\": {}, \"SB-ML\": {},\n\t\"SB-RB\": {}, \"SB-TE\": {}, \"SB-WE\": {}, \"SC-01\": {}, \"SC-02\": {},\n\t\"SC-03\": {}, \"SC-04\": {}, \"SC-05\": {}, \"SC-06\": {}, \"SC-07\": {},\n\t\"SC-08\": {}, \"SC-09\": {}, \"SC-10\": {}, \"SC-11\": {}, \"SC-12\": {},\n\t\"SC-13\": {}, \"SC-14\": {}, \"SC-15\": {}, \"SC-16\": {}, \"SC-17\": {},\n\t\"SC-18\": {}, \"SC-19\": {}, \"SC-20\": {}, \"SC-21\": {}, \"SC-22\": {},\n\t\"SC-23\": {}, \"SC-24\": {}, \"SC-25\": {}, \"SD-DC\": {}, \"SD-DE\": {},\n\t\"SD-DN\": {}, \"SD-DS\": {}, \"SD-DW\": {}, \"SD-GD\": {}, \"SD-GK\": {}, \"SD-GZ\": {},\n\t\"SD-KA\": {}, \"SD-KH\": {}, \"SD-KN\": {}, \"SD-KS\": {}, \"SD-NB\": {},\n\t\"SD-NO\": {}, \"SD-NR\": {}, \"SD-NW\": {}, \"SD-RS\": {}, \"SD-SI\": {},\n\t\"SE-AB\": {}, \"SE-AC\": {}, \"SE-BD\": {}, \"SE-C\": {}, \"SE-D\": {},\n\t\"SE-E\": {}, \"SE-F\": {}, \"SE-G\": {}, \"SE-H\": {}, \"SE-I\": {},\n\t\"SE-K\": {}, \"SE-M\": {}, \"SE-N\": {}, \"SE-O\": {}, \"SE-S\": {},\n\t\"SE-T\": {}, \"SE-U\": {}, \"SE-W\": {}, \"SE-X\": {}, \"SE-Y\": {},\n\t\"SE-Z\": {}, \"SG-01\": {}, \"SG-02\": {}, \"SG-03\": {}, \"SG-04\": {},\n\t\"SG-05\": {}, \"SH-AC\": {}, \"SH-HL\": {}, \"SH-TA\": {}, \"SI-001\": {},\n\t\"SI-002\": {}, \"SI-003\": {}, \"SI-004\": {}, \"SI-005\": {}, \"SI-006\": {},\n\t\"SI-007\": {}, \"SI-008\": {}, \"SI-009\": {}, \"SI-010\": {}, \"SI-011\": {},\n\t\"SI-012\": {}, \"SI-013\": {}, \"SI-014\": {}, \"SI-015\": {}, \"SI-016\": {},\n\t\"SI-017\": {}, \"SI-018\": {}, \"SI-019\": {}, \"SI-020\": {}, \"SI-021\": {},\n\t\"SI-022\": {}, \"SI-023\": {}, \"SI-024\": {}, \"SI-025\": {}, \"SI-026\": {},\n\t\"SI-027\": {}, \"SI-028\": {}, \"SI-029\": {}, \"SI-030\": {}, \"SI-031\": {},\n\t\"SI-032\": {}, \"SI-033\": {}, \"SI-034\": {}, \"SI-035\": {}, \"SI-036\": {},\n\t\"SI-037\": {}, \"SI-038\": {}, \"SI-039\": {}, \"SI-040\": {}, \"SI-041\": {},\n\t\"SI-042\": {}, \"SI-043\": {}, \"SI-044\": {}, \"SI-045\": {}, \"SI-046\": {},\n\t\"SI-047\": {}, \"SI-048\": {}, \"SI-049\": {}, \"SI-050\": {}, \"SI-051\": {},\n\t\"SI-052\": {}, \"SI-053\": {}, \"SI-054\": {}, \"SI-055\": {}, \"SI-056\": {},\n\t\"SI-057\": {}, \"SI-058\": {}, \"SI-059\": {}, \"SI-060\": {}, \"SI-061\": {},\n\t\"SI-062\": {}, \"SI-063\": {}, \"SI-064\": {}, \"SI-065\": {}, \"SI-066\": {},\n\t\"SI-067\": {}, \"SI-068\": {}, \"SI-069\": {}, \"SI-070\": {}, \"SI-071\": {},\n\t\"SI-072\": {}, \"SI-073\": {}, \"SI-074\": {}, \"SI-075\": {}, \"SI-076\": {},\n\t\"SI-077\": {}, \"SI-078\": {}, \"SI-079\": {}, \"SI-080\": {}, \"SI-081\": {},\n\t\"SI-082\": {}, \"SI-083\": {}, \"SI-084\": {}, \"SI-085\": {}, \"SI-086\": {},\n\t\"SI-087\": {}, \"SI-088\": {}, \"SI-089\": {}, \"SI-090\": {}, \"SI-091\": {},\n\t\"SI-092\": {}, \"SI-093\": {}, \"SI-094\": {}, \"SI-095\": {}, \"SI-096\": {},\n\t\"SI-097\": {}, \"SI-098\": {}, \"SI-099\": {}, \"SI-100\": {}, \"SI-101\": {},\n\t\"SI-102\": {}, \"SI-103\": {}, \"SI-104\": {}, \"SI-105\": {}, \"SI-106\": {},\n\t\"SI-107\": {}, \"SI-108\": {}, \"SI-109\": {}, \"SI-110\": {}, \"SI-111\": {},\n\t\"SI-112\": {}, \"SI-113\": {}, \"SI-114\": {}, \"SI-115\": {}, \"SI-116\": {},\n\t\"SI-117\": {}, \"SI-118\": {}, \"SI-119\": {}, \"SI-120\": {}, \"SI-121\": {},\n\t\"SI-122\": {}, \"SI-123\": {}, \"SI-124\": {}, \"SI-125\": {}, \"SI-126\": {},\n\t\"SI-127\": {}, \"SI-128\": {}, \"SI-129\": {}, \"SI-130\": {}, \"SI-131\": {},\n\t\"SI-132\": {}, \"SI-133\": {}, \"SI-134\": {}, \"SI-135\": {}, \"SI-136\": {},\n\t\"SI-137\": {}, \"SI-138\": {}, \"SI-139\": {}, \"SI-140\": {}, \"SI-141\": {},\n\t\"SI-142\": {}, \"SI-143\": {}, \"SI-144\": {}, \"SI-146\": {}, \"SI-147\": {},\n\t\"SI-148\": {}, \"SI-149\": {}, \"SI-150\": {}, \"SI-151\": {}, \"SI-152\": {},\n\t\"SI-153\": {}, \"SI-154\": {}, \"SI-155\": {}, \"SI-156\": {}, \"SI-157\": {},\n\t\"SI-158\": {}, \"SI-159\": {}, \"SI-160\": {}, \"SI-161\": {}, \"SI-162\": {},\n\t\"SI-163\": {}, \"SI-164\": {}, \"SI-165\": {}, \"SI-166\": {}, \"SI-167\": {},\n\t\"SI-168\": {}, \"SI-169\": {}, \"SI-170\": {}, \"SI-171\": {}, \"SI-172\": {},\n\t\"SI-173\": {}, \"SI-174\": {}, \"SI-175\": {}, \"SI-176\": {}, \"SI-177\": {},\n\t\"SI-178\": {}, \"SI-179\": {}, \"SI-180\": {}, \"SI-181\": {}, \"SI-182\": {},\n\t\"SI-183\": {}, \"SI-184\": {}, \"SI-185\": {}, \"SI-186\": {}, \"SI-187\": {},\n\t\"SI-188\": {}, \"SI-189\": {}, \"SI-190\": {}, \"SI-191\": {}, \"SI-192\": {},\n\t\"SI-193\": {}, \"SI-194\": {}, \"SI-195\": {}, \"SI-196\": {}, \"SI-197\": {},\n\t\"SI-198\": {}, \"SI-199\": {}, \"SI-200\": {}, \"SI-201\": {}, \"SI-202\": {},\n\t\"SI-203\": {}, \"SI-204\": {}, \"SI-205\": {}, \"SI-206\": {}, \"SI-207\": {},\n\t\"SI-208\": {}, \"SI-209\": {}, \"SI-210\": {}, \"SI-211\": {}, \"SI-212\": {}, \"SI-213\": {}, \"SK-BC\": {},\n\t\"SK-BL\": {}, \"SK-KI\": {}, \"SK-NI\": {}, \"SK-PV\": {}, \"SK-TA\": {},\n\t\"SK-TC\": {}, \"SK-ZI\": {}, \"SL-E\": {}, \"SL-N\": {}, \"SL-S\": {},\n\t\"SL-W\": {}, \"SM-01\": {}, \"SM-02\": {}, \"SM-03\": {}, \"SM-04\": {},\n\t\"SM-05\": {}, \"SM-06\": {}, \"SM-07\": {}, \"SM-08\": {}, \"SM-09\": {},\n\t\"SN-DB\": {}, \"SN-DK\": {}, \"SN-FK\": {}, \"SN-KA\": {}, \"SN-KD\": {},\n\t\"SN-KE\": {}, \"SN-KL\": {}, \"SN-LG\": {}, \"SN-MT\": {}, \"SN-SE\": {},\n\t\"SN-SL\": {}, \"SN-TC\": {}, \"SN-TH\": {}, \"SN-ZG\": {}, \"SO-AW\": {},\n\t\"SO-BK\": {}, \"SO-BN\": {}, \"SO-BR\": {}, \"SO-BY\": {}, \"SO-GA\": {},\n\t\"SO-GE\": {}, \"SO-HI\": {}, \"SO-JD\": {}, \"SO-JH\": {}, \"SO-MU\": {},\n\t\"SO-NU\": {}, \"SO-SA\": {}, \"SO-SD\": {}, \"SO-SH\": {}, \"SO-SO\": {},\n\t\"SO-TO\": {}, \"SO-WO\": {}, \"SR-BR\": {}, \"SR-CM\": {}, \"SR-CR\": {},\n\t\"SR-MA\": {}, \"SR-NI\": {}, \"SR-PM\": {}, \"SR-PR\": {}, \"SR-SA\": {},\n\t\"SR-SI\": {}, \"SR-WA\": {}, \"SS-BN\": {}, \"SS-BW\": {}, \"SS-EC\": {},\n\t\"SS-EE8\": {}, \"SS-EE\": {}, \"SS-EW\": {}, \"SS-JG\": {}, \"SS-LK\": {}, \"SS-NU\": {},\n\t\"SS-UY\": {}, \"SS-WR\": {}, \"ST-01\": {}, \"ST-P\": {}, \"ST-S\": {}, \"SV-AH\": {},\n\t\"SV-CA\": {}, \"SV-CH\": {}, \"SV-CU\": {}, \"SV-LI\": {}, \"SV-MO\": {},\n\t\"SV-PA\": {}, \"SV-SA\": {}, \"SV-SM\": {}, \"SV-SO\": {}, \"SV-SS\": {},\n\t\"SV-SV\": {}, \"SV-UN\": {}, \"SV-US\": {}, \"SY-DI\": {}, \"SY-DR\": {},\n\t\"SY-DY\": {}, \"SY-HA\": {}, \"SY-HI\": {}, \"SY-HL\": {}, \"SY-HM\": {},\n\t\"SY-ID\": {}, \"SY-LA\": {}, \"SY-QU\": {}, \"SY-RA\": {}, \"SY-RD\": {},\n\t\"SY-SU\": {}, \"SY-TA\": {}, \"SZ-HH\": {}, \"SZ-LU\": {}, \"SZ-MA\": {},\n\t\"SZ-SH\": {}, \"TD-BA\": {}, \"TD-BG\": {}, \"TD-BO\": {}, \"TD-CB\": {},\n\t\"TD-EN\": {}, \"TD-GR\": {}, \"TD-HL\": {}, \"TD-KA\": {}, \"TD-LC\": {},\n\t\"TD-LO\": {}, \"TD-LR\": {}, \"TD-MA\": {}, \"TD-MC\": {}, \"TD-ME\": {},\n\t\"TD-MO\": {}, \"TD-ND\": {}, \"TD-OD\": {}, \"TD-SA\": {}, \"TD-SI\": {},\n\t\"TD-TA\": {}, \"TD-TI\": {}, \"TD-WF\": {}, \"TG-C\": {}, \"TG-K\": {},\n\t\"TG-M\": {}, \"TG-P\": {}, \"TG-S\": {}, \"TH-10\": {}, \"TH-11\": {},\n\t\"TH-12\": {}, \"TH-13\": {}, \"TH-14\": {}, \"TH-15\": {}, \"TH-16\": {},\n\t\"TH-17\": {}, \"TH-18\": {}, \"TH-19\": {}, \"TH-20\": {}, \"TH-21\": {},\n\t\"TH-22\": {}, \"TH-23\": {}, \"TH-24\": {}, \"TH-25\": {}, \"TH-26\": {},\n\t\"TH-27\": {}, \"TH-30\": {}, \"TH-31\": {}, \"TH-32\": {}, \"TH-33\": {},\n\t\"TH-34\": {}, \"TH-35\": {}, \"TH-36\": {}, \"TH-37\": {}, \"TH-38\": {}, \"TH-39\": {},\n\t\"TH-40\": {}, \"TH-41\": {}, \"TH-42\": {}, \"TH-43\": {}, \"TH-44\": {},\n\t\"TH-45\": {}, \"TH-46\": {}, \"TH-47\": {}, \"TH-48\": {}, \"TH-49\": {},\n\t\"TH-50\": {}, \"TH-51\": {}, \"TH-52\": {}, \"TH-53\": {}, \"TH-54\": {},\n\t\"TH-55\": {}, \"TH-56\": {}, \"TH-57\": {}, \"TH-58\": {}, \"TH-60\": {},\n\t\"TH-61\": {}, \"TH-62\": {}, \"TH-63\": {}, \"TH-64\": {}, \"TH-65\": {},\n\t\"TH-66\": {}, \"TH-67\": {}, \"TH-70\": {}, \"TH-71\": {}, \"TH-72\": {},\n\t\"TH-73\": {}, \"TH-74\": {}, \"TH-75\": {}, \"TH-76\": {}, \"TH-77\": {},\n\t\"TH-80\": {}, \"TH-81\": {}, \"TH-82\": {}, \"TH-83\": {}, \"TH-84\": {},\n\t\"TH-85\": {}, \"TH-86\": {}, \"TH-90\": {}, \"TH-91\": {}, \"TH-92\": {},\n\t\"TH-93\": {}, \"TH-94\": {}, \"TH-95\": {}, \"TH-96\": {}, \"TH-S\": {},\n\t\"TJ-GB\": {}, \"TJ-KT\": {}, \"TJ-SU\": {}, \"TJ-DU\": {}, \"TJ-RA\": {}, \"TL-AL\": {}, \"TL-AN\": {},\n\t\"TL-BA\": {}, \"TL-BO\": {}, \"TL-CO\": {}, \"TL-DI\": {}, \"TL-ER\": {},\n\t\"TL-LA\": {}, \"TL-LI\": {}, \"TL-MF\": {}, \"TL-MT\": {}, \"TL-OE\": {},\n\t\"TL-VI\": {}, \"TM-A\": {}, \"TM-B\": {}, \"TM-D\": {}, \"TM-L\": {},\n\t\"TM-M\": {}, \"TM-S\": {}, \"TN-11\": {}, \"TN-12\": {}, \"TN-13\": {},\n\t\"TN-14\": {}, \"TN-21\": {}, \"TN-22\": {}, \"TN-23\": {}, \"TN-31\": {},\n\t\"TN-32\": {}, \"TN-33\": {}, \"TN-34\": {}, \"TN-41\": {}, \"TN-42\": {},\n\t\"TN-43\": {}, \"TN-51\": {}, \"TN-52\": {}, \"TN-53\": {}, \"TN-61\": {},\n\t\"TN-71\": {}, \"TN-72\": {}, \"TN-73\": {}, \"TN-81\": {}, \"TN-82\": {},\n\t\"TN-83\": {}, \"TO-01\": {}, \"TO-02\": {}, \"TO-03\": {}, \"TO-04\": {},\n\t\"TO-05\": {}, \"TR-01\": {}, \"TR-02\": {}, \"TR-03\": {}, \"TR-04\": {},\n\t\"TR-05\": {}, \"TR-06\": {}, \"TR-07\": {}, \"TR-08\": {}, \"TR-09\": {},\n\t\"TR-10\": {}, \"TR-11\": {}, \"TR-12\": {}, \"TR-13\": {}, \"TR-14\": {},\n\t\"TR-15\": {}, \"TR-16\": {}, \"TR-17\": {}, \"TR-18\": {}, \"TR-19\": {},\n\t\"TR-20\": {}, \"TR-21\": {}, \"TR-22\": {}, \"TR-23\": {}, \"TR-24\": {},\n\t\"TR-25\": {}, \"TR-26\": {}, \"TR-27\": {}, \"TR-28\": {}, \"TR-29\": {},\n\t\"TR-30\": {}, \"TR-31\": {}, \"TR-32\": {}, \"TR-33\": {}, \"TR-34\": {},\n\t\"TR-35\": {}, \"TR-36\": {}, \"TR-37\": {}, \"TR-38\": {}, \"TR-39\": {},\n\t\"TR-40\": {}, \"TR-41\": {}, \"TR-42\": {}, \"TR-43\": {}, \"TR-44\": {},\n\t\"TR-45\": {}, \"TR-46\": {}, \"TR-47\": {}, \"TR-48\": {}, \"TR-49\": {},\n\t\"TR-50\": {}, \"TR-51\": {}, \"TR-52\": {}, \"TR-53\": {}, \"TR-54\": {},\n\t\"TR-55\": {}, \"TR-56\": {}, \"TR-57\": {}, \"TR-58\": {}, \"TR-59\": {},\n\t\"TR-60\": {}, \"TR-61\": {}, \"TR-62\": {}, \"TR-63\": {}, \"TR-64\": {},\n\t\"TR-65\": {}, \"TR-66\": {}, \"TR-67\": {}, \"TR-68\": {}, \"TR-69\": {},\n\t\"TR-70\": {}, \"TR-71\": {}, \"TR-72\": {}, \"TR-73\": {}, \"TR-74\": {},\n\t\"TR-75\": {}, \"TR-76\": {}, \"TR-77\": {}, \"TR-78\": {}, \"TR-79\": {},\n\t\"TR-80\": {}, \"TR-81\": {}, \"TT-ARI\": {}, \"TT-CHA\": {}, \"TT-CTT\": {},\n\t\"TT-DMN\": {}, \"TT-ETO\": {}, \"TT-MRC\": {}, \"TT-TOB\": {}, \"TT-PED\": {}, \"TT-POS\": {}, \"TT-PRT\": {},\n\t\"TT-PTF\": {}, \"TT-RCM\": {}, \"TT-SFO\": {}, \"TT-SGE\": {}, \"TT-SIP\": {},\n\t\"TT-SJL\": {}, \"TT-TUP\": {}, \"TT-WTO\": {}, \"TV-FUN\": {}, \"TV-NIT\": {},\n\t\"TV-NKF\": {}, \"TV-NKL\": {}, \"TV-NMA\": {}, \"TV-NMG\": {}, \"TV-NUI\": {},\n\t\"TV-VAI\": {}, \"TW-CHA\": {}, \"TW-CYI\": {}, \"TW-CYQ\": {}, \"TW-KIN\": {}, \"TW-HSQ\": {},\n\t\"TW-HSZ\": {}, \"TW-HUA\": {}, \"TW-LIE\": {}, \"TW-ILA\": {}, \"TW-KEE\": {}, \"TW-KHH\": {},\n\t\"TW-KHQ\": {}, \"TW-MIA\": {}, \"TW-NAN\": {}, \"TW-NWT\": {}, \"TW-PEN\": {}, \"TW-PIF\": {},\n\t\"TW-TAO\": {}, \"TW-TNN\": {}, \"TW-TNQ\": {}, \"TW-TPE\": {}, \"TW-TPQ\": {},\n\t\"TW-TTT\": {}, \"TW-TXG\": {}, \"TW-TXQ\": {}, \"TW-YUN\": {}, \"TZ-01\": {},\n\t\"TZ-02\": {}, \"TZ-03\": {}, \"TZ-04\": {}, \"TZ-05\": {}, \"TZ-06\": {},\n\t\"TZ-07\": {}, \"TZ-08\": {}, \"TZ-09\": {}, \"TZ-10\": {}, \"TZ-11\": {},\n\t\"TZ-12\": {}, \"TZ-13\": {}, \"TZ-14\": {}, \"TZ-15\": {}, \"TZ-16\": {},\n\t\"TZ-17\": {}, \"TZ-18\": {}, \"TZ-19\": {}, \"TZ-20\": {}, \"TZ-21\": {},\n\t\"TZ-22\": {}, \"TZ-23\": {}, \"TZ-24\": {}, \"TZ-25\": {}, \"TZ-26\": {}, \"TZ-27\": {}, \"TZ-28\": {}, \"TZ-29\": {}, \"TZ-30\": {}, \"TZ-31\": {},\n\t\"UA-05\": {}, \"UA-07\": {}, \"UA-09\": {}, \"UA-12\": {}, \"UA-14\": {},\n\t\"UA-18\": {}, \"UA-21\": {}, \"UA-23\": {}, \"UA-26\": {}, \"UA-30\": {},\n\t\"UA-32\": {}, \"UA-35\": {}, \"UA-40\": {}, \"UA-43\": {}, \"UA-46\": {},\n\t\"UA-48\": {}, \"UA-51\": {}, \"UA-53\": {}, \"UA-56\": {}, \"UA-59\": {},\n\t\"UA-61\": {}, \"UA-63\": {}, \"UA-65\": {}, \"UA-68\": {}, \"UA-71\": {},\n\t\"UA-74\": {}, \"UA-77\": {}, \"UG-101\": {}, \"UG-102\": {}, \"UG-103\": {},\n\t\"UG-104\": {}, \"UG-105\": {}, \"UG-106\": {}, \"UG-107\": {}, \"UG-108\": {},\n\t\"UG-109\": {}, \"UG-110\": {}, \"UG-111\": {}, \"UG-112\": {}, \"UG-113\": {},\n\t\"UG-114\": {}, \"UG-115\": {}, \"UG-116\": {}, \"UG-201\": {}, \"UG-202\": {},\n\t\"UG-203\": {}, \"UG-204\": {}, \"UG-205\": {}, \"UG-206\": {}, \"UG-207\": {},\n\t\"UG-208\": {}, \"UG-209\": {}, \"UG-210\": {}, \"UG-211\": {}, \"UG-212\": {},\n\t\"UG-213\": {}, \"UG-214\": {}, \"UG-215\": {}, \"UG-216\": {}, \"UG-217\": {},\n\t\"UG-218\": {}, \"UG-219\": {}, \"UG-220\": {}, \"UG-221\": {}, \"UG-222\": {},\n\t\"UG-223\": {}, \"UG-224\": {}, \"UG-301\": {}, \"UG-302\": {}, \"UG-303\": {},\n\t\"UG-304\": {}, \"UG-305\": {}, \"UG-306\": {}, \"UG-307\": {}, \"UG-308\": {},\n\t\"UG-309\": {}, \"UG-310\": {}, \"UG-311\": {}, \"UG-312\": {}, \"UG-313\": {},\n\t\"UG-314\": {}, \"UG-315\": {}, \"UG-316\": {}, \"UG-317\": {}, \"UG-318\": {},\n\t\"UG-319\": {}, \"UG-320\": {}, \"UG-321\": {}, \"UG-401\": {}, \"UG-402\": {},\n\t\"UG-403\": {}, \"UG-404\": {}, \"UG-405\": {}, \"UG-406\": {}, \"UG-407\": {},\n\t\"UG-408\": {}, \"UG-409\": {}, \"UG-410\": {}, \"UG-411\": {}, \"UG-412\": {},\n\t\"UG-413\": {}, \"UG-414\": {}, \"UG-415\": {}, \"UG-416\": {}, \"UG-417\": {},\n\t\"UG-418\": {}, \"UG-419\": {}, \"UG-C\": {}, \"UG-E\": {}, \"UG-N\": {},\n\t\"UG-W\": {}, \"UG-322\": {}, \"UG-323\": {}, \"UG-420\": {}, \"UG-117\": {},\n\t\"UG-118\": {}, \"UG-225\": {}, \"UG-120\": {}, \"UG-226\": {},\n\t\"UG-121\": {}, \"UG-122\": {}, \"UG-227\": {}, \"UG-421\": {},\n\t\"UG-325\": {}, \"UG-228\": {}, \"UG-123\": {}, \"UG-422\": {},\n\t\"UG-326\": {}, \"UG-229\": {}, \"UG-124\": {}, \"UG-423\": {},\n\t\"UG-230\": {}, \"UG-327\": {}, \"UG-424\": {}, \"UG-328\": {},\n\t\"UG-425\": {}, \"UG-426\": {}, \"UG-330\": {},\n\t\"UM-67\": {}, \"UM-71\": {}, \"UM-76\": {}, \"UM-79\": {},\n\t\"UM-81\": {}, \"UM-84\": {}, \"UM-86\": {}, \"UM-89\": {}, \"UM-95\": {},\n\t\"US-AK\": {}, \"US-AL\": {}, \"US-AR\": {}, \"US-AS\": {}, \"US-AZ\": {},\n\t\"US-CA\": {}, \"US-CO\": {}, \"US-CT\": {}, \"US-DC\": {}, \"US-DE\": {},\n\t\"US-FL\": {}, \"US-GA\": {}, \"US-GU\": {}, \"US-HI\": {}, \"US-IA\": {},\n\t\"US-ID\": {}, \"US-IL\": {}, \"US-IN\": {}, \"US-KS\": {}, \"US-KY\": {},\n\t\"US-LA\": {}, \"US-MA\": {}, \"US-MD\": {}, \"US-ME\": {}, \"US-MI\": {},\n\t\"US-MN\": {}, \"US-MO\": {}, \"US-MP\": {}, \"US-MS\": {}, \"US-MT\": {},\n\t\"US-NC\": {}, \"US-ND\": {}, \"US-NE\": {}, \"US-NH\": {}, \"US-NJ\": {},\n\t\"US-NM\": {}, \"US-NV\": {}, \"US-NY\": {}, \"US-OH\": {}, \"US-OK\": {},\n\t\"US-OR\": {}, \"US-PA\": {}, \"US-PR\": {}, \"US-RI\": {}, \"US-SC\": {},\n\t\"US-SD\": {}, \"US-TN\": {}, \"US-TX\": {}, \"US-UM\": {}, \"US-UT\": {},\n\t\"US-VA\": {}, \"US-VI\": {}, \"US-VT\": {}, \"US-WA\": {}, \"US-WI\": {},\n\t\"US-WV\": {}, \"US-WY\": {}, \"UY-AR\": {}, \"UY-CA\": {}, \"UY-CL\": {},\n\t\"UY-CO\": {}, \"UY-DU\": {}, \"UY-FD\": {}, \"UY-FS\": {}, \"UY-LA\": {},\n\t\"UY-MA\": {}, \"UY-MO\": {}, \"UY-PA\": {}, \"UY-RN\": {}, \"UY-RO\": {},\n\t\"UY-RV\": {}, \"UY-SA\": {}, \"UY-SJ\": {}, \"UY-SO\": {}, \"UY-TA\": {},\n\t\"UY-TT\": {}, \"UZ-AN\": {}, \"UZ-BU\": {}, \"UZ-FA\": {}, \"UZ-JI\": {},\n\t\"UZ-NG\": {}, \"UZ-NW\": {}, \"UZ-QA\": {}, \"UZ-QR\": {}, \"UZ-SA\": {},\n\t\"UZ-SI\": {}, \"UZ-SU\": {}, \"UZ-TK\": {}, \"UZ-TO\": {}, \"UZ-XO\": {},\n\t\"VC-01\": {}, \"VC-02\": {}, \"VC-03\": {}, \"VC-04\": {}, \"VC-05\": {},\n\t\"VC-06\": {}, \"VE-A\": {}, \"VE-B\": {}, \"VE-C\": {}, \"VE-D\": {},\n\t\"VE-E\": {}, \"VE-F\": {}, \"VE-G\": {}, \"VE-H\": {}, \"VE-I\": {},\n\t\"VE-J\": {}, \"VE-K\": {}, \"VE-L\": {}, \"VE-M\": {}, \"VE-N\": {},\n\t\"VE-O\": {}, \"VE-P\": {}, \"VE-R\": {}, \"VE-S\": {}, \"VE-T\": {},\n\t\"VE-U\": {}, \"VE-V\": {}, \"VE-W\": {}, \"VE-X\": {}, \"VE-Y\": {},\n\t\"VE-Z\": {}, \"VN-01\": {}, \"VN-02\": {}, \"VN-03\": {}, \"VN-04\": {},\n\t\"VN-05\": {}, \"VN-06\": {}, \"VN-07\": {}, \"VN-09\": {}, \"VN-13\": {},\n\t\"VN-14\": {}, \"VN-15\": {}, \"VN-18\": {}, \"VN-20\": {}, \"VN-21\": {},\n\t\"VN-22\": {}, \"VN-23\": {}, \"VN-24\": {}, \"VN-25\": {}, \"VN-26\": {},\n\t\"VN-27\": {}, \"VN-28\": {}, \"VN-29\": {}, \"VN-30\": {}, \"VN-31\": {},\n\t\"VN-32\": {}, \"VN-33\": {}, \"VN-34\": {}, \"VN-35\": {}, \"VN-36\": {},\n\t\"VN-37\": {}, \"VN-39\": {}, \"VN-40\": {}, \"VN-41\": {}, \"VN-43\": {},\n\t\"VN-44\": {}, \"VN-45\": {}, \"VN-46\": {}, \"VN-47\": {}, \"VN-49\": {},\n\t\"VN-50\": {}, \"VN-51\": {}, \"VN-52\": {}, \"VN-53\": {}, \"VN-54\": {},\n\t\"VN-55\": {}, \"VN-56\": {}, \"VN-57\": {}, \"VN-58\": {}, \"VN-59\": {},\n\t\"VN-61\": {}, \"VN-63\": {}, \"VN-66\": {}, \"VN-67\": {}, \"VN-68\": {},\n\t\"VN-69\": {}, \"VN-70\": {}, \"VN-71\": {}, \"VN-72\": {}, \"VN-73\": {},\n\t\"VN-CT\": {}, \"VN-DN\": {}, \"VN-HN\": {}, \"VN-HP\": {}, \"VN-SG\": {},\n\t\"VU-MAP\": {}, \"VU-PAM\": {}, \"VU-SAM\": {}, \"VU-SEE\": {}, \"VU-TAE\": {},\n\t\"VU-TOB\": {}, \"WF-SG\": {}, \"WF-UV\": {}, \"WS-AA\": {}, \"WS-AL\": {}, \"WS-AT\": {}, \"WS-FA\": {},\n\t\"WS-GE\": {}, \"WS-GI\": {}, \"WS-PA\": {}, \"WS-SA\": {}, \"WS-TU\": {},\n\t\"WS-VF\": {}, \"WS-VS\": {}, \"YE-AB\": {}, \"YE-AD\": {}, \"YE-AM\": {},\n\t\"YE-BA\": {}, \"YE-DA\": {}, \"YE-DH\": {}, \"YE-HD\": {}, \"YE-HJ\": {}, \"YE-HU\": {},\n\t\"YE-IB\": {}, \"YE-JA\": {}, \"YE-LA\": {}, \"YE-MA\": {}, \"YE-MR\": {},\n\t\"YE-MU\": {}, \"YE-MW\": {}, \"YE-RA\": {}, \"YE-SA\": {}, \"YE-SD\": {}, \"YE-SH\": {},\n\t\"YE-SN\": {}, \"YE-TA\": {}, \"ZA-EC\": {}, \"ZA-FS\": {}, \"ZA-GP\": {},\n\t\"ZA-LP\": {}, \"ZA-MP\": {}, \"ZA-NC\": {}, \"ZA-NW\": {}, \"ZA-WC\": {},\n\t\"ZA-ZN\": {}, \"ZA-KZN\": {}, \"ZM-01\": {}, \"ZM-02\": {}, \"ZM-03\": {}, \"ZM-04\": {},\n\t\"ZM-05\": {}, \"ZM-06\": {}, \"ZM-07\": {}, \"ZM-08\": {}, \"ZM-09\": {}, \"ZM-10\": {},\n\t\"ZW-BU\": {}, \"ZW-HA\": {}, \"ZW-MA\": {}, \"ZW-MC\": {}, \"ZW-ME\": {},\n\t\"ZW-MI\": {}, \"ZW-MN\": {}, \"ZW-MS\": {}, \"ZW-MV\": {}, \"ZW-MW\": {},\n}\n"
  },
  {
    "path": "currency_codes.go",
    "content": "package validator\n\nvar iso4217 = map[string]struct{}{\n\t\"AFN\": {}, \"EUR\": {}, \"ALL\": {}, \"DZD\": {}, \"USD\": {},\n\t\"AOA\": {}, \"XCD\": {}, \"ARS\": {}, \"AMD\": {}, \"AWG\": {},\n\t\"AUD\": {}, \"AZN\": {}, \"BSD\": {}, \"BHD\": {}, \"BDT\": {},\n\t\"BBD\": {}, \"BYN\": {}, \"BZD\": {}, \"XOF\": {}, \"BMD\": {},\n\t\"INR\": {}, \"BTN\": {}, \"BOB\": {}, \"BOV\": {}, \"BAM\": {},\n\t\"BWP\": {}, \"NOK\": {}, \"BRL\": {}, \"BND\": {}, \"BGN\": {},\n\t\"BIF\": {}, \"CVE\": {}, \"KHR\": {}, \"XAF\": {}, \"CAD\": {},\n\t\"KYD\": {}, \"CLP\": {}, \"CLF\": {}, \"CNY\": {}, \"COP\": {},\n\t\"COU\": {}, \"KMF\": {}, \"CDF\": {}, \"NZD\": {}, \"CRC\": {},\n\t\"CUP\": {}, \"CZK\": {}, \"DKK\": {}, \"DJF\": {}, \"DOP\": {},\n\t\"EGP\": {}, \"SVC\": {}, \"ERN\": {}, \"SZL\": {}, \"ETB\": {},\n\t\"FKP\": {}, \"FJD\": {}, \"XPF\": {}, \"GMD\": {}, \"GEL\": {},\n\t\"GHS\": {}, \"GIP\": {}, \"GTQ\": {}, \"GBP\": {}, \"GNF\": {},\n\t\"GYD\": {}, \"HTG\": {}, \"HNL\": {}, \"HKD\": {}, \"HUF\": {},\n\t\"ISK\": {}, \"IDR\": {}, \"XDR\": {}, \"IRR\": {}, \"IQD\": {},\n\t\"ILS\": {}, \"JMD\": {}, \"JPY\": {}, \"JOD\": {}, \"KZT\": {},\n\t\"KES\": {}, \"KPW\": {}, \"KRW\": {}, \"KWD\": {}, \"KGS\": {},\n\t\"LAK\": {}, \"LBP\": {}, \"LSL\": {}, \"ZAR\": {}, \"LRD\": {},\n\t\"LYD\": {}, \"CHF\": {}, \"MOP\": {}, \"MKD\": {}, \"MGA\": {},\n\t\"MWK\": {}, \"MYR\": {}, \"MVR\": {}, \"MRU\": {}, \"MUR\": {},\n\t\"XUA\": {}, \"MXN\": {}, \"MXV\": {}, \"MDL\": {}, \"MNT\": {},\n\t\"MAD\": {}, \"MZN\": {}, \"MMK\": {}, \"NAD\": {}, \"NPR\": {},\n\t\"NIO\": {}, \"NGN\": {}, \"OMR\": {}, \"PKR\": {}, \"PAB\": {},\n\t\"PGK\": {}, \"PYG\": {}, \"PEN\": {}, \"PHP\": {}, \"PLN\": {},\n\t\"QAR\": {}, \"RON\": {}, \"RUB\": {}, \"RWF\": {}, \"SHP\": {},\n\t\"WST\": {}, \"STN\": {}, \"SAR\": {}, \"RSD\": {}, \"SCR\": {},\n\t\"SLE\": {}, \"SGD\": {}, \"XSU\": {}, \"SBD\": {}, \"SOS\": {},\n\t\"SSP\": {}, \"LKR\": {}, \"SDG\": {}, \"SRD\": {}, \"SEK\": {},\n\t\"CHE\": {}, \"CHW\": {}, \"SYP\": {}, \"TWD\": {}, \"TJS\": {},\n\t\"TZS\": {}, \"THB\": {}, \"TOP\": {}, \"TTD\": {}, \"TND\": {},\n\t\"TRY\": {}, \"TMT\": {}, \"UGX\": {}, \"UAH\": {}, \"AED\": {},\n\t\"USN\": {}, \"UYU\": {}, \"UYI\": {}, \"UYW\": {}, \"UZS\": {},\n\t\"VUV\": {}, \"VES\": {}, \"VED\": {}, \"VND\": {}, \"YER\": {},\n\t\"ZMW\": {}, \"ZWG\": {}, \"XBA\": {}, \"XBB\": {}, \"XBC\": {},\n\t\"XBD\": {}, \"XCG\": {}, \"XTS\": {}, \"XXX\": {}, \"XAU\": {},\n\t\"XPD\": {}, \"XPT\": {}, \"XAG\": {},\n}\n\nvar iso4217_numeric = map[int]struct{}{\n\t8: {}, 12: {}, 32: {}, 36: {}, 44: {},\n\t48: {}, 50: {}, 51: {}, 52: {}, 60: {},\n\t64: {}, 68: {}, 72: {}, 84: {}, 90: {},\n\t96: {}, 104: {}, 108: {}, 116: {}, 124: {},\n\t132: {}, 136: {}, 144: {}, 152: {}, 156: {},\n\t170: {}, 174: {}, 188: {}, 192: {}, 203: {},\n\t208: {}, 214: {}, 222: {}, 230: {}, 232: {},\n\t238: {}, 242: {}, 262: {}, 270: {}, 292: {},\n\t320: {}, 324: {}, 328: {}, 332: {}, 340: {},\n\t344: {}, 348: {}, 352: {}, 356: {}, 360: {},\n\t364: {}, 368: {}, 376: {}, 388: {}, 392: {},\n\t398: {}, 400: {}, 404: {}, 408: {}, 410: {},\n\t414: {}, 417: {}, 418: {}, 422: {}, 426: {},\n\t430: {}, 434: {}, 446: {}, 454: {}, 458: {},\n\t462: {}, 480: {}, 484: {}, 496: {}, 498: {},\n\t504: {}, 512: {}, 516: {}, 524: {}, 532: {},\n\t533: {}, 548: {}, 554: {}, 558: {}, 566: {},\n\t578: {}, 586: {}, 590: {}, 598: {}, 600: {},\n\t604: {}, 608: {}, 634: {}, 643: {}, 646: {},\n\t654: {}, 682: {}, 690: {}, 702: {}, 704: {},\n\t706: {}, 710: {}, 728: {}, 748: {}, 752: {},\n\t756: {}, 760: {}, 764: {}, 776: {}, 780: {},\n\t784: {}, 788: {}, 800: {}, 807: {}, 818: {},\n\t826: {}, 834: {}, 840: {}, 858: {}, 860: {},\n\t882: {}, 886: {}, 901: {}, 924: {}, 925: {},\n\t926: {}, 927: {}, 928: {}, 929: {}, 930: {},\n\t933: {}, 934: {}, 936: {}, 938: {}, 940: {},\n\t941: {}, 943: {}, 944: {}, 946: {}, 947: {},\n\t948: {}, 949: {}, 950: {}, 951: {}, 952: {},\n\t953: {}, 955: {}, 956: {}, 957: {}, 958: {},\n\t959: {}, 960: {}, 961: {}, 962: {}, 963: {},\n\t964: {}, 965: {}, 967: {}, 968: {}, 969: {},\n\t970: {}, 971: {}, 972: {}, 973: {}, 975: {},\n\t976: {}, 977: {}, 978: {}, 979: {}, 980: {},\n\t981: {}, 984: {}, 985: {}, 986: {}, 990: {},\n\t994: {}, 997: {}, 999: {},\n}\n"
  },
  {
    "path": "doc.go",
    "content": "/*\nPackage validator implements value validations for structs and individual fields\nbased on tags.\n\nIt can also handle Cross-Field and Cross-Struct validation for nested structs\nand has the ability to dive into arrays and maps of any type.\n\nsee more examples https://github.com/go-playground/validator/tree/master/_examples\n\n# Singleton\n\nValidator is designed to be thread-safe and used as a singleton instance.\nIt caches information about your struct and validations,\nin essence only parsing your validation tags once per struct type.\nUsing multiple instances neglects the benefit of caching.\nThe not thread-safe functions are explicitly marked as such in the documentation.\n\n# Validation Functions Return Type error\n\nDoing things this way is actually the way the standard library does, see the\nfile.Open method here:\n\n\thttps://golang.org/pkg/os/#Open.\n\nThe authors return type \"error\" to avoid the issue discussed in the following,\nwhere err is always != nil:\n\n\thttp://stackoverflow.com/a/29138676/3158232\n\thttps://github.com/go-playground/validator/issues/134\n\nValidator only InvalidValidationError for bad validation input, nil or\nValidationErrors as type error; so, in your code all you need to do is check\nif the error returned is not nil, and if it's not check if error is\nInvalidValidationError ( if necessary, most of the time it isn't ) type cast\nit to type ValidationErrors like so err.(validator.ValidationErrors).\n\n# Custom Validation Functions\n\nCustom Validation functions can be added. Example:\n\n\t// Structure\n\tfunc customFunc(fl validator.FieldLevel) bool {\n\n\t\tif fl.Field().String() == \"invalid\" {\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t}\n\n\tvalidate.RegisterValidation(\"custom tag name\", customFunc)\n\t// NOTES: using the same tag name as an existing function\n\t//        will overwrite the existing one\n\n# Valuer Interface\n\nCustom types can implement the Valuer interface to return the value that should\nbe validated. This is useful when a type wraps another value and you want\nvalidation to run against the unwrapped value.\n\n\ttype Nullable[T any] struct {\n\t\tData T\n\t}\n\n\tfunc (n Nullable[T]) ValidatorValue() any {\n\t\treturn n.Data\n\t}\n\n\ttype Config struct {\n\t\tName string `validate:\"required\"`\n\t}\n\n\ttype Record struct {\n\t\tConfig Nullable[Config] `validate:\"required\"`\n\t}\n\n\tr := Record{\n\t\tConfig: Nullable[Config]{\n\t\t\tData: Config{Name: \"validator\"},\n\t\t},\n\t}\n\n\terr := validate.Struct(r)\n\nThe library also supports types like sql/driver.Valuer using\nRegisterCustomTypeFunc. See _examples/valuer/main.go and\n_examples/custom/main.go for both approaches.\n\n# Cross-Field Validation\n\nCross-Field Validation can be done via the following tags:\n  - eqfield\n  - nefield\n  - gtfield\n  - gtefield\n  - ltfield\n  - ltefield\n  - eqcsfield\n  - necsfield\n  - gtcsfield\n  - gtecsfield\n  - ltcsfield\n  - ltecsfield\n\nIf, however, some custom cross-field validation is required, it can be done\nusing a custom validation.\n\nWhy not just have cross-fields validation tags (i.e. only eqcsfield and not\neqfield)?\n\nThe reason is efficiency. If you want to check a field within the same struct\n\"eqfield\" only has to find the field on the same struct (1 level). But, if we\nused \"eqcsfield\" it could be multiple levels down. Example:\n\n\ttype Inner struct {\n\t\tStartDate time.Time\n\t}\n\n\ttype Outer struct {\n\t\tInnerStructField *Inner\n\t\tCreatedAt time.Time      `validate:\"ltecsfield=InnerStructField.StartDate\"`\n\t}\n\n\tnow := time.Now()\n\n\tinner := &Inner{\n\t\tStartDate: now,\n\t}\n\n\touter := &Outer{\n\t\tInnerStructField: inner,\n\t\tCreatedAt: now,\n\t}\n\n\terrs := validate.Struct(outer)\n\n\t// NOTE: when calling validate.Struct(val) topStruct will be the top level struct passed\n\t//       into the function\n\t//       when calling validate.VarWithValue(val, field, tag) val will be\n\t//       whatever you pass, struct, field...\n\t//       when calling validate.Field(field, tag) val will be nil\n\n# Multiple Validators\n\nMultiple validators on a field will process in the order defined. Example:\n\n\ttype Test struct {\n\t\tField `validate:\"max=10,min=1\"`\n\t}\n\n\t// max will be checked then min\n\nBad Validator definitions are not handled by the library. Example:\n\n\ttype Test struct {\n\t\tField `validate:\"min=10,max=0\"`\n\t}\n\n\t// this definition of min max will never succeed\n\n# Using Validator Tags\n\nBaked In Cross-Field validation only compares fields on the same struct.\nIf Cross-Field + Cross-Struct validation is needed you should implement your\nown custom validator.\n\nComma (\",\") is the default separator of validation tags. If you wish to\nhave a comma included within the parameter (i.e. excludesall=,) you will need to\nuse the UTF-8 hex representation 0x2C, which is replaced in the code as a comma,\nso the above will become excludesall=0x2C.\n\n\ttype Test struct {\n\t\tField `validate:\"excludesall=,\"`    // BAD! Do not include a comma.\n\t\tField `validate:\"excludesall=0x2C\"` // GOOD! Use the UTF-8 hex representation.\n\t}\n\nPipe (\"|\") is the 'or' validation tags deparator. If you wish to\nhave a pipe included within the parameter i.e. excludesall=| you will need to\nuse the UTF-8 hex representation 0x7C, which is replaced in the code as a pipe,\nso the above will become excludesall=0x7C\n\n\ttype Test struct {\n\t\tField `validate:\"excludesall=|\"`    // BAD! Do not include a pipe!\n\t\tField `validate:\"excludesall=0x7C\"` // GOOD! Use the UTF-8 hex representation.\n\t}\n\n# Baked In Validators and Tags\n\nHere is a list of the current built in validators:\n\n# Skip Field\n\nTells the validation to skip this struct field; this is particularly\nhandy in ignoring embedded structs from being validated. (Usage: -)\n\n\tUsage: -\n\n# Or Operator\n\nThis is the 'or' operator allowing multiple validators to be used and\naccepted. (Usage: rgb|rgba) <-- this would allow either rgb or rgba\ncolors to be accepted. This can also be combined with 'and' for example\n( Usage: omitempty,rgb|rgba)\n\n\tUsage: |\n\n# StructOnly\n\nWhen a field that is a nested struct is encountered, and contains this flag\nany validation on the nested struct will be run, but none of the nested\nstruct fields will be validated. This is useful if inside of your program\nyou know the struct will be valid, but need to verify it has been assigned.\nNOTE: only \"required\" and \"omitempty\" can be used on a struct itself.\n\n\tUsage: structonly\n\n# NoStructLevel\n\nSame as structonly tag except that any struct level validations will not run.\n\n\tUsage: nostructlevel\n\n# Omit Empty\n\nAllows conditional validation, for example, if a field is not set with\na value (Determined by the \"required\" validator) then other validation\nsuch as min or max won't run, but if a value is set validation will run.\n\n\tUsage: omitempty\n\n# Omit Nil\n\nAllows to skip the validation if the value is nil (same as omitempty, but\nonly for the nil-values).\n\n\tUsage: omitnil\n\n# Omit Zero\n\nAllows to skip the validation if the value is a zero value.\nFor pointers, it checks if the pointer is nil or the underlying value is a zero value.\nFor slices and maps, it checks if the value is nil or empty.\nOtherwise, behaves the same as omitempty.\n\n\tUsage: omitzero\n\n# Dive\n\nThis tells the validator to dive into a slice, array or map and validate that\nlevel of the slice, array or map with the validation tags that follow.\nMultidimensional nesting is also supported, each level you wish to dive will\nrequire another dive tag. dive has some sub-tags, 'keys' & 'endkeys', please see\nthe Keys & EndKeys section just below.\n\n\tUsage: dive\n\nExample #1\n\n\t[][]string with validation tag \"gt=0,dive,len=1,dive,required\"\n\t// gt=0 will be applied to []\n\t// len=1 will be applied to []string\n\t// required will be applied to string\n\nExample #2\n\n\t[][]string with validation tag \"gt=0,dive,dive,required\"\n\t// gt=0 will be applied to []\n\t// []string will be spared validation\n\t// required will be applied to string\n\nKeys & EndKeys\n\nThese are to be used together directly after the dive tag and tells the validator\nthat anything between 'keys' and 'endkeys' applies to the keys of a map and not the\nvalues; think of it like the 'dive' tag, but for map keys instead of values.\nMultidimensional nesting is also supported, each level you wish to validate will\nrequire another 'keys' and 'endkeys' tag. These tags are only valid for maps.\n\n\tUsage: dive,keys,othertagvalidation(s),endkeys,valuevalidationtags\n\nExample #1\n\n\tmap[string]string with validation tag \"gt=0,dive,keys,eq=1|eq=2,endkeys,required\"\n\t// gt=0 will be applied to the map itself\n\t// eq=1|eq=2 will be applied to the map keys\n\t// required will be applied to map values\n\nExample #2\n\n\tmap[[2]string]string with validation tag \"gt=0,dive,keys,dive,eq=1|eq=2,endkeys,required\"\n\t// gt=0 will be applied to the map itself\n\t// eq=1|eq=2 will be applied to each array element in the map keys\n\t// required will be applied to map values\n\n# Required\n\nThis validates that the value is not the data types default zero value.\nFor numbers ensures value is not zero. For strings ensures value is\nnot \"\". For booleans ensures value is not false. For slices, maps, pointers, interfaces, channels and functions\nensures the value is not nil. For structs ensures value is not the zero value when using WithRequiredStructEnabled.\n\n\tUsage: required\n\n# Required If\n\nThe field under validation must be present and not empty only if all\nthe other specified fields are equal to the value following the specified\nfield. For strings ensures value is not \"\". For slices, maps, pointers,\ninterfaces, channels and functions ensures the value is not nil. For structs ensures value is not the zero value.\nUsing the same field name multiple times in the parameters will result in a panic at runtime.\n\n\tUsage: required_if\n\nExamples:\n\n\t// require the field if the Field1 is equal to the parameter given:\n\tUsage: required_if=Field1 foobar\n\n\t// require the field if the Field1 and Field2 is equal to the value respectively:\n\tUsage: required_if=Field1 foo Field2 bar\n\n# Required Unless\n\nThe field under validation must be present and not empty unless all\nthe other specified fields are equal to the value following the specified\nfield. For strings ensures value is not \"\". For slices, maps, pointers,\ninterfaces, channels and functions ensures the value is not nil. For structs ensures value is not the zero value.\n\n\tUsage: required_unless\n\nExamples:\n\n\t// require the field unless the Field1 is equal to the parameter given:\n\tUsage: required_unless=Field1 foobar\n\n\t// require the field unless the Field1 and Field2 is equal to the value respectively:\n\tUsage: required_unless=Field1 foo Field2 bar\n\n# Required With\n\nThe field under validation must be present and not empty only if any\nof the other specified fields are present. For strings ensures value is\nnot \"\". For slices, maps, pointers, interfaces, channels and functions\nensures the value is not nil. For structs ensures value is not the zero value.\n\n\tUsage: required_with\n\nExamples:\n\n\t// require the field if the Field1 is present:\n\tUsage: required_with=Field1\n\n\t// require the field if the Field1 or Field2 is present:\n\tUsage: required_with=Field1 Field2\n\n# Required With All\n\nThe field under validation must be present and not empty only if all\nof the other specified fields are present. For strings ensures value is\nnot \"\". For slices, maps, pointers, interfaces, channels and functions\nensures the value is not nil. For structs ensures value is not the zero value.\n\n\tUsage: required_with_all\n\nExample:\n\n\t// require the field if the Field1 and Field2 is present:\n\tUsage: required_with_all=Field1 Field2\n\n# Required Without\n\nThe field under validation must be present and not empty only when any\nof the other specified fields are not present. For strings ensures value is\nnot \"\". For slices, maps, pointers, interfaces, channels and functions\nensures the value is not nil. For structs ensures value is not the zero value.\n\n\tUsage: required_without\n\nExamples:\n\n\t// require the field if the Field1 is not present:\n\tUsage: required_without=Field1\n\n\t// require the field if the Field1 or Field2 is not present:\n\tUsage: required_without=Field1 Field2\n\n# Required Without All\n\nThe field under validation must be present and not empty only when all\nof the other specified fields are not present. For strings ensures value is\nnot \"\". For slices, maps, pointers, interfaces, channels and functions\nensures the value is not nil. For structs ensures value is not the zero value.\n\n\tUsage: required_without_all\n\nExample:\n\n\t// require the field if the Field1 and Field2 is not present:\n\tUsage: required_without_all=Field1 Field2\n\n# Excluded If\n\nThe field under validation must not be present or not empty only if all\nthe other specified fields are equal to the value following the specified\nfield. For strings ensures value is not \"\". For slices, maps, pointers,\ninterfaces, channels and functions ensures the value is not nil. For structs ensures value is not the zero value.\n\n\tUsage: excluded_if\n\nExamples:\n\n\t// exclude the field if the Field1 is equal to the parameter given:\n\tUsage: excluded_if=Field1 foobar\n\n\t// exclude the field if the Field1 and Field2 is equal to the value respectively:\n\tUsage: excluded_if=Field1 foo Field2 bar\n\n# Excluded Unless\n\nThe field under validation must not be present or empty unless all\nthe other specified fields are equal to the value following the specified\nfield. For strings ensures value is not \"\". For slices, maps, pointers,\ninterfaces, channels and functions ensures the value is not nil. For structs ensures value is not the zero value.\n\n\tUsage: excluded_unless\n\nExamples:\n\n\t// exclude the field unless the Field1 is equal to the parameter given:\n\tUsage: excluded_unless=Field1 foobar\n\n\t// exclude the field unless the Field1 and Field2 is equal to the value respectively:\n\tUsage: excluded_unless=Field1 foo Field2 bar\n\n# Is Default\n\nThis validates that the value is the default value and is almost the\nopposite of required.\n\n\tUsage: isdefault\n\n# Length\n\nFor numbers, length will ensure that the value is\nequal to the parameter given. For strings, it checks that\nthe string length is exactly that number of characters. For slices,\narrays, and maps, validates the number of items.\n\nExample #1\n\n\tUsage: len=10\n\nExample #2 (time.Duration)\n\nFor time.Duration, len will ensure that the value is equal to the duration given\nin the parameter.\n\n\tUsage: len=1h30m\n\n# Maximum\n\nFor numbers, max will ensure that the value is\nless than or equal to the parameter given. For strings, it checks\nthat the string length is at most that number of characters. For\nslices, arrays, and maps, validates the number of items.\n\nExample #1\n\n\tUsage: max=10\n\nExample #2 (time.Duration)\n\nFor time.Duration, max will ensure that the value is less than or equal to the\nduration given in the parameter.\n\n\tUsage: max=1h30m\n\n# Minimum\n\nFor numbers, min will ensure that the value is\ngreater or equal to the parameter given. For strings, it checks that\nthe string length is at least that number of characters. For slices,\narrays, and maps, validates the number of items.\n\nExample #1\n\n\tUsage: min=10\n\nExample #2 (time.Duration)\n\nFor time.Duration, min will ensure that the value is greater than or equal to\nthe duration given in the parameter.\n\n\tUsage: min=1h30m\n\n# Equals\n\nFor strings & numbers, eq will ensure that the value is\nequal to the parameter given. For slices, arrays, and maps,\nvalidates the number of items.\n\nExample #1\n\n\tUsage: eq=10\n\nExample #2 (time.Duration)\n\nFor time.Duration, eq will ensure that the value is equal to the duration given\nin the parameter.\n\n\tUsage: eq=1h30m\n\n# Not Equal\n\nFor strings & numbers, ne will ensure that the value is not\nequal to the parameter given. For slices, arrays, and maps,\nvalidates the number of items.\n\nExample #1\n\n\tUsage: ne=10\n\nExample #2 (time.Duration)\n\nFor time.Duration, ne will ensure that the value is not equal to the duration\ngiven in the parameter.\n\n\tUsage: ne=1h30m\n\n# One Of\n\nFor strings, ints, and uints, oneof will ensure that the value\nis one of the values in the parameter.  The parameter should be\na list of values separated by whitespace. Values may be\nstrings or numbers. To match strings with spaces in them, include\nthe target string between single quotes. Kind of like an 'enum'.\n\n\tUsage: oneof=red green\n\t       oneof='red green' 'blue yellow'\n\t       oneof=5 7 9\n\n# One Of Case Insensitive\n\nWorks the same as oneof but is case insensitive and therefore only accepts strings.\n\n\tUsage: oneofci=red green\n\t       oneofci='red green' 'blue yellow'\n\n# Greater Than\n\nFor numbers, this will ensure that the value is greater than the\nparameter given. For strings, it checks that the string length\nis greater than that number of characters. For slices, arrays\nand maps it validates the number of items.\n\nExample #1\n\n\tUsage: gt=10\n\nExample #2 (time.Time)\n\nFor time.Time ensures the time value is greater than time.Now.UTC().\n\n\tUsage: gt\n\nExample #3 (time.Duration)\n\nFor time.Duration, gt will ensure that the value is greater than the duration\ngiven in the parameter.\n\n\tUsage: gt=1h30m\n\n# Greater Than or Equal\n\nSame as 'min' above. Kept both to make terminology with 'len' easier.\n\nExample #1\n\n\tUsage: gte=10\n\nExample #2 (time.Time)\n\nFor time.Time ensures the time value is greater than or equal to time.Now.UTC().\n\n\tUsage: gte\n\nExample #3 (time.Duration)\n\nFor time.Duration, gte will ensure that the value is greater than or equal to\nthe duration given in the parameter.\n\n\tUsage: gte=1h30m\n\n# Less Than\n\nFor numbers, this will ensure that the value is less than the parameter given.\nFor strings, it checks that the string length is less than that number of\ncharacters. For slices, arrays, and maps it validates the number of items.\n\nExample #1\n\n\tUsage: lt=10\n\nExample #2 (time.Time)\n\nFor time.Time ensures the time value is less than time.Now.UTC().\n\n\tUsage: lt\n\nExample #3 (time.Duration)\n\nFor time.Duration, lt will ensure that the value is less than the duration given\nin the parameter.\n\n\tUsage: lt=1h30m\n\n# Less Than or Equal\n\nSame as 'max' above. Kept both to make terminology with 'len' easier.\n\nExample #1\n\n\tUsage: lte=10\n\nExample #2 (time.Time)\n\nFor time.Time ensures the time value is less than or equal to time.Now.UTC().\n\n\tUsage: lte\n\nExample #3 (time.Duration)\n\nFor time.Duration, lte will ensure that the value is less than or equal to the\nduration given in the parameter.\n\n\tUsage: lte=1h30m\n\n# Field Equals Another Field\n\nThis will validate the field value against another fields value either within\na struct or passed in field.\n\nExample #1:\n\n\t// Validation on Password field using:\n\tUsage: eqfield=ConfirmPassword\n\nExample #2:\n\n\t// Validating by field:\n\tvalidate.VarWithValue(password, confirmpassword, \"eqfield\")\n\nField Equals Another Field (relative)\n\nThis does the same as eqfield except that it validates the field provided relative\nto the top level struct.\n\n\tUsage: eqcsfield=InnerStructField.Field)\n\n# Field Does Not Equal Another Field\n\nThis will validate the field value against another fields value either within\na struct or passed in field.\n\nExamples:\n\n\t// Confirm two colors are not the same:\n\t//\n\t// Validation on Color field:\n\tUsage: nefield=Color2\n\n\t// Validating by field:\n\tvalidate.VarWithValue(color1, color2, \"nefield\")\n\nField Does Not Equal Another Field (relative)\n\nThis does the same as nefield except that it validates the field provided\nrelative to the top level struct.\n\n\tUsage: necsfield=InnerStructField.Field\n\n# Field Greater Than Another Field\n\nOnly valid for Numbers, time.Duration and time.Time types, this will validate\nthe field value against another fields value either within a struct or passed in\nfield. usage examples are for validation of a Start and End date:\n\nExample #1:\n\n\t// Validation on End field using:\n\tvalidate.Struct Usage(gtfield=Start)\n\nExample #2:\n\n\t// Validating by field:\n\tvalidate.VarWithValue(start, end, \"gtfield\")\n\n# Field Greater Than Another Relative Field\n\nThis does the same as gtfield except that it validates the field provided\nrelative to the top level struct.\n\n\tUsage: gtcsfield=InnerStructField.Field\n\n# Field Greater Than or Equal To Another Field\n\nOnly valid for Numbers, time.Duration and time.Time types, this will validate\nthe field value against another fields value either within a struct or passed in\nfield. usage examples are for validation of a Start and End date:\n\nExample #1:\n\n\t// Validation on End field using:\n\tvalidate.Struct Usage(gtefield=Start)\n\nExample #2:\n\n\t// Validating by field:\n\tvalidate.VarWithValue(start, end, \"gtefield\")\n\n# Field Greater Than or Equal To Another Relative Field\n\nThis does the same as gtefield except that it validates the field provided relative\nto the top level struct.\n\n\tUsage: gtecsfield=InnerStructField.Field\n\n# Less Than Another Field\n\nOnly valid for Numbers, time.Duration and time.Time types, this will validate\nthe field value against another fields value either within a struct or passed in\nfield. usage examples are for validation of a Start and End date:\n\nExample #1:\n\n\t// Validation on End field using:\n\tvalidate.Struct Usage(ltfield=Start)\n\nExample #2:\n\n\t// Validating by field:\n\tvalidate.VarWithValue(start, end, \"ltfield\")\n\n# Less Than Another Relative Field\n\nThis does the same as ltfield except that it validates the field provided relative\nto the top level struct.\n\n\tUsage: ltcsfield=InnerStructField.Field\n\n# Less Than or Equal To Another Field\n\nOnly valid for Numbers, time.Duration and time.Time types, this will validate\nthe field value against another fields value either within a struct or passed in\nfield. usage examples are for validation of a Start and End date:\n\nExample #1:\n\n\t// Validation on End field using:\n\tvalidate.Struct Usage(ltefield=Start)\n\nExample #2:\n\n\t// Validating by field:\n\tvalidate.VarWithValue(start, end, \"ltefield\")\n\n# Less Than or Equal To Another Relative Field\n\nThis does the same as ltefield except that it validates the field provided relative\nto the top level struct.\n\n\tUsage: ltecsfield=InnerStructField.Field\n\n# Field Contains Another Field\n\nThis does the same as contains except for struct fields. It should only be used\nwith string types. See the behavior of reflect.Value.String() for behavior on\nother types.\n\n\tUsage: containsfield=InnerStructField.Field\n\n# Field Excludes Another Field\n\nThis does the same as excludes except for struct fields. It should only be used\nwith string types. See the behavior of reflect.Value.String() for behavior on\nother types.\n\n\tUsage: excludesfield=InnerStructField.Field\n\n# Unique\n\nFor arrays & slices, unique will ensure that there are no duplicates.\nFor maps, unique will ensure that there are no duplicate values.\nFor slices of struct, unique will ensure that there are no duplicate values\nin a field of the struct specified via a parameter.\n\n\t// For arrays, slices, and maps:\n\tUsage: unique\n\n\t// For slices of struct:\n\tUsage: unique=field\n\n# ValidateFn\n\nThis validates that an object responds to a method that can return error or bool.\nBy default it expects an interface `Validate() error` and check that the method\ndoes not return an error. Other methods can be specified using two signatures:\nIf the method returns an error, it check if the return value is nil.\nIf the method returns a boolean, it checks if the value is true.\n\n\t// to use the default method Validate() error\n\tUsage: validateFn\n\n\t// to use the custom method IsValid() bool (or error)\n\tUsage: validateFn=IsValid\n\n# Alpha Only\n\nThis validates that a string value contains ASCII alpha characters only\n\n\tUsage: alpha\n\n# Alpha Space\n\nThis validates that a string value contains ASCII alpha characters and spaces only\n\n\tUsage: alphaspace\n\n# Alphanumeric\n\nThis validates that a string value contains ASCII alphanumeric characters only\n\n\tUsage: alphanum\n\n# Alphanumeric Space\n\nThis validates that a string value contains ASCII alphanumeric characters and spaces only\n\n\tUsage: alphanumspace\n\n# Alpha Unicode\n\nThis validates that a string value contains unicode alpha characters only\n\n\tUsage: alphaunicode\n\n# Alphanumeric Unicode\n\nThis validates that a string value contains unicode alphanumeric characters only\n\n\tUsage: alphanumunicode\n\n# Boolean\n\nThis validates that a string value can successfully be parsed into a boolean with strconv.ParseBool\n\n\tUsage: boolean\n\n# Number\n\nThis validates that a string value contains number values only.\nFor integers or float it returns true.\n\n\tUsage: number\n\n# Numeric\n\nThis validates that a string value contains a basic numeric value.\nbasic excludes exponents etc...\nfor integers or float it returns true.\n\n\tUsage: numeric\n\n# Hexadecimal String\n\nThis validates that a string value contains a valid hexadecimal.\n\n\tUsage: hexadecimal\n\n# Hexcolor String\n\nThis validates that a string value contains a valid hex color including\nhashtag (#)\n\n\tUsage: hexcolor\n\n# Lowercase String\n\nThis validates that a string value contains only lowercase characters. An empty string is not a valid lowercase string.\n\n\tUsage: lowercase\n\n# Uppercase String\n\nThis validates that a string value contains only uppercase characters. An empty string is not a valid uppercase string.\n\n\tUsage: uppercase\n\n# RGB String\n\nThis validates that a string value contains a valid rgb color\n\n\tUsage: rgb\n\n# RGBA String\n\nThis validates that a string value contains a valid rgba color\n\n\tUsage: rgba\n\n# HSL String\n\nThis validates that a string value contains a valid hsl color\n\n\tUsage: hsl\n\n# HSLA String\n\nThis validates that a string value contains a valid hsla color\n\n\tUsage: hsla\n\n# CMYK String\n\nThis validates that a string value contains a valid cmyk color\n\n\tUsage: cmyk\n\n# E.164 Phone Number String\n\nThis validates that a string value contains a valid E.164 Phone number\nhttps://en.wikipedia.org/wiki/E.164 (ex. +1123456789)\n\n\tUsage: e164\n\n# E-mail String\n\nThis validates that a string value contains a valid email\nThis may not conform to all possibilities of any rfc standard, but neither\ndoes any email provider accept all possibilities.\n\n\tUsage: email\n\n# JSON String\n\nThis validates that a string value is valid JSON\n\n\tUsage: json\n\n# JWT String\n\nThis validates that a string value is a valid JWT\n\n\tUsage: jwt\n\n# File\n\nThis validates that a string value contains a valid file path and that\nthe file exists on the machine.\nThis is done using os.Stat, which is a platform independent function.\n\n\tUsage: file\n\n# Image path\n\nThis validates that a string value contains a valid file path and that\nthe file exists on the machine and is an image.\nThis is done using os.Stat and github.com/gabriel-vasile/mimetype\n\n\tUsage: image\n\n# File Path\n\nThis validates that a string value contains a valid file path but does not\nvalidate the existence of that file.\nThis is done using os.Stat, which is a platform independent function.\n\n\tUsage: filepath\n\n# URL String\n\nThis validates that a string value contains a valid url\nThis will accept any url the golang request uri accepts but must contain\na schema for example http:// or rtmp://\n\n\tUsage: url\n\n# URI String\n\nThis validates that a string value contains a valid uri\nThis will accept any uri the golang request uri accepts\n\n\tUsage: uri\n\n# Urn RFC 2141 String\n\nThis validates that a string value contains a valid URN\naccording to the RFC 2141 spec.\n\n\tUsage: urn_rfc2141\n\n# Base32 String\n\nThis validates that a string value contains a valid bas324 value.\nAlthough an empty string is valid base32 this will report an empty string\nas an error, if you wish to accept an empty string as valid you can use\nthis with the omitempty tag.\n\n\tUsage: base32\n\n# Base64 String\n\nThis validates that a string value contains a valid base64 value.\nAlthough an empty string is valid base64 this will report an empty string\nas an error, if you wish to accept an empty string as valid you can use\nthis with the omitempty tag.\n\n\tUsage: base64\n\n# Base64URL String\n\nThis validates that a string value contains a valid base64 URL safe value\naccording the RFC4648 spec.\nAlthough an empty string is a valid base64 URL safe value, this will report\nan empty string as an error, if you wish to accept an empty string as valid\nyou can use this with the omitempty tag.\n\n\tUsage: base64url\n\n# Base64RawURL String\n\nThis validates that a string value contains a valid base64 URL safe value,\nbut without = padding, according the RFC4648 spec, section 3.2.\nAlthough an empty string is a valid base64 URL safe value, this will report\nan empty string as an error, if you wish to accept an empty string as valid\nyou can use this with the omitempty tag.\n\n\tUsage: base64rawurl\n\n# Bitcoin Address\n\nThis validates that a string value contains a valid bitcoin address.\nThe format of the string is checked to ensure it matches one of the three formats\nP2PKH, P2SH and performs checksum validation.\n\n\tUsage: btc_addr\n\nBitcoin Bech32 Address (segwit)\n\nThis validates that a string value contains a valid bitcoin Bech32 address as defined\nby bip-0173 (https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki)\nSpecial thanks to Pieter Wuille for providing reference implementations.\n\n\tUsage: btc_addr_bech32\n\n# Ethereum Address\n\nThis validates that a string value contains a valid ethereum address.\nThe format of the string is checked to ensure it matches the standard Ethereum address format.\n\n\tUsage: eth_addr\n\n# Contains\n\nThis validates that a string value contains the substring value.\n\n\tUsage: contains=@\n\n# Contains Any\n\nThis validates that a string value contains any Unicode code points\nin the substring value.\n\n\tUsage: containsany=!@#?\n\n# Contains Rune\n\nThis validates that a string value contains the supplied rune value.\n\n\tUsage: containsrune=@\n\n# Excludes\n\nThis validates that a string value does not contain the substring value.\n\n\tUsage: excludes=@\n\n# Excludes All\n\nThis validates that a string value does not contain any Unicode code\npoints in the substring value.\n\n\tUsage: excludesall=!@#?\n\n# Excludes Rune\n\nThis validates that a string value does not contain the supplied rune value.\n\n\tUsage: excludesrune=@\n\n# Starts With\n\nThis validates that a string value starts with the supplied string value\n\n\tUsage: startswith=hello\n\n# Ends With\n\nThis validates that a string value ends with the supplied string value\n\n\tUsage: endswith=goodbye\n\n# Does Not Start With\n\nThis validates that a string value does not start with the supplied string value\n\n\tUsage: startsnotwith=hello\n\n# Does Not End With\n\nThis validates that a string value does not end with the supplied string value\n\n\tUsage: endsnotwith=goodbye\n\n# International Standard Book Number\n\nThis validates that a string value contains a valid isbn10 or isbn13 value.\n\n\tUsage: isbn\n\n# International Standard Book Number 10\n\nThis validates that a string value contains a valid isbn10 value.\n\n\tUsage: isbn10\n\n# International Standard Book Number 13\n\nThis validates that a string value contains a valid isbn13 value.\n\n\tUsage: isbn13\n\n# Universally Unique Identifier UUID\n\nThis validates that a string value contains a valid UUID. Uppercase UUID values will not pass - use `uuid_rfc4122` instead.\n\n\tUsage: uuid\n\n# Universally Unique Identifier UUID v3\n\nThis validates that a string value contains a valid version 3 UUID.  Uppercase UUID values will not pass - use `uuid3_rfc4122` instead.\n\n\tUsage: uuid3\n\n# Universally Unique Identifier UUID v4\n\nThis validates that a string value contains a valid version 4 UUID.  Uppercase UUID values will not pass - use `uuid4_rfc4122` instead.\n\n\tUsage: uuid4\n\n# Universally Unique Identifier UUID v5\n\nThis validates that a string value contains a valid version 5 UUID.  Uppercase UUID values will not pass - use `uuid5_rfc4122` instead.\n\n\tUsage: uuid5\n\n# Universally Unique Lexicographically Sortable Identifier ULID\n\nThis validates that a string value contains a valid ULID value.\n\n\tUsage: ulid\n\n# ASCII\n\nThis validates that a string value contains only ASCII characters.\nNOTE: if the string is blank, this validates as true.\n\n\tUsage: ascii\n\n# Printable ASCII\n\nThis validates that a string value contains only printable ASCII characters.\nNOTE: if the string is blank, this validates as true.\n\n\tUsage: printascii\n\n# Multi-Byte Characters\n\nThis validates that a string value contains one or more multibyte characters.\nNOTE: if the string is blank, this validates as true.\n\n\tUsage: multibyte\n\n# Data URL\n\nThis validates that a string value contains a valid DataURI.\nNOTE: this will also validate that the data portion is valid base64\n\n\tUsage: datauri\n\n# Latitude\n\nThis validates that a string value contains a valid latitude.\n\n\tUsage: latitude\n\n# Longitude\n\nThis validates that a string value contains a valid longitude.\n\n\tUsage: longitude\n\n# Employer Identification Number EIN\n\nThis validates that a string value contains a valid U.S. Employer Identification Number.\n\n\tUsage: ein\n\n# Social Security Number SSN\n\nThis validates that a string value contains a valid U.S. Social Security Number.\n\n\tUsage: ssn\n\n# Internet Protocol Address IP\n\nThis validates that a string value contains a valid IP Address.\n\n\tUsage: ip\n\n# Internet Protocol Address IPv4\n\nThis validates that a string value contains a valid v4 IP Address.\n\n\tUsage: ipv4\n\n# Internet Protocol Address IPv6\n\nThis validates that a string value contains a valid v6 IP Address.\n\n\tUsage: ipv6\n\n# Classless Inter-Domain Routing CIDR\n\nThis validates that a string value contains a valid CIDR Address.\n\n\tUsage: cidr\n\n# Classless Inter-Domain Routing CIDRv4\n\nThis validates that a string value contains a valid v4 CIDR Address.\n\n\tUsage: cidrv4\n\n# Classless Inter-Domain Routing CIDRv6\n\nThis validates that a string value contains a valid v6 CIDR Address.\n\n\tUsage: cidrv6\n\n# Transmission Control Protocol Address TCP\n\nThis validates that a string value contains a valid resolvable TCP Address.\n\n\tUsage: tcp_addr\n\n# Transmission Control Protocol Address TCPv4\n\nThis validates that a string value contains a valid resolvable v4 TCP Address.\n\n\tUsage: tcp4_addr\n\n# Transmission Control Protocol Address TCPv6\n\nThis validates that a string value contains a valid resolvable v6 TCP Address.\n\n\tUsage: tcp6_addr\n\n# User Datagram Protocol Address UDP\n\nThis validates that a string value contains a valid resolvable UDP Address.\n\n\tUsage: udp_addr\n\n# User Datagram Protocol Address UDPv4\n\nThis validates that a string value contains a valid resolvable v4 UDP Address.\n\n\tUsage: udp4_addr\n\n# User Datagram Protocol Address UDPv6\n\nThis validates that a string value contains a valid resolvable v6 UDP Address.\n\n\tUsage: udp6_addr\n\n# Internet Protocol Address IP\n\nThis validates that a string value contains a valid resolvable IP Address.\n\n\tUsage: ip_addr\n\n# Internet Protocol Address IPv4\n\nThis validates that a string value contains a valid resolvable v4 IP Address.\n\n\tUsage: ip4_addr\n\n# Internet Protocol Address IPv6\n\nThis validates that a string value contains a valid resolvable v6 IP Address.\n\n\tUsage: ip6_addr\n\n# Unix domain socket end point Address\n\nThis validates that a string value contains a valid Unix Address.\n\n\tUsage: unix_addr\n\n# Unix Domain Socket Exists\n\nThis validates that a Unix domain socket file exists at the specified path.\nIt checks both filesystem-based sockets and Linux abstract sockets (prefixed with @).\nFor filesystem sockets, it verifies the path exists and is a socket file.\nFor abstract sockets on Linux, it checks /proc/net/unix.\n\n\tUsage: uds_exists\n\n# Media Access Control Address MAC\n\nThis validates that a string value contains a valid MAC Address.\n\n\tUsage: mac\n\nNote: See Go's ParseMAC for accepted formats and types:\n\n\thttp://golang.org/src/net/mac.go?s=866:918#L29\n\n# Hostname RFC 952\n\nThis validates that a string value is a valid Hostname according to RFC 952 https://tools.ietf.org/html/rfc952\n\n\tUsage: hostname\n\n# Hostname RFC 1123\n\nThis validates that a string value is a valid Hostname according to RFC 1123 https://tools.ietf.org/html/rfc1123\n\n\tUsage: hostname_rfc1123 or if you want to continue to use 'hostname' in your tags, create an alias.\n\nFull Qualified Domain Name (FQDN)\n\nThis validates that a string value contains a valid FQDN.\n\n\tUsage: fqdn\n\n# HTML Tags\n\nThis validates that a string value appears to be an HTML element tag\nincluding those described at https://developer.mozilla.org/en-US/docs/Web/HTML/Element\n\n\tUsage: html\n\n# HTML Encoded\n\nThis validates that a string value is a proper character reference in decimal\nor hexadecimal format\n\n\tUsage: html_encoded\n\n# URL Encoded\n\nThis validates that a string value is percent-encoded (URL encoded) according\nto https://tools.ietf.org/html/rfc3986#section-2.1\n\n\tUsage: url_encoded\n\n# Directory\n\nThis validates that a string value contains a valid directory and that\nit exists on the machine.\nThis is done using os.Stat, which is a platform independent function.\n\n\tUsage: dir\n\n# Directory Path\n\nThis validates that a string value contains a valid directory but does\nnot validate the existence of that directory.\nThis is done using os.Stat, which is a platform independent function.\nIt is safest to suffix the string with os.PathSeparator if the directory\nmay not exist at the time of validation.\n\n\tUsage: dirpath\n\n# HostPort\n\nThis validates that a string value contains a valid DNS hostname and port that\ncan be used to validate fields typically passed to sockets and connections.\n\n\tUsage: hostname_port\n\n# Port\n\nThis validates that the value falls within the valid port number range of 1 to 65,535.\n\n\tUsage: port\n\n# Datetime\n\nThis validates that a string value is a valid datetime based on the supplied datetime format.\nSupplied format must match the official Go time format layout as documented in https://golang.org/pkg/time/\n\n\tUsage: datetime=2006-01-02\n\n# Iso3166-1 alpha-2\n\nThis validates that a string value is a valid country code based on iso3166-1 alpha-2 standard.\nsee: https://www.iso.org/iso-3166-country-codes.html\n\n\tUsage: iso3166_1_alpha2\n\n# Iso3166-1 alpha-3\n\nThis validates that a string value is a valid country code based on iso3166-1 alpha-3 standard.\nsee: https://www.iso.org/iso-3166-country-codes.html\n\n\tUsage: iso3166_1_alpha3\n\n# Iso3166-1 alpha-numeric\n\nThis validates that a string value is a valid country code based on iso3166-1 alpha-numeric standard.\nsee: https://www.iso.org/iso-3166-country-codes.html\n\n\tUsage: iso3166_1_alpha3\n\n# BCP 47 Language Tag\n\nThis validates that a string value is a valid BCP 47 language tag, as parsed by language.Parse.\nMore information on https://pkg.go.dev/golang.org/x/text/language\n\n\tUsage: bcp47_language_tag\n\nBIC (SWIFT code - 2022 standard)\n\nThis validates that a string value is a valid Business Identifier Code (SWIFT code), defined in ISO 9362:2022.\nMore information on https://www.iso.org/standard/84108.html\n\n\tUsage: bic\n\nBIC (SWIFT code - 2014 standard)\n\nThis validates that a string value is a valid Business Identifier Code (SWIFT code), defined in ISO 9362:2014.\nMore information on https://www.iso.org/standard/60390.html\n\n\tUsage: bic_iso_9362_2014\n\n# RFC 1035 label\n\nThis validates that a string value is a valid dns RFC 1035 label, defined in RFC 1035.\nMore information on https://datatracker.ietf.org/doc/html/rfc1035\n\n\tUsage: dns_rfc1035_label\n\n# TimeZone\n\nThis validates that a string value is a valid time zone based on the time zone database present on the system.\nAlthough empty value and Local value are allowed by time.LoadLocation golang function, they are not allowed by this validator.\nMore information on https://golang.org/pkg/time/#LoadLocation\n\n\tUsage: timezone\n\n# Semantic Version\n\nThis validates that a string value is a valid semver version, defined in Semantic Versioning 2.0.0.\nMore information on https://semver.org/\n\n\tUsage: semver\n\n# CVE Identifier\n\nThis validates that a string value is a valid cve id, defined in cve mitre.\nMore information on https://cve.mitre.org/\n\n\tUsage: cve\n\n# Credit Card\n\nThis validates that a string value contains a valid credit card number using Luhn algorithm.\n\n\tUsage: credit_card\n\n# Luhn Checksum\n\n\tUsage: luhn_checksum\n\nThis validates that a string or (u)int value contains a valid checksum using the Luhn algorithm.\n\n# MongoDB\n\nThis validates that a string is a valid 24 character hexadecimal string or valid connection string.\n\n\tUsage: mongodb\n\t       mongodb_connection_string\n\nExample:\n\n\ttype Test struct {\n\t\tObjectIdField         string `validate:\"mongodb\"`\n\t\tConnectionStringField string `validate:\"mongodb_connection_string\"`\n\t}\n\n# Cron\n\nThis validates that a string value contains a valid cron expression.\n\n\tUsage: cron\n\n# SpiceDb ObjectID/Permission/Object Type\n\nThis 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.\n\n\tUsage: spicedb=id|permission|type\n\n# Alias Validators and Tags\n\nAlias Validators and Tags\nNOTE: When returning an error, the tag returned in \"FieldError\" will be\nthe alias tag unless the dive tag is part of the alias. Everything after the\ndive tag is not reported as the alias tag. Also, the \"ActualTag\" in the before\ncase will be the actual tag within the alias that failed.\n\nHere is a list of the current built in alias tags:\n\n\t\"iscolor\"\n\t\talias is \"hexcolor|rgb|rgba|hsl|hsla\" (Usage: iscolor)\n\t\"country_code\"\n\t\talias is \"iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric\" (Usage: country_code)\n\nValidator notes:\n\n\tregex\n\t\ta regex validator won't be added because commas and = signs can be part\n\t\tof a regex which conflict with the validation definitions. Although\n\t\tworkarounds can be made, they take away from using pure regex's.\n\t\tFurthermore it's quick and dirty but the regex's become harder to\n\t\tmaintain and are not reusable, so it's as much a programming philosophy\n\t\tas anything.\n\n\t\tIn place of this new validator functions should be created; a regex can\n\t\tbe used within the validator function and even be precompiled for better\n\t\tefficiency within regexes.go.\n\n\t\tAnd the best reason, you can submit a pull request and we can keep on\n\t\tadding to the validation library of this package!\n\n# Non standard validators\n\nA collection of validation rules that are frequently needed but are more\ncomplex than the ones found in the baked in validators.\nA non standard validator must be registered manually like you would\nwith your own custom validation functions.\n\nExample of registration and use:\n\n\ttype Test struct {\n\t\tTestField string `validate:\"yourtag\"`\n\t}\n\n\tt := &Test{\n\t\tTestField: \"Test\"\n\t}\n\n\tvalidate := validator.New()\n\tvalidate.RegisterValidation(\"yourtag\", validators.NotBlank)\n\nHere is a list of the current non standard validators:\n\n\tNotBlank\n\t\tThis validates that the value is not blank or with length zero.\n\t\tFor strings ensures they do not contain only spaces. For channels, maps, slices and arrays\n\t\tensures they don't have zero length. For others, a non empty value is required.\n\n\t\tUsage: notblank\n\n# Panics\n\nThis package panics when bad input is provided, this is by design, bad code like\nthat should not make it to production.\n\n\ttype Test struct {\n\t\tTestField string `validate:\"nonexistentfunction=1\"`\n\t}\n\n\tt := &Test{\n\t\tTestField: \"Test\"\n\t}\n\n\tvalidate.Struct(t) // this will panic\n*/\npackage validator\n"
  },
  {
    "path": "errors.go",
    "content": "package validator\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\n\tut \"github.com/go-playground/universal-translator\"\n)\n\nconst (\n\tfieldErrMsg = \"Key: '%s' Error:Field validation for '%s' failed on the '%s' tag\"\n)\n\n// ValidationErrorsTranslations is the translation return type\ntype ValidationErrorsTranslations map[string]string\n\n// InvalidValidationError describes an invalid argument passed to\n// `Struct`, `StructExcept`, StructPartial` or `Field`\ntype InvalidValidationError struct {\n\tType reflect.Type\n}\n\n// Error returns InvalidValidationError message\nfunc (e *InvalidValidationError) Error() string {\n\tif e.Type == nil {\n\t\treturn \"validator: (nil)\"\n\t}\n\n\treturn \"validator: (nil \" + e.Type.String() + \")\"\n}\n\n// ValidationErrors is an array of FieldError's\n// for use in custom error messages post validation.\ntype ValidationErrors []FieldError\n\n// Error is intended for use in development + debugging and not intended to be a production error message.\n// It allows ValidationErrors to subscribe to the Error interface.\n// All information to create an error message specific to your application is contained within\n// the FieldError found within the ValidationErrors array\nfunc (ve ValidationErrors) Error() string {\n\tbuff := bytes.NewBufferString(\"\")\n\n\tfor i := 0; i < len(ve); i++ {\n\t\tbuff.WriteString(ve[i].Error())\n\t\tbuff.WriteString(\"\\n\")\n\t}\n\n\treturn strings.TrimSpace(buff.String())\n}\n\n// Translate translates all of the ValidationErrors\nfunc (ve ValidationErrors) Translate(ut ut.Translator) ValidationErrorsTranslations {\n\ttrans := make(ValidationErrorsTranslations)\n\n\tvar fe *fieldError\n\n\tfor i := 0; i < len(ve); i++ {\n\t\tfe = ve[i].(*fieldError)\n\n\t\t// // in case an Anonymous struct was used, ensure that the key\n\t\t// // would be 'Username' instead of \".Username\"\n\t\t// if len(fe.ns) > 0 && fe.ns[:1] == \".\" {\n\t\t// \ttrans[fe.ns[1:]] = fe.Translate(ut)\n\t\t// \tcontinue\n\t\t// }\n\n\t\ttrans[fe.ns] = fe.Translate(ut)\n\t}\n\n\treturn trans\n}\n\n// FieldError contains all functions to get error details\ntype FieldError interface {\n\n\t// Tag returns the validation tag that failed. if the\n\t// validation was an alias, this will return the\n\t// alias name and not the underlying tag that failed.\n\t//\n\t// eg. alias \"iscolor\": \"hexcolor|rgb|rgba|hsl|hsla\"\n\t// will return \"iscolor\"\n\tTag() string\n\n\t// ActualTag returns the validation tag that failed, even if an\n\t// alias the actual tag within the alias will be returned.\n\t// If an 'or' validation fails the entire or will be returned.\n\t//\n\t// eg. alias \"iscolor\": \"hexcolor|rgb|rgba|hsl|hsla\"\n\t// will return \"hexcolor|rgb|rgba|hsl|hsla\"\n\tActualTag() string\n\n\t// Namespace returns the namespace for the field error, with the tag\n\t// name taking precedence over the field's actual name.\n\t//\n\t// eg. JSON name \"User.fname\"\n\t//\n\t// See StructNamespace() for a version that returns actual names.\n\t//\n\t// NOTE: this field can be blank when validating a single primitive field\n\t// using validate.Field(...) as there is no way to extract it's name\n\tNamespace() string\n\n\t// StructNamespace returns the namespace for the field error, with the field's\n\t// actual name.\n\t//\n\t// eg. \"User.FirstName\" see Namespace for comparison\n\t//\n\t// NOTE: this field can be blank when validating a single primitive field\n\t// using validate.Field(...) as there is no way to extract its name\n\tStructNamespace() string\n\n\t// Field returns the field's name with the tag name taking precedence over the\n\t// field's actual name.\n\t//\n\t// `RegisterTagNameFunc` must be registered to get tag value.\n\t//\n\t// eg. JSON name \"fname\"\n\t// see StructField for comparison\n\tField() string\n\n\t// StructField returns the field's actual name from the struct, when able to determine.\n\t//\n\t// eg.  \"FirstName\"\n\t// see Field for comparison\n\tStructField() string\n\n\t// Value returns the actual field's value in case needed for creating the error\n\t// message\n\tValue() interface{}\n\n\t// Param returns the param value, in string form for comparison; this will also\n\t// help with generating an error message\n\tParam() string\n\n\t// Kind returns the Field's reflect Kind\n\t//\n\t// eg. time.Time's kind is a struct\n\tKind() reflect.Kind\n\n\t// Type returns the Field's reflect Type\n\t//\n\t// eg. time.Time's type is time.Time\n\tType() reflect.Type\n\n\t// Translate returns the FieldError's translated error\n\t// from the provided 'ut.Translator' and registered 'TranslationFunc'\n\t//\n\t// NOTE: if no registered translator can be found it returns the same as\n\t// calling fe.Error()\n\tTranslate(ut ut.Translator) string\n\n\t// Error returns the FieldError's message\n\tError() string\n}\n\n// compile time interface checks\nvar _ FieldError = new(fieldError)\nvar _ error = new(fieldError)\n\n// fieldError contains a single field's validation error along\n// with other properties that may be needed for error message creation\n// it complies with the FieldError interface\ntype fieldError struct {\n\tv              *Validate\n\ttag            string\n\tactualTag      string\n\tns             string\n\tstructNs       string\n\tfieldLen       uint8\n\tstructfieldLen uint8\n\tvalue          interface{}\n\tparam          string\n\tkind           reflect.Kind\n\ttyp            reflect.Type\n}\n\n// Tag returns the validation tag that failed.\nfunc (fe *fieldError) Tag() string {\n\treturn fe.tag\n}\n\n// ActualTag returns the validation tag that failed, even if an\n// alias the actual tag within the alias will be returned.\nfunc (fe *fieldError) ActualTag() string {\n\treturn fe.actualTag\n}\n\n// Namespace returns the namespace for the field error, with the tag\n// name taking precedence over the field's actual name.\nfunc (fe *fieldError) Namespace() string {\n\treturn fe.ns\n}\n\n// StructNamespace returns the namespace for the field error, with the field's\n// actual name.\nfunc (fe *fieldError) StructNamespace() string {\n\treturn fe.structNs\n}\n\n// Field returns the field's name with the tag name taking precedence over the\n// field's actual name.\nfunc (fe *fieldError) Field() string {\n\treturn fe.ns[len(fe.ns)-int(fe.fieldLen):]\n\t// // return fe.field\n\t// fld := fe.ns[len(fe.ns)-int(fe.fieldLen):]\n\n\t// log.Println(\"FLD:\", fld)\n\n\t// if len(fld) > 0 && fld[:1] == \".\" {\n\t// \treturn fld[1:]\n\t// }\n\n\t// return fld\n}\n\n// StructField returns the field's actual name from the struct, when able to determine.\nfunc (fe *fieldError) StructField() string {\n\t// return fe.structField\n\treturn fe.structNs[len(fe.structNs)-int(fe.structfieldLen):]\n}\n\n// Value returns the actual field's value in case needed for creating the error\n// message\nfunc (fe *fieldError) Value() interface{} {\n\treturn fe.value\n}\n\n// Param returns the param value, in string form for comparison; this will\n// also help with generating an error message\nfunc (fe *fieldError) Param() string {\n\treturn fe.param\n}\n\n// Kind returns the Field's reflect Kind\nfunc (fe *fieldError) Kind() reflect.Kind {\n\treturn fe.kind\n}\n\n// Type returns the Field's reflect Type\nfunc (fe *fieldError) Type() reflect.Type {\n\treturn fe.typ\n}\n\n// Error returns the fieldError's error message\nfunc (fe *fieldError) Error() string {\n\treturn fmt.Sprintf(fieldErrMsg, fe.ns, fe.Field(), fe.tag)\n}\n\n// Translate returns the FieldError's translated error\n// from the provided 'ut.Translator' and registered 'TranslationFunc'\n//\n// NOTE: if no registered translation can be found, it returns the original\n// untranslated error message.\nfunc (fe *fieldError) Translate(ut ut.Translator) string {\n\tvar fn TranslationFunc\n\n\tm, ok := fe.v.transTagFunc[ut]\n\tif !ok {\n\t\treturn fe.Error()\n\t}\n\n\tfn, ok = m[fe.tag]\n\tif !ok {\n\t\tfn, ok = m[fe.actualTag]\n\t\tif !ok {\n\t\t\treturn fe.Error()\n\t\t}\n\t}\n\n\treturn fn(ut, fe)\n}\n"
  },
  {
    "path": "field_level.go",
    "content": "package validator\n\nimport \"reflect\"\n\n// FieldLevel contains all the information and helper functions\n// to validate a field\ntype FieldLevel interface {\n\n\t// Top returns the top level struct, if any\n\tTop() reflect.Value\n\n\t// Parent returns the current fields parent struct, if any or\n\t// the comparison value if called 'VarWithValue'\n\tParent() reflect.Value\n\n\t// Field returns current field for validation\n\tField() reflect.Value\n\n\t// FieldName returns the field's name with the tag\n\t// name taking precedence over the fields actual name.\n\tFieldName() string\n\n\t// StructFieldName returns the struct field's name\n\tStructFieldName() string\n\n\t// Param returns param for validation against current field\n\tParam() string\n\n\t// GetTag returns the current validations tag name\n\tGetTag() string\n\n\t// ExtractType gets the actual underlying type of field value.\n\t// It will dive into pointers, customTypes and return you the\n\t// underlying value and it's kind.\n\tExtractType(field reflect.Value) (value reflect.Value, kind reflect.Kind, nullable bool)\n\n\t// GetStructFieldOK traverses the parent struct to retrieve a specific field denoted by the provided namespace\n\t// in the param and returns the field, field kind and whether is was successful in retrieving\n\t// the field at all.\n\t//\n\t// NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field\n\t// could not be retrieved because it didn't exist.\n\t//\n\t// Deprecated: Use GetStructFieldOK2() instead which also return if the value is nullable.\n\tGetStructFieldOK() (reflect.Value, reflect.Kind, bool)\n\n\t// GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for\n\t// the field and namespace allowing more extensibility for validators.\n\t//\n\t// Deprecated: Use GetStructFieldOKAdvanced2() instead which also return if the value is nullable.\n\tGetStructFieldOKAdvanced(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool)\n\n\t// GetStructFieldOK2 traverses the parent struct to retrieve a specific field denoted by the provided namespace\n\t// in the param and returns the field, field kind, if it's a nullable type and whether is was successful in retrieving\n\t// the field at all.\n\t//\n\t// NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field\n\t// could not be retrieved because it didn't exist.\n\tGetStructFieldOK2() (reflect.Value, reflect.Kind, bool, bool)\n\n\t// GetStructFieldOKAdvanced2 is the same as GetStructFieldOK except that it accepts the parent struct to start looking for\n\t// the field and namespace allowing more extensibility for validators.\n\tGetStructFieldOKAdvanced2(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool, bool)\n}\n\nvar _ FieldLevel = new(validate)\n\n// Field returns current field for validation\nfunc (v *validate) Field() reflect.Value {\n\treturn v.flField\n}\n\n// FieldName returns the field's name with the tag\n// name taking precedence over the fields actual name.\nfunc (v *validate) FieldName() string {\n\treturn v.cf.altName\n}\n\n// GetTag returns the current validations tag name\nfunc (v *validate) GetTag() string {\n\treturn v.ct.tag\n}\n\n// StructFieldName returns the struct field's name\nfunc (v *validate) StructFieldName() string {\n\treturn v.cf.name\n}\n\n// Param returns param for validation against current field\nfunc (v *validate) Param() string {\n\treturn v.ct.param\n}\n\n// GetStructFieldOK returns Param returns param for validation against current field\n//\n// Deprecated: Use GetStructFieldOK2() instead which also return if the value is nullable.\nfunc (v *validate) GetStructFieldOK() (reflect.Value, reflect.Kind, bool) {\n\tcurrent, kind, _, found := v.getStructFieldOKInternal(v.slflParent, v.ct.param)\n\treturn current, kind, found\n}\n\n// GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for\n// the field and namespace allowing more extensibility for validators.\n//\n// Deprecated: Use GetStructFieldOKAdvanced2() instead which also return if the value is nullable.\nfunc (v *validate) GetStructFieldOKAdvanced(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool) {\n\tcurrent, kind, _, found := v.GetStructFieldOKAdvanced2(val, namespace)\n\treturn current, kind, found\n}\n\n// GetStructFieldOK2 returns Param returns param for validation against current field\nfunc (v *validate) GetStructFieldOK2() (reflect.Value, reflect.Kind, bool, bool) {\n\treturn v.getStructFieldOKInternal(v.slflParent, v.ct.param)\n}\n\n// GetStructFieldOKAdvanced2 is the same as GetStructFieldOK except that it accepts the parent struct to start looking for\n// the field and namespace allowing more extensibility for validators.\nfunc (v *validate) GetStructFieldOKAdvanced2(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool, bool) {\n\treturn v.getStructFieldOKInternal(val, namespace)\n}\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/go-playground/validator/v10\n\ngo 1.25.0\n\nrequire (\n\tgithub.com/gabriel-vasile/mimetype v1.4.13\n\tgithub.com/go-playground/assert/v2 v2.2.0\n\tgithub.com/go-playground/locales v0.14.1\n\tgithub.com/go-playground/universal-translator v0.18.1\n\tgithub.com/leodido/go-urn v1.4.0\n\tgolang.org/x/crypto v0.49.0\n\tgolang.org/x/text v0.35.0\n)\n\nrequire golang.org/x/sys v0.42.0 // indirect\n"
  },
  {
    "path": "go.sum",
    "content": "github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM=\ngithub.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=\ngithub.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=\ngithub.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=\ngithub.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=\ngithub.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=\ngithub.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=\ngithub.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=\ngithub.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=\ngithub.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngolang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4=\ngolang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=\ngolang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=\ngolang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=\ngolang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=\ngolang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "non-standard/validators/notblank.go",
    "content": "package validators\n\nimport (\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// NotBlank is the validation function for validating if the current field\n// has a value or length greater than zero, or is not a space only string.\nfunc NotBlank(fl validator.FieldLevel) bool {\n\tfield := fl.Field()\n\n\tswitch field.Kind() {\n\tcase reflect.String:\n\t\treturn len(strings.Trim(strings.TrimSpace(field.String()), \"\\x1c\\x1d\\x1e\\x1f\")) > 0\n\tcase reflect.Chan, reflect.Map, reflect.Slice, reflect.Array:\n\t\treturn field.Len() > 0\n\tcase reflect.Ptr, reflect.Interface, reflect.Func:\n\t\treturn !field.IsNil()\n\tdefault:\n\t\treturn field.IsValid() && field.Interface() != reflect.Zero(field.Type()).Interface()\n\t}\n}\n"
  },
  {
    "path": "non-standard/validators/notblank_test.go",
    "content": "package validators\n\nimport (\n\t\"testing\"\n\n\t\"github.com/go-playground/assert/v2\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\ntype test struct {\n\tString    string      `validate:\"notblank\"`\n\tArray     []int       `validate:\"notblank\"`\n\tPointer   *int        `validate:\"notblank\"`\n\tNumber    int         `validate:\"notblank\"`\n\tInterface interface{} `validate:\"notblank\"`\n\tFunc      func()      `validate:\"notblank\"`\n}\n\nfunc TestNotBlank(t *testing.T) {\n\tv := validator.New()\n\terr := v.RegisterValidation(\"notblank\", NotBlank)\n\tassert.Equal(t, nil, err)\n\n\t// Errors\n\tvar x *int\n\tinvalid := test{\n\t\tString:    \" \\x1c\\x1d\\x1e\\x1f\\r\\n\",\n\t\tArray:     []int{},\n\t\tPointer:   x,\n\t\tNumber:    0,\n\t\tInterface: nil,\n\t\tFunc:      nil,\n\t}\n\tfieldsWithError := []string{\n\t\t\"String\",\n\t\t\"Array\",\n\t\t\"Pointer\",\n\t\t\"Number\",\n\t\t\"Interface\",\n\t\t\"Func\",\n\t}\n\n\terrors := v.Struct(invalid).(validator.ValidationErrors)\n\tvar fields []string\n\tfor _, err := range errors {\n\t\tfields = append(fields, err.Field())\n\t}\n\n\tassert.Equal(t, fieldsWithError, fields)\n\n\t// No errors\n\ty := 1\n\tx = &y\n\tvalid := test{\n\t\tString:    \"str\",\n\t\tArray:     []int{1},\n\t\tPointer:   x,\n\t\tNumber:    1,\n\t\tInterface: \"value\",\n\t\tFunc:      func() {},\n\t}\n\n\terr = v.Struct(valid)\n\tassert.Equal(t, nil, err)\n}\n"
  },
  {
    "path": "options.go",
    "content": "package validator\n\n// Option represents a configurations option to be applied to validator during initialization.\ntype Option func(*Validate)\n\n// WithRequiredStructEnabled enables required tag on non-pointer structs to be applied instead of ignored.\n//\n// This was made opt-in behaviour in order to maintain backward compatibility with the behaviour previous\n// to being able to apply struct level validations on struct fields directly.\n//\n// It is recommended you enabled this as it will be the default behaviour in v11+\nfunc WithRequiredStructEnabled() Option {\n\treturn func(v *Validate) {\n\t\tv.requiredStructEnabled = true\n\t}\n}\n\n// WithPrivateFieldValidation activates validation for unexported fields via the use of the `unsafe` package.\n//\n// By opting into this feature you are acknowledging that you are aware of the risks and accept any current or future\n// consequences of using this feature.\nfunc WithPrivateFieldValidation() Option {\n\treturn func(v *Validate) {\n\t\tv.privateFieldValidation = true\n\t}\n}\n"
  },
  {
    "path": "postcode_regexes.go",
    "content": "package validator\n\nimport (\n\t\"regexp\"\n\t\"sync\"\n)\n\nvar postCodePatternDict = map[string]string{\n\t\"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}$`,\n\t\"JE\": `^JE\\d[\\dA-Z]?[ ]?\\d[ABD-HJLN-UW-Z]{2}$`,\n\t\"GG\": `^GY\\d[\\dA-Z]?[ ]?\\d[ABD-HJLN-UW-Z]{2}$`,\n\t\"IM\": `^IM\\d[\\dA-Z]?[ ]?\\d[ABD-HJLN-UW-Z]{2}$`,\n\t\"US\": `^\\d{5}([ \\-]\\d{4})?$`,\n\t\"CA\": `^[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z][ ]?\\d[ABCEGHJ-NPRSTV-Z]\\d$`,\n\t\"DE\": `^\\d{5}$`,\n\t\"JP\": `^\\d{3}-\\d{4}$`,\n\t\"FR\": `^\\d{2}[ ]?\\d{3}$`,\n\t\"AU\": `^\\d{4}$`,\n\t\"IT\": `^\\d{5}$`,\n\t\"CH\": `^\\d{4}$`,\n\t\"AT\": `^\\d{4}$`,\n\t\"ES\": `^\\d{5}$`,\n\t\"NL\": `^\\d{4}[ ]?[A-Z]{2}$`,\n\t\"BE\": `^\\d{4}$`,\n\t\"DK\": `^\\d{4}$`,\n\t\"SE\": `^\\d{3}[ ]?\\d{2}$`,\n\t\"NO\": `^\\d{4}$`,\n\t\"BR\": `^\\d{5}[\\-]?\\d{3}$`,\n\t\"PT\": `^\\d{4}([\\-]\\d{3})?$`,\n\t\"FI\": `^\\d{5}$`,\n\t\"AX\": `^22\\d{3}$`,\n\t\"KR\": `^\\d{3}[\\-]\\d{3}$`,\n\t\"CN\": `^\\d{6}$`,\n\t\"TW\": `^\\d{3}(\\d{2})?$`,\n\t\"SG\": `^\\d{6}$`,\n\t\"DZ\": `^\\d{5}$`,\n\t\"AD\": `^AD\\d{3}$`,\n\t\"AR\": `^([A-HJ-NP-Z])?\\d{4}([A-Z]{3})?$`,\n\t\"AM\": `^(37)?\\d{4}$`,\n\t\"AZ\": `^\\d{4}$`,\n\t\"BH\": `^((1[0-2]|[2-9])\\d{2})?$`,\n\t\"BD\": `^\\d{4}$`,\n\t\"BB\": `^(BB\\d{5})?$`,\n\t\"BY\": `^\\d{6}$`,\n\t\"BM\": `^[A-Z]{2}[ ]?[A-Z0-9]{2}$`,\n\t\"BA\": `^\\d{5}$`,\n\t\"IO\": `^BBND 1ZZ$`,\n\t\"BN\": `^[A-Z]{2}[ ]?\\d{4}$`,\n\t\"BG\": `^\\d{4}$`,\n\t\"KH\": `^\\d{5}$`,\n\t\"CV\": `^\\d{4}$`,\n\t\"CL\": `^\\d{7}$`,\n\t\"CR\": `^\\d{4,5}|\\d{3}-\\d{4}$`,\n\t\"HR\": `^\\d{5}$`,\n\t\"CY\": `^\\d{4}$`,\n\t\"CZ\": `^\\d{3}[ ]?\\d{2}$`,\n\t\"DO\": `^\\d{5}$`,\n\t\"EC\": `^([A-Z]\\d{4}[A-Z]|(?:[A-Z]{2})?\\d{6})?$`,\n\t\"EG\": `^\\d{5}$`,\n\t\"EE\": `^\\d{5}$`,\n\t\"FO\": `^\\d{3}$`,\n\t\"GE\": `^\\d{4}$`,\n\t\"GR\": `^\\d{3}[ ]?\\d{2}$`,\n\t\"GL\": `^39\\d{2}$`,\n\t\"GT\": `^\\d{5}$`,\n\t\"HT\": `^\\d{4}$`,\n\t\"HN\": `^(?:\\d{5})?$`,\n\t\"HU\": `^\\d{4}$`,\n\t\"IS\": `^\\d{3}$`,\n\t\"IN\": `^\\d{6}$`,\n\t\"ID\": `^\\d{5}$`,\n\t\"IL\": `^\\d{5}$`,\n\t\"JO\": `^\\d{5}$`,\n\t\"KZ\": `^\\d{6}$`,\n\t\"KE\": `^\\d{5}$`,\n\t\"KW\": `^\\d{5}$`,\n\t\"LA\": `^\\d{5}$`,\n\t\"LV\": `^\\d{4}$`,\n\t\"LB\": `^(\\d{4}([ ]?\\d{4})?)?$`,\n\t\"LI\": `^(948[5-9])|(949[0-7])$`,\n\t\"LT\": `^\\d{5}$`,\n\t\"LU\": `^\\d{4}$`,\n\t\"MK\": `^\\d{4}$`,\n\t\"MY\": `^\\d{5}$`,\n\t\"MV\": `^\\d{5}$`,\n\t\"MT\": `^[A-Z]{3}[ ]?\\d{2,4}$`,\n\t\"MU\": `^(\\d{3}[A-Z]{2}\\d{3})?$`,\n\t\"MX\": `^\\d{5}$`,\n\t\"MD\": `^\\d{4}$`,\n\t\"MC\": `^980\\d{2}$`,\n\t\"MA\": `^\\d{5}$`,\n\t\"NP\": `^\\d{5}$`,\n\t\"NZ\": `^\\d{4}$`,\n\t\"NI\": `^((\\d{4}-)?\\d{3}-\\d{3}(-\\d{1})?)?$`,\n\t\"NG\": `^(\\d{6})?$`,\n\t\"OM\": `^(PC )?\\d{3}$`,\n\t\"PK\": `^\\d{5}$`,\n\t\"PY\": `^\\d{4}$`,\n\t\"PH\": `^\\d{4}$`,\n\t\"PL\": `^\\d{2}-\\d{3}$`,\n\t\"PR\": `^00[679]\\d{2}([ \\-]\\d{4})?$`,\n\t\"RO\": `^\\d{6}$`,\n\t\"RU\": `^\\d{6}$`,\n\t\"SM\": `^4789\\d$`,\n\t\"SA\": `^\\d{5}$`,\n\t\"SN\": `^\\d{5}$`,\n\t\"SK\": `^\\d{3}[ ]?\\d{2}$`,\n\t\"SI\": `^\\d{4}$`,\n\t\"ZA\": `^\\d{4}$`,\n\t\"LK\": `^\\d{5}$`,\n\t\"TJ\": `^\\d{6}$`,\n\t\"TH\": `^\\d{5}$`,\n\t\"TN\": `^\\d{4}$`,\n\t\"TR\": `^\\d{5}$`,\n\t\"TM\": `^\\d{6}$`,\n\t\"UA\": `^\\d{5}$`,\n\t\"UY\": `^\\d{5}$`,\n\t\"UZ\": `^\\d{6}$`,\n\t\"VA\": `^00120$`,\n\t\"VE\": `^\\d{4}$`,\n\t\"ZM\": `^\\d{5}$`,\n\t\"AS\": `^96799$`,\n\t\"CC\": `^6799$`,\n\t\"CK\": `^\\d{4}$`,\n\t\"RS\": `^\\d{6}$`,\n\t\"ME\": `^8\\d{4}$`,\n\t\"CS\": `^\\d{5}$`,\n\t\"YU\": `^\\d{5}$`,\n\t\"CX\": `^6798$`,\n\t\"ET\": `^\\d{4}$`,\n\t\"FK\": `^FIQQ 1ZZ$`,\n\t\"NF\": `^2899$`,\n\t\"FM\": `^(9694[1-4])([ \\-]\\d{4})?$`,\n\t\"GF\": `^9[78]3\\d{2}$`,\n\t\"GN\": `^\\d{3}$`,\n\t\"GP\": `^9[78][01]\\d{2}$`,\n\t\"GS\": `^SIQQ 1ZZ$`,\n\t\"GU\": `^969[123]\\d([ \\-]\\d{4})?$`,\n\t\"GW\": `^\\d{4}$`,\n\t\"HM\": `^\\d{4}$`,\n\t\"IQ\": `^\\d{5}$`,\n\t\"KG\": `^\\d{6}$`,\n\t\"LR\": `^\\d{4}$`,\n\t\"LS\": `^\\d{3}$`,\n\t\"MG\": `^\\d{3}$`,\n\t\"MH\": `^969[67]\\d([ \\-]\\d{4})?$`,\n\t\"MN\": `^\\d{6}$`,\n\t\"MP\": `^9695[012]([ \\-]\\d{4})?$`,\n\t\"MQ\": `^9[78]2\\d{2}$`,\n\t\"NC\": `^988\\d{2}$`,\n\t\"NE\": `^\\d{4}$`,\n\t\"VI\": `^008(([0-4]\\d)|(5[01]))([ \\-]\\d{4})?$`,\n\t\"VN\": `^[0-9]{1,6}$`,\n\t\"PF\": `^987\\d{2}$`,\n\t\"PG\": `^\\d{3}$`,\n\t\"PM\": `^9[78]5\\d{2}$`,\n\t\"PN\": `^PCRN 1ZZ$`,\n\t\"PW\": `^96940$`,\n\t\"RE\": `^9[78]4\\d{2}$`,\n\t\"SH\": `^(ASCN|STHL) 1ZZ$`,\n\t\"SJ\": `^\\d{4}$`,\n\t\"SO\": `^\\d{5}$`,\n\t\"SZ\": `^[HLMS]\\d{3}$`,\n\t\"TC\": `^TKCA 1ZZ$`,\n\t\"WF\": `^986\\d{2}$`,\n\t\"XK\": `^\\d{5}$`,\n\t\"YT\": `^976\\d{2}$`,\n}\n\nvar (\n\tpostcodeRegexInit sync.Once\n\tpostCodeRegexDict = map[string]*regexp.Regexp{}\n)\n\nfunc initPostcodes() {\n\tfor countryCode, pattern := range postCodePatternDict {\n\t\tpostCodeRegexDict[countryCode] = regexp.MustCompile(pattern)\n\t}\n}\n"
  },
  {
    "path": "regexes.go",
    "content": "package validator\n\nimport (\n\t\"regexp\"\n\t\"sync\"\n)\n\nconst (\n\talphaRegexString                 = \"^[a-zA-Z]+$\"\n\talphaSpaceRegexString            = \"^[a-zA-Z ]+$\"\n\talphaNumericRegexString          = \"^[a-zA-Z0-9]+$\"\n\talphaNumericSpaceRegexString     = \"^[a-zA-Z0-9 ]+$\"\n\talphaUnicodeRegexString          = \"^[\\\\p{L}]+$\"\n\talphaUnicodeNumericRegexString   = \"^[\\\\p{L}\\\\p{N}]+$\"\n\tnumericRegexString               = \"^[-+]?[0-9]+(?:\\\\.[0-9]+)?$\"\n\tnumberRegexString                = \"^[0-9]+$\"\n\thexadecimalRegexString           = \"^(0[xX])?[0-9a-fA-F]+$\"\n\thexColorRegexString              = \"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$\"\n\trgbRegexString                   = \"^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*\\\\)$\"\n\trgbaRegexString                  = \"^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*\\\\)$\"\n\thslRegexString                   = \"^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*\\\\)$\"\n\thslaRegexString                  = \"^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*\\\\)$\"\n\tcmykRegexString                  = \"^cmyk\\\\((100|[1-9]?\\\\d)%\\\\s*,\\\\s*(100|[1-9]?\\\\d)%\\\\s*,\\\\s*(100|[1-9]?\\\\d)%\\\\s*,\\\\s*(100|[1-9]?\\\\d)%\\\\)$\"\n\temailRegexString                 = \"^(?:(?:(?:(?:[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}])))\\\\.?$\"\n\te164RegexString                  = \"^\\\\+?[1-9]\\\\d{7,14}$\"\n\tbase32RegexString                = \"^(?:[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})$\"\n\tbase64RegexString                = \"^(?:[A-Za-z0-9+\\\\/]{4})*(?:[A-Za-z0-9+\\\\/]{2}==|[A-Za-z0-9+\\\\/]{3}=|[A-Za-z0-9+\\\\/]{4})$\"\n\tbase64URLRegexString             = \"^(?:[A-Za-z0-9-_]{4})*(?:[A-Za-z0-9-_]{2}==|[A-Za-z0-9-_]{3}=|[A-Za-z0-9-_]{4})$\"\n\tbase64RawURLRegexString          = \"^(?:[A-Za-z0-9-_]{4})*(?:[A-Za-z0-9-_]{2,4})$\"\n\tiSBN10RegexString                = \"^(?:[0-9]{9}X|[0-9]{10})$\"\n\tiSBN13RegexString                = \"^(?:(?:97(?:8|9))[0-9]{10})$\"\n\tiSSNRegexString                  = \"^(?:[0-9]{4}-[0-9]{3}[0-9X])$\"\n\tuUID3RegexString                 = \"^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$\"\n\tuUID4RegexString                 = \"^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$\"\n\tuUID5RegexString                 = \"^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$\"\n\tuUIDRegexString                  = \"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$\"\n\tuUID3RFC4122RegexString          = \"^[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}$\"\n\tuUID4RFC4122RegexString          = \"^[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}$\"\n\tuUID5RFC4122RegexString          = \"^[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}$\"\n\tuUIDRFC4122RegexString           = \"^[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}$\"\n\tuLIDRegexString                  = \"^(?i)[A-HJKMNP-TV-Z0-9]{26}$\"\n\tmd4RegexString                   = \"^[0-9a-f]{32}$\"\n\tmd5RegexString                   = \"^[0-9a-f]{32}$\"\n\tsha256RegexString                = \"^[0-9a-f]{64}$\"\n\tsha384RegexString                = \"^[0-9a-f]{96}$\"\n\tsha512RegexString                = \"^[0-9a-f]{128}$\"\n\tripemd128RegexString             = \"^[0-9a-f]{32}$\"\n\tripemd160RegexString             = \"^[0-9a-f]{40}$\"\n\ttiger128RegexString              = \"^[0-9a-f]{32}$\"\n\ttiger160RegexString              = \"^[0-9a-f]{40}$\"\n\ttiger192RegexString              = \"^[0-9a-f]{48}$\"\n\taSCIIRegexString                 = \"^[\\x00-\\x7F]*$\"\n\tprintableASCIIRegexString        = \"^[\\x20-\\x7E]*$\"\n\tmultibyteRegexString             = \"[^\\x00-\\x7F]\"\n\tdataURIRegexString               = `^data:((?:\\w+\\/(?:([^;]|;[^;]).)+)?)`\n\tlatitudeRegexString              = \"^[-+]?([1-8]?\\\\d(\\\\.\\\\d+)?|90(\\\\.0+)?)$\"\n\tlongitudeRegexString             = \"^[-+]?(180(\\\\.0+)?|((1[0-7]\\\\d)|([1-9]?\\\\d))(\\\\.\\\\d+)?)$\"\n\tsSNRegexString                   = `^[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])$`\n\thostnameRegexStringRFC952        = `^[a-zA-Z]([a-zA-Z0-9\\-]+[\\.]?)*[a-zA-Z0-9]$`                                                                   // https://tools.ietf.org/html/rfc952\n\thostnameRegexStringRFC1123       = `^([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\n\tfqdnRegexStringRFC1123           = `^([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 '.')\n\tbtcAddressRegexString            = `^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$`                                                                             // bitcoin address\n\tbtcAddressUpperRegexStringBech32 = `^BC1[02-9AC-HJ-NP-Z]{7,76}$`                                                                                   // bitcoin bech32 address https://en.bitcoin.it/wiki/Bech32\n\tbtcAddressLowerRegexStringBech32 = `^bc1[02-9ac-hj-np-z]{7,76}$`                                                                                   // bitcoin bech32 address https://en.bitcoin.it/wiki/Bech32\n\tethAddressRegexString            = `^0x[0-9a-fA-F]{40}$`\n\tethAddressUpperRegexString       = `^0x[0-9A-F]{40}$`\n\tethAddressLowerRegexString       = `^0x[0-9a-f]{40}$`\n\tuRLEncodedRegexString            = `^(?:[^%]|%[0-9A-Fa-f]{2})*$`\n\thTMLEncodedRegexString           = `&#[x]?([0-9a-fA-F]{2})|(&gt)|(&lt)|(&quot)|(&amp)+[;]?`\n\thTMLRegexString                  = `<[/]?([a-zA-Z]+).*?>`\n\tjWTRegexString                   = \"^[A-Za-z0-9-_]+\\\\.[A-Za-z0-9-_]+\\\\.[A-Za-z0-9-_]*$\"\n\tsplitParamsRegexString           = `'[^']*'|\\S+`\n\tbic2014RegexString               = `^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$`\n\tbic2022RegexString               = `^[A-Z0-9]{4}[A-Z]{2}[A-Z0-9]{2}(?:[A-Z0-9]{3})?$`\n\tsemverRegexString                = `^(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/\n\tdnsRegexStringRFC1035Label       = \"^[a-z]([-a-z0-9]*[a-z0-9])?$\"\n\tcveRegexString                   = `^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\n\tmongodbIdRegexString             = \"^[a-f\\\\d]{24}$\"\n\tmongodbConnStringRegexString     = \"^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]+))?)*)?$\"\n\tcronRegexString                  = `(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (\\d+(ns|us|µs|ms|s|m|h))+)|((((\\d+,)+\\d+|((\\*|\\d+)(\\/|-)\\d+)|\\d+|\\*) ?){5,7})`\n\tspicedbIDRegexString             = `^(([a-zA-Z0-9/_|\\-=+]{1,})|\\*)$`\n\tspicedbPermissionRegexString     = \"^([a-z][a-z0-9_]{1,62}[a-z0-9])?$\"\n\tspicedbTypeRegexString           = \"^([a-z][a-z0-9_]{1,61}[a-z0-9]/)?[a-z][a-z0-9_]{1,62}[a-z0-9]$\"\n\teinRegexString                   = \"^(\\\\d{2}-\\\\d{7})$\"\n)\n\nfunc lazyRegexCompile(str string) func() *regexp.Regexp {\n\tvar regex *regexp.Regexp\n\tvar once sync.Once\n\treturn func() *regexp.Regexp {\n\t\tonce.Do(func() {\n\t\t\tregex = regexp.MustCompile(str)\n\t\t})\n\t\treturn regex\n\t}\n}\n\nvar (\n\talphaRegex                 = lazyRegexCompile(alphaRegexString)\n\talphaSpaceRegex            = lazyRegexCompile(alphaSpaceRegexString)\n\talphanNumericSpaceRegex    = lazyRegexCompile(alphaNumericSpaceRegexString)\n\talphaNumericRegex          = lazyRegexCompile(alphaNumericRegexString)\n\talphaUnicodeRegex          = lazyRegexCompile(alphaUnicodeRegexString)\n\talphaUnicodeNumericRegex   = lazyRegexCompile(alphaUnicodeNumericRegexString)\n\tnumericRegex               = lazyRegexCompile(numericRegexString)\n\tnumberRegex                = lazyRegexCompile(numberRegexString)\n\thexadecimalRegex           = lazyRegexCompile(hexadecimalRegexString)\n\thexColorRegex              = lazyRegexCompile(hexColorRegexString)\n\trgbRegex                   = lazyRegexCompile(rgbRegexString)\n\trgbaRegex                  = lazyRegexCompile(rgbaRegexString)\n\thslRegex                   = lazyRegexCompile(hslRegexString)\n\thslaRegex                  = lazyRegexCompile(hslaRegexString)\n\tcmykRegex                  = lazyRegexCompile(cmykRegexString)\n\te164Regex                  = lazyRegexCompile(e164RegexString)\n\temailRegex                 = lazyRegexCompile(emailRegexString)\n\tbase32Regex                = lazyRegexCompile(base32RegexString)\n\tbase64Regex                = lazyRegexCompile(base64RegexString)\n\tbase64URLRegex             = lazyRegexCompile(base64URLRegexString)\n\tbase64RawURLRegex          = lazyRegexCompile(base64RawURLRegexString)\n\tiSBN10Regex                = lazyRegexCompile(iSBN10RegexString)\n\tiSBN13Regex                = lazyRegexCompile(iSBN13RegexString)\n\tiSSNRegex                  = lazyRegexCompile(iSSNRegexString)\n\tuUID3Regex                 = lazyRegexCompile(uUID3RegexString)\n\tuUID4Regex                 = lazyRegexCompile(uUID4RegexString)\n\tuUID5Regex                 = lazyRegexCompile(uUID5RegexString)\n\tuUIDRegex                  = lazyRegexCompile(uUIDRegexString)\n\tuUID3RFC4122Regex          = lazyRegexCompile(uUID3RFC4122RegexString)\n\tuUID4RFC4122Regex          = lazyRegexCompile(uUID4RFC4122RegexString)\n\tuUID5RFC4122Regex          = lazyRegexCompile(uUID5RFC4122RegexString)\n\tuUIDRFC4122Regex           = lazyRegexCompile(uUIDRFC4122RegexString)\n\tuLIDRegex                  = lazyRegexCompile(uLIDRegexString)\n\tmd4Regex                   = lazyRegexCompile(md4RegexString)\n\tmd5Regex                   = lazyRegexCompile(md5RegexString)\n\tsha256Regex                = lazyRegexCompile(sha256RegexString)\n\tsha384Regex                = lazyRegexCompile(sha384RegexString)\n\tsha512Regex                = lazyRegexCompile(sha512RegexString)\n\tripemd128Regex             = lazyRegexCompile(ripemd128RegexString)\n\tripemd160Regex             = lazyRegexCompile(ripemd160RegexString)\n\ttiger128Regex              = lazyRegexCompile(tiger128RegexString)\n\ttiger160Regex              = lazyRegexCompile(tiger160RegexString)\n\ttiger192Regex              = lazyRegexCompile(tiger192RegexString)\n\taSCIIRegex                 = lazyRegexCompile(aSCIIRegexString)\n\tprintableASCIIRegex        = lazyRegexCompile(printableASCIIRegexString)\n\tmultibyteRegex             = lazyRegexCompile(multibyteRegexString)\n\tdataURIRegex               = lazyRegexCompile(dataURIRegexString)\n\tlatitudeRegex              = lazyRegexCompile(latitudeRegexString)\n\tlongitudeRegex             = lazyRegexCompile(longitudeRegexString)\n\tsSNRegex                   = lazyRegexCompile(sSNRegexString)\n\thostnameRegexRFC952        = lazyRegexCompile(hostnameRegexStringRFC952)\n\thostnameRegexRFC1123       = lazyRegexCompile(hostnameRegexStringRFC1123)\n\tfqdnRegexRFC1123           = lazyRegexCompile(fqdnRegexStringRFC1123)\n\tbtcAddressRegex            = lazyRegexCompile(btcAddressRegexString)\n\tbtcUpperAddressRegexBech32 = lazyRegexCompile(btcAddressUpperRegexStringBech32)\n\tbtcLowerAddressRegexBech32 = lazyRegexCompile(btcAddressLowerRegexStringBech32)\n\tethAddressRegex            = lazyRegexCompile(ethAddressRegexString)\n\tuRLEncodedRegex            = lazyRegexCompile(uRLEncodedRegexString)\n\thTMLEncodedRegex           = lazyRegexCompile(hTMLEncodedRegexString)\n\thTMLRegex                  = lazyRegexCompile(hTMLRegexString)\n\tjWTRegex                   = lazyRegexCompile(jWTRegexString)\n\tsplitParamsRegex           = lazyRegexCompile(splitParamsRegexString)\n\tbic2014Regex               = lazyRegexCompile(bic2014RegexString)\n\tbic2022Regex               = lazyRegexCompile(bic2022RegexString)\n\tsemverRegex                = lazyRegexCompile(semverRegexString)\n\tdnsRegexRFC1035Label       = lazyRegexCompile(dnsRegexStringRFC1035Label)\n\tcveRegex                   = lazyRegexCompile(cveRegexString)\n\tmongodbIdRegex             = lazyRegexCompile(mongodbIdRegexString)\n\tmongodbConnectionRegex     = lazyRegexCompile(mongodbConnStringRegexString)\n\tcronRegex                  = lazyRegexCompile(cronRegexString)\n\tspicedbIDRegex             = lazyRegexCompile(spicedbIDRegexString)\n\tspicedbPermissionRegex     = lazyRegexCompile(spicedbPermissionRegexString)\n\tspicedbTypeRegex           = lazyRegexCompile(spicedbTypeRegexString)\n\teinRegex                   = lazyRegexCompile(einRegexString)\n)\n"
  },
  {
    "path": "struct_level.go",
    "content": "package validator\n\nimport (\n\t\"context\"\n\t\"reflect\"\n)\n\n// StructLevelFunc accepts all values needed for struct level validation\ntype StructLevelFunc func(sl StructLevel)\n\n// StructLevelFuncCtx accepts all values needed for struct level validation\n// but also allows passing of contextual validation information via context.Context.\ntype StructLevelFuncCtx func(ctx context.Context, sl StructLevel)\n\n// wrapStructLevelFunc wraps normal StructLevelFunc makes it compatible with StructLevelFuncCtx\nfunc wrapStructLevelFunc(fn StructLevelFunc) StructLevelFuncCtx {\n\treturn func(ctx context.Context, sl StructLevel) {\n\t\tfn(sl)\n\t}\n}\n\n// StructLevel contains all the information and helper functions\n// to validate a struct\ntype StructLevel interface {\n\n\t// Validator returns the main validation object, in case one wants to call validations internally.\n\t// this is so you don't have to use anonymous functions to get access to the validate\n\t// instance.\n\tValidator() *Validate\n\n\t// Top returns the top level struct, if any\n\tTop() reflect.Value\n\n\t// Parent returns the current fields parent struct, if any\n\tParent() reflect.Value\n\n\t// Current returns the current struct.\n\tCurrent() reflect.Value\n\n\t// ExtractType gets the actual underlying type of field value.\n\t// It will dive into pointers, customTypes and return you the\n\t// underlying value and its kind.\n\tExtractType(field reflect.Value) (value reflect.Value, kind reflect.Kind, nullable bool)\n\n\t// ReportError reports an error just by passing the field and tag information\n\t//\n\t// NOTES:\n\t//\n\t// fieldName and structFieldName get appended to the existing\n\t// namespace that validator is on. e.g. pass 'FirstName' or\n\t// 'Names[0]' depending on the nesting\n\t//\n\t// tag can be an existing validation tag or just something you make up\n\t// and process on the flip side it's up to you.\n\tReportError(field interface{}, fieldName, structFieldName string, tag, param string)\n\n\t// ReportValidationErrors reports an error just by passing ValidationErrors\n\t//\n\t// NOTES:\n\t//\n\t// relativeNamespace and relativeActualNamespace get appended to the\n\t// existing namespace that validator is on.\n\t// e.g. pass 'User.FirstName' or 'Users[0].FirstName' depending\n\t// on the nesting. most of the time they will be blank, unless you validate\n\t// at a level lower the current field depth\n\tReportValidationErrors(relativeNamespace, relativeActualNamespace string, errs ValidationErrors)\n}\n\nvar _ StructLevel = new(validate)\n\n// Top returns the top level struct\n//\n// NOTE: this can be the same as the current struct being validated\n// if not is a nested struct.\n//\n// this is only called when within Struct and Field Level validation and\n// should not be relied upon for an accurate value otherwise.\nfunc (v *validate) Top() reflect.Value {\n\treturn v.top\n}\n\n// Parent returns the current structs parent\n//\n// NOTE: this can be the same as the current struct being validated\n// if not is a nested struct.\n//\n// this is only called when within Struct and Field Level validation and\n// should not be relied upon for an accurate value otherwise.\nfunc (v *validate) Parent() reflect.Value {\n\treturn v.slflParent\n}\n\n// Current returns the current struct.\nfunc (v *validate) Current() reflect.Value {\n\treturn v.slCurrent\n}\n\n// Validator returns the main validation object, in case one want to call validations internally.\nfunc (v *validate) Validator() *Validate {\n\treturn v.v\n}\n\n// ExtractType gets the actual underlying type of field value.\nfunc (v *validate) ExtractType(field reflect.Value) (reflect.Value, reflect.Kind, bool) {\n\treturn v.extractTypeInternal(field, false)\n}\n\n// ReportError reports an error just by passing the field and tag information\nfunc (v *validate) ReportError(field interface{}, fieldName, structFieldName, tag, param string) {\n\tfv, kind, _ := v.extractTypeInternal(reflect.ValueOf(field), false)\n\n\tif len(structFieldName) == 0 {\n\t\tstructFieldName = fieldName\n\t}\n\n\tv.str1 = string(append(v.ns, fieldName...))\n\n\tif v.v.hasTagNameFunc || fieldName != structFieldName {\n\t\tv.str2 = string(append(v.actualNs, structFieldName...))\n\t} else {\n\t\tv.str2 = v.str1\n\t}\n\n\tif kind == reflect.Invalid {\n\t\tv.errs = append(v.errs,\n\t\t\t&fieldError{\n\t\t\t\tv:              v.v,\n\t\t\t\ttag:            tag,\n\t\t\t\tactualTag:      tag,\n\t\t\t\tns:             v.str1,\n\t\t\t\tstructNs:       v.str2,\n\t\t\t\tfieldLen:       uint8(len(fieldName)),\n\t\t\t\tstructfieldLen: uint8(len(structFieldName)),\n\t\t\t\tparam:          param,\n\t\t\t\tkind:           kind,\n\t\t\t},\n\t\t)\n\t\treturn\n\t}\n\n\tv.errs = append(v.errs,\n\t\t&fieldError{\n\t\t\tv:              v.v,\n\t\t\ttag:            tag,\n\t\t\tactualTag:      tag,\n\t\t\tns:             v.str1,\n\t\t\tstructNs:       v.str2,\n\t\t\tfieldLen:       uint8(len(fieldName)),\n\t\t\tstructfieldLen: uint8(len(structFieldName)),\n\t\t\tvalue:          getValue(fv),\n\t\t\tparam:          param,\n\t\t\tkind:           kind,\n\t\t\ttyp:            fv.Type(),\n\t\t},\n\t)\n}\n\n// ReportValidationErrors reports ValidationErrors obtained from running validations within the Struct Level validation.\n//\n// NOTE: this function prepends the current namespace to the relative ones.\nfunc (v *validate) ReportValidationErrors(relativeNamespace, relativeStructNamespace string, errs ValidationErrors) {\n\tvar err *fieldError\n\n\tfor i := 0; i < len(errs); i++ {\n\t\terr = errs[i].(*fieldError)\n\t\terr.ns = string(append(append(v.ns, relativeNamespace...), err.ns...))\n\t\terr.structNs = string(append(append(v.actualNs, relativeStructNamespace...), err.structNs...))\n\n\t\tv.errs = append(v.errs, err)\n\t}\n}\n"
  },
  {
    "path": "testdata/a.go",
    "content": "package testdata\n"
  },
  {
    "path": "translations/ar/ar.go",
    "content": "package ar\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"حقل {0} مطلوب\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_if\",\n\t\t\ttranslation: \"حقل {0} مطلوب\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_unless\",\n\t\t\ttranslation: \"حقل {0} مطلوب\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with\",\n\t\t\ttranslation: \"حقل {0} مطلوب\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with_all\",\n\t\t\ttranslation: \"حقل {0} مطلوب\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without\",\n\t\t\ttranslation: \"حقل {0} مطلوب\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without_all\",\n\t\t\ttranslation: \"حقل {0} مطلوب\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_if\",\n\t\t\ttranslation: \"حقل {0} مستبعد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_unless\",\n\t\t\ttranslation: \"حقل {0} مستبعد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with\",\n\t\t\ttranslation: \"حقل {0} مستبعد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with_all\",\n\t\t\ttranslation: \"حقل {0} مستبعد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without\",\n\t\t\ttranslation: \"حقل {0} مستبعد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without_all\",\n\t\t\ttranslation: \"حقل {0} مستبعد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isdefault\",\n\t\t\ttranslation: \"حقل {0} يجب أن يكون قيمة إفتراضية\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"يجب أن يكون طول {0} مساويا ل {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"len-string-character-one\", \"{0} حرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"len-string-character-other\", \"{0} أحرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"len-number\", \"يجب أن يكون {0} مساويا ل {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"len-items\", \"يجب أن يحتوي {0} على {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"len-items-item-one\", \"{0} عنصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"len-items-item-other\", \"{0} عناصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"len-string-character-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"len-string-character-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"len-items-item-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"len-items-item-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} يجب أن يكون {1} على الأقل\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"min-string-character-one\", \"{0} حرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"min-string-character-other\", \"{0} أحرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} يجب أن يكون {1} أو أكثر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"min-items\", \"يجب أن يحتوي {0} على {1} على الأقل\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"min-items-item-one\", \"{0} عنصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"min-items-item-other\", \"{0} عناصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"min-duration\", \"يجب أن تكون مدة {0} {1} أو أكبر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Duration(0)) {\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-duration\", fe.Field(), fe.Param())\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tif err = fn(); err != nil || t != \"\" {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tif fe.Type() == reflect.TypeOf(time.Duration(0)) {\n\t\t\t\t\tt, err = ut.T(\"min-duration\", fe.Field(), fe.Param())\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"min-string-character-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"min-string-character-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"min-items-item-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"min-items-item-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn t\n\t\t\t},\n\t\t\toverride: false,\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"يجب أن يكون طول {0} بحد أقصى {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"max-string-character-one\", \"{0} حرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"max-string-character-other\", \"{0} أحرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} يجب أن يكون {1} أو اقل\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"max-items\", \"يجب أن يحتوي {0} على {1} كحد أقصى\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"max-items-item-one\", \"{0} عنصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"max-items-item-other\", \"{0} عناصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"max-duration\", \"يجب أن تكون مدة {0} {1} أو أقل\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Duration(0)) {\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-duration\", fe.Field(), fe.Param())\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tif err = fn(); err != nil || t != \"\" {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tif fe.Type() == reflect.TypeOf(time.Duration(0)) {\n\t\t\t\t\tt, err = ut.T(\"max-duration\", fe.Field(), fe.Param())\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"max-string-character-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"max-string-character-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"max-items-item-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"max-items-item-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn t\n\t\t\t},\n\t\t\toverride: false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0} لا يساوي {1}\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0} يجب ألا يساوي {1}\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"يجب أن يكون طول {0} أقل من {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lt-string-character-one\", \"{0} حرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lt-string-character-other\", \"{0} أحرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lt-number\", \"يجب أن يكون {0} أقل من {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lt-items\", \"يجب أن يحتوي {0} على أقل من {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lt-items-item-one\", \"{0} عنصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lt-items-item-other\", \"{0} عناصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"يجب أن يكون {0} أقل من التاريخ والوقت الحاليين\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\t\t\t\tvar f64 float64\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\t// Special handling for time.Time\n\t\t\t\tif fe.Type() == reflect.TypeOf(time.Time{}) {\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"lt-string-character-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"lt-string-character-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"lt-items-item-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"lt-items-item-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn t\n\t\t\t},\n\t\t\toverride: false,\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"يجب أن يكون طول {0} كحد أقصى {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lte-string-character-one\", \"{0} حرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lte-string-character-other\", \"{0} أحرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} يجب أن يكون {1} أو اقل\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lte-items\", \"يجب أن يحتوي {0} على {1} كحد أقصى\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lte-items-item-one\", \"{0} عنصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lte-items-item-other\", \"{0} عناصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"يجب أن يكون {0} أقل من أو يساوي التاريخ والوقت الحاليين\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\t\t\t\tvar f64 float64\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\t// Special handling for time.Time\n\t\t\t\tif fe.Type() == reflect.TypeOf(time.Time{}) {\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"lte-string-character-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"lte-string-character-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"lte-items-item-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"lte-items-item-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn t\n\t\t\t},\n\t\t\toverride: false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"يجب أن يكون {0} مساويا ل {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"يجب أن يكون {0} مساويا ل {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0} لا يمكن أن يساوي {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"يجب أن يكون {0} أكبر من {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"يجب أن يكون {0} أكبر من أو يساوي {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"يجب أن يكون {0} أصغر من {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"يجب أن يكون {0} أصغر من أو يساوي {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0} لا يمكن أن يساوي {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"يجب أن يكون طول {0} أكبر من {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gt-string-character-one\", \"{0} حرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gt-string-character-other\", \"{0} أحرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gt-number\", \"يجب أن يكون {0} أكبر من {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gt-items\", \"يجب أن يحتوي {0} على أكثر من {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gt-items-item-one\", \"{0} عنصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gt-items-item-other\", \"{0} عناصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"يجب أن يكون {0} أكبر من التاريخ والوقت الحاليين\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\t\t\t\tvar f64 float64\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\t// Special handling for time.Time\n\t\t\t\tif fe.Type() == reflect.TypeOf(time.Time{}) {\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"gt-string-character-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"gt-string-character-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"gt-items-item-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"gt-items-item-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn t\n\t\t\t},\n\t\t\toverride: false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"يمكن أن يحتوي {0} على أحرف أبجدية فقط\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"يمكن أن يحتوي {0} على أحرف أبجدية رقمية فقط\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"يجب أن يكون {0} قيمة رقمية صالحة\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"يجب أن يكون {0} رقم صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"يجب أن يكون {0} عددًا سداسيًا عشريًا صالحاً\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"يجب أن يكون {0} لون HEX صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"يجب أن يكون {0} لون RGB صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"يجب أن يكون {0} لون RGBA صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"يجب أن يكون {0} لون HSL صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"يجب أن يكون {0} لون HSLA صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"يجب أن يكون {0} رقم هاتف صالح بتنسيق E.164\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان بريد إلكتروني صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"يجب أن يكون {0} رابط إنترنت صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"يجب أن يكون {0} URI صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"يجب أن يكون {0} سلسلة Base64 صالحة\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"يجب أن يحتوي {0} على النص '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"يجب أن يحتوي {0} على حرف واحد على الأقل من الأحرف التالية '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"لا يمكن أن يحتوي {0} على النص '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"لا يمكن أن يحتوي {0} على أي من الأحرف التالية '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"لا يمكن أن يحتوي {0} على التالي '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"يجب أن يكون {0} رقم ISBN صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"يجب أن يكون {0} رقم ISBN-10 صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"يجب أن يكون {0} رقم ISBN-13 صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"يجب أن يكون {0} رقم ISSN صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"يجب أن يكون {0} UUID صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"يجب أن يكون {0} UUID صالح من النسخة 3\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"يجب أن يكون {0} UUID صالح من النسخة 4\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"يجب أن يكون {0} UUID صالح من النسخة 5\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"يجب أن يكون {0} ULID صالح من نسخة\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"يجب أن يحتوي {0} على أحرف ascii فقط\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"يجب أن يحتوي {0} على أحرف ascii قابلة للطباعة فقط\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"يجب أن يحتوي {0} على أحرف متعددة البايت\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"يجب أن يحتوي {0} على URI صالح للبيانات\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"يجب أن يحتوي {0} على إحداثيات خط عرض صالحة\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"يجب أن يحتوي {0} على إحداثيات خط طول صالحة\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"يجب أن يكون {0} رقم SSN صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان IPv4 صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان IPv6 صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان IP صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"يجب أن يحتوي {0} على علامة CIDR صالحة\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"يجب أن يحتوي {0} على علامة CIDR صالحة لعنوان IPv4\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"يجب أن يحتوي {0} على علامة CIDR صالحة لعنوان IPv6\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان TCP صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان IPv4 TCP صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان IPv6 TCP صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان UDP صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان IPv4 UDP صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان IPv6 UDP صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان IP قابل للحل\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان IP قابل للحل\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان IPv6 قابل للحل\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"يجب أن يكون {0} عنوان UNIX قابل للحل\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"يجب أن يحتوي {0} على عنوان MAC صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"يجب أن يحتوي {0} على قيم فريدة\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"يجب أن يكون {0} لون صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"يجب أن يكون {0} واحدا من [{1}]\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"يجب أن يكون {0} نص json صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"jwt\",\n\t\t\ttranslation: \"يجب أن يكون {0} نص jwt صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"يجب أن يكون {0} نص حروف صغيرة\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"يجب أن يكون {0} نص حروف كبيرة\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datetime\",\n\t\t\ttranslation: \"لا يتطابق {0} مع تنسيق {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2\",\n\t\t\ttranslation: \"لا يتطابق {0} مع تنسيق الرمز البريدي للبلد {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2_field\",\n\t\t\ttranslation: \"لا يتطابق {0} مع تنسيق الرمز البريدي للبلد في حقل {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"boolean\",\n\t\t\ttranslation: \"يجب أن يكون {0} قيمة منطقية صالحة\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"يجب أن تكون {0} صورة صالحة\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cve\",\n\t\t\ttranslation: \"يجب أن يكون {0} معرف CVE صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"يجب أن يكون طول {0} على الأقل {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gte-string-character-one\", \"{0} حرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gte-string-character-other\", \"{0} أحرف\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} يجب أن يكون {1} أو أكبر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gte-items\", \"يجب أن يحتوي {0} على {1} على الأقل\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gte-items-item-one\", \"{0} عنصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gte-items-item-other\", \"{0} عناصر\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"يجب أن يكون {0} أكبر من أو يساوي التاريخ والوقت الحاليين\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\t\t\t\tvar f64 float64\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\t// Special handling for time.Time\n\t\t\t\tif fe.Type() == reflect.TypeOf(time.Time{}) {\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"gte-string-character-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"gte-string-character-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\t\t\t\t\tif f64 == 1 {\n\t\t\t\t\t\tc, err = ut.T(\"gte-items-item-one\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc, err = ut.T(\"gte-items-item-other\", ut.FmtNumber(f64, digits))\n\t\t\t\t\t}\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn t\n\t\t\t},\n\t\t\toverride: false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"يجب أن يكون {0} أكبر من {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"يجب أن يكون {0} أكبر من أو يساوي {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"يجب أن يكون {0} أصغر من {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"يجب أن يكون {0} أصغر من أو يساوي {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"fqdn\",\n\t\t\ttranslation: \"يجب أن يكون {0} اسم نطاق مؤهل بالكامل صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cron\",\n\t\t\ttranslation: \"يجب أن يكون {0} تعبير cron صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"md5\",\n\t\t\ttranslation: \"يجب أن يكون {0} تجزئة MD5 صالحة\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"sha256\",\n\t\t\ttranslation: \"يجب أن يكون {0} تجزئة SHA256 صالحة\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"semver\",\n\t\t\ttranslation: \"يجب أن يكون {0} إصدار دلالي صالح\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\tif err := v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif err := v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) error {\n\t\treturn ut.Add(tag, translation, override)\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\tif err != nil {\n\t\treturn fe.(error).Error()\n\t}\n\treturn t\n}\n"
  },
  {
    "path": "translations/ar/ar_test.go",
    "content": "package ar\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tenglish \"github.com/go-playground/locales/en\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\teng := english.New()\n\tuni := ut.New(eng, eng)\n\ttrans, _ := uni.GetTranslator(\"en\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t}\n\n\ttype Test struct {\n\t\tInner             Inner\n\t\tRequiredString    string            `validate:\"required\"`\n\t\tRequiredNumber    int               `validate:\"required\"`\n\t\tRequiredMultiple  []string          `validate:\"required\"`\n\t\tLenString         string            `validate:\"len=1\"`\n\t\tLenNumber         float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple       []string          `validate:\"len=7\"`\n\t\tMinString         string            `validate:\"min=1\"`\n\t\tMinNumber         float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple       []string          `validate:\"min=7\"`\n\t\tMaxString         string            `validate:\"max=3\"`\n\t\tMaxNumber         float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple       []string          `validate:\"max=7\"`\n\t\tEqString          string            `validate:\"eq=3\"`\n\t\tEqNumber          float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple        []string          `validate:\"eq=7\"`\n\t\tNeString          string            `validate:\"ne=\"`\n\t\tNeNumber          float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple        []string          `validate:\"ne=0\"`\n\t\tLtString          string            `validate:\"lt=3\"`\n\t\tLtNumber          float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple        []string          `validate:\"lt=2\"`\n\t\tLtTime            time.Time         `validate:\"lt\"`\n\t\tLteString         string            `validate:\"lte=3\"`\n\t\tLteNumber         float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple       []string          `validate:\"lte=2\"`\n\t\tLteTime           time.Time         `validate:\"lte\"`\n\t\tGtString          string            `validate:\"gt=3\"`\n\t\tGtNumber          float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple        []string          `validate:\"gt=2\"`\n\t\tGtTime            time.Time         `validate:\"gt\"`\n\t\tGteString         string            `validate:\"gte=3\"`\n\t\tGteNumber         float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple       []string          `validate:\"gte=2\"`\n\t\tGteTime           time.Time         `validate:\"gte\"`\n\t\tEqFieldString     string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString   string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString   string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString   string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString  string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString   string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString  string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString     string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString     string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString    string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString     string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString    string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString       string            `validate:\"alpha\"`\n\t\tAlphanumString    string            `validate:\"alphanum\"`\n\t\tNumericString     string            `validate:\"numeric\"`\n\t\tNumberString      string            `validate:\"number\"`\n\t\tHexadecimalString string            `validate:\"hexadecimal\"`\n\t\tHexColorString    string            `validate:\"hexcolor\"`\n\t\tRGBColorString    string            `validate:\"rgb\"`\n\t\tRGBAColorString   string            `validate:\"rgba\"`\n\t\tHSLColorString    string            `validate:\"hsl\"`\n\t\tHSLAColorString   string            `validate:\"hsla\"`\n\t\tEmail             string            `validate:\"email\"`\n\t\tURL               string            `validate:\"url\"`\n\t\tURI               string            `validate:\"uri\"`\n\t\tBase64            string            `validate:\"base64\"`\n\t\tContains          string            `validate:\"contains=purpose\"`\n\t\tContainsAny       string            `validate:\"containsany=!@#$\"`\n\t\tExcludes          string            `validate:\"excludes=text\"`\n\t\tExcludesAll       string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune      string            `validate:\"excludesrune=☻\"`\n\t\tISBN              string            `validate:\"isbn\"`\n\t\tISBN10            string            `validate:\"isbn10\"`\n\t\tISBN13            string            `validate:\"isbn13\"`\n\t\tISSN              string            `validate:\"issn\"`\n\t\tUUID              string            `validate:\"uuid\"`\n\t\tUUID3             string            `validate:\"uuid3\"`\n\t\tUUID4             string            `validate:\"uuid4\"`\n\t\tUUID5             string            `validate:\"uuid5\"`\n\t\tULID              string            `validate:\"ulid\"`\n\t\tASCII             string            `validate:\"ascii\"`\n\t\tPrintableASCII    string            `validate:\"printascii\"`\n\t\tMultiByte         string            `validate:\"multibyte\"`\n\t\tDataURI           string            `validate:\"datauri\"`\n\t\tLatitude          string            `validate:\"latitude\"`\n\t\tLongitude         string            `validate:\"longitude\"`\n\t\tSSN               string            `validate:\"ssn\"`\n\t\tIP                string            `validate:\"ip\"`\n\t\tIPv4              string            `validate:\"ipv4\"`\n\t\tIPv6              string            `validate:\"ipv6\"`\n\t\tCIDR              string            `validate:\"cidr\"`\n\t\tCIDRv4            string            `validate:\"cidrv4\"`\n\t\tCIDRv6            string            `validate:\"cidrv6\"`\n\t\tTCPAddr           string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4         string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6         string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr           string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4         string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6         string            `validate:\"udp6_addr\"`\n\t\tIPAddr            string            `validate:\"ip_addr\"`\n\t\tIPAddrv4          string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6          string            `validate:\"ip6_addr\"`\n\t\tUinxAddr          string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC               string            `validate:\"mac\"`\n\t\tIsColor           string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen      *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen      *string           `validate:\"max=1\"`\n\t\tStrPtrLen         *string           `validate:\"len=2\"`\n\t\tStrPtrLt          *string           `validate:\"lt=1\"`\n\t\tStrPtrLte         *string           `validate:\"lte=1\"`\n\t\tStrPtrGt          *string           `validate:\"gt=10\"`\n\t\tStrPtrGte         *string           `validate:\"gte=10\"`\n\t\tOneOfString       string            `validate:\"oneof=red green\"`\n\t\tOneOfInt          int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice       []string          `validate:\"unique\"`\n\t\tUniqueArray       [3]string         `validate:\"unique\"`\n\t\tUniqueMap         map[string]string `validate:\"unique\"`\n\t\tJSONString        string            `validate:\"json\"`\n\t\tJWTString         string            `validate:\"jwt\"`\n\t\tLowercaseString   string            `validate:\"lowercase\"`\n\t\tUppercaseString   string            `validate:\"uppercase\"`\n\t\tDatetime          string            `validate:\"datetime=2006-01-02\"`\n\t\tPostCode          string            `validate:\"postcode_iso3166_alpha2=SG\"`\n\t\tPostCodeCountry   string\n\t\tPostCodeByField   string        `validate:\"postcode_iso3166_alpha2_field=PostCodeCountry\"`\n\t\tImage             string        `validate:\"image\"`\n\t\tBooleanString     string        `validate:\"boolean\"`\n\t\tCveString         string        `validate:\"cve\"`\n\t\tFQDN              string        `validate:\"fqdn\"`\n\t\tMinDuration       time.Duration `validate:\"min=1h30m\"`\n\t\tMaxDuration       time.Duration `validate:\"max=2h\"`\n\t\tCronString        string        `validate:\"cron\"`\n\t\tMD5String         string        `validate:\"md5\"`\n\t\tSHA256String      string        `validate:\"sha256\"`\n\t\tSemver            string        `validate:\"semver\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\ttest.Datetime = \"2008-Feb-01\"\n\ttest.PostCode = \"invalid\"\n\ttest.PostCodeCountry = \"SG\"\n\ttest.PostCodeByField = \"invalid\"\n\ttest.Image = \"not-an-image-data\"\n\n\ttest.BooleanString = \"invalid-boolean\"\n\ttest.CveString = \"invalid-cve\"\n\ttest.FQDN = \"invalid-fqdn\"\n\ttest.MinDuration = 1 * time.Hour\n\ttest.MaxDuration = 3 * time.Hour\n\ttest.CronString = \"invalid-cron\"\n\ttest.MD5String = \"invalid-md5\"\n\ttest.SHA256String = \"invalid-sha256\"\n\ttest.Semver = \"invalid-semver\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"يجب أن يكون IsColor لون صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"يجب أن يحتوي MAC على عنوان MAC صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"يجب أن يكون IPAddr عنوان IP قابل للحل\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"يجب أن يكون IPAddrv4 عنوان IP قابل للحل\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"يجب أن يكون IPAddrv6 عنوان IPv6 قابل للحل\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"يجب أن يكون UDPAddr عنوان UDP صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"يجب أن يكون UDPAddrv4 عنوان IPv4 UDP صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"يجب أن يكون UDPAddrv6 عنوان IPv6 UDP صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"يجب أن يكون TCPAddr عنوان TCP صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"يجب أن يكون TCPAddrv4 عنوان IPv4 TCP صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"يجب أن يكون TCPAddrv6 عنوان IPv6 TCP صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"يجب أن يحتوي CIDR على علامة CIDR صالحة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"يجب أن يحتوي CIDRv4 على علامة CIDR صالحة لعنوان IPv4\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"يجب أن يحتوي CIDRv6 على علامة CIDR صالحة لعنوان IPv6\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"يجب أن يكون SSN رقم SSN صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"يجب أن يكون IP عنوان IP صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"يجب أن يكون IPv4 عنوان IPv4 صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"يجب أن يكون IPv6 عنوان IPv6 صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"يجب أن يحتوي DataURI على URI صالح للبيانات\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"يجب أن يحتوي Latitude على إحداثيات خط عرض صالحة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"يجب أن يحتوي Longitude على إحداثيات خط طول صالحة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"يجب أن يحتوي MultiByte على أحرف متعددة البايت\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"يجب أن يحتوي ASCII على أحرف ascii فقط\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"يجب أن يحتوي PrintableASCII على أحرف ascii قابلة للطباعة فقط\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"يجب أن يكون UUID UUID صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"يجب أن يكون UUID3 UUID صالح من النسخة 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"يجب أن يكون UUID4 UUID صالح من النسخة 4\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"يجب أن يكون UUID5 UUID صالح من النسخة 5\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"يجب أن يكون ULID ULID صالح من نسخة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"يجب أن يكون ISBN رقم ISBN صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"يجب أن يكون ISBN10 رقم ISBN-10 صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"يجب أن يكون ISBN13 رقم ISBN-13 صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"يجب أن يكون ISSN رقم ISSN صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"لا يمكن أن يحتوي Excludes على النص 'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"لا يمكن أن يحتوي ExcludesAll على أي من الأحرف التالية '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"لا يمكن أن يحتوي ExcludesRune على التالي '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"يجب أن يحتوي ContainsAny على حرف واحد على الأقل من الأحرف التالية '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"يجب أن يحتوي Contains على النص 'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"يجب أن يكون Base64 سلسلة Base64 صالحة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"يجب أن يكون Email عنوان بريد إلكتروني صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"يجب أن يكون URL رابط إنترنت صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"يجب أن يكون URI URI صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"يجب أن يكون RGBColorString لون RGB صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"يجب أن يكون RGBAColorString لون RGBA صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"يجب أن يكون HSLColorString لون HSL صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"يجب أن يكون HSLAColorString لون HSLA صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"يجب أن يكون HexadecimalString عددًا سداسيًا عشريًا صالحاً\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"يجب أن يكون HexColorString لون HEX صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"يجب أن يكون NumberString رقم صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"يجب أن يكون NumericString قيمة رقمية صالحة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"يمكن أن يحتوي AlphanumString على أحرف أبجدية رقمية فقط\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"يمكن أن يحتوي AlphaString على أحرف أبجدية فقط\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"يجب أن يكون LtFieldString أصغر من MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"يجب أن يكون LteFieldString أصغر من أو يساوي MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"يجب أن يكون GtFieldString أكبر من MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"يجب أن يكون GteFieldString أكبر من أو يساوي MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString لا يمكن أن يساوي EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"يجب أن يكون LtCSFieldString أصغر من Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"يجب أن يكون LteCSFieldString أصغر من أو يساوي Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"يجب أن يكون GtCSFieldString أكبر من Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"يجب أن يكون GteCSFieldString أكبر من أو يساوي Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString لا يمكن أن يساوي Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"يجب أن يكون EqCSFieldString مساويا ل Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"يجب أن يكون EqFieldString مساويا ل MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"يجب أن يكون طول GteString على الأقل 3 أحرف\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber يجب أن يكون 5.56 أو أكبر\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"يجب أن يحتوي GteMultiple على 2 عناصر على الأقل\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"يجب أن يكون GteTime أكبر من أو يساوي التاريخ والوقت الحاليين\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"يجب أن يكون طول GtString أكبر من 3 أحرف\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"يجب أن يكون GtNumber أكبر من 5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"يجب أن يحتوي GtMultiple على أكثر من 2 عناصر\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"يجب أن يكون GtTime أكبر من التاريخ والوقت الحاليين\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"يجب أن يكون طول LteString كحد أقصى 3 أحرف\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber يجب أن يكون 5.56 أو اقل\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"يجب أن يحتوي LteMultiple على 2 عناصر كحد أقصى\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"يجب أن يكون LteTime أقل من أو يساوي التاريخ والوقت الحاليين\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"يجب أن يكون طول LtString أقل من 3 أحرف\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"يجب أن يكون LtNumber أقل من 5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"يجب أن يحتوي LtMultiple على أقل من 2 عناصر\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"يجب أن يكون LtTime أقل من التاريخ والوقت الحاليين\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString يجب ألا يساوي \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber يجب ألا يساوي 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple يجب ألا يساوي 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString لا يساوي 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber لا يساوي 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple لا يساوي 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"يجب أن يكون طول MaxString بحد أقصى 3 أحرف\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber يجب أن يكون 1,113.00 أو اقل\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"يجب أن يحتوي MaxMultiple على 7 عناصر كحد أقصى\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString يجب أن يكون 1 حرف على الأقل\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber يجب أن يكون 1,113.00 أو أكثر\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"يجب أن يحتوي MinMultiple على 7 عناصر على الأقل\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"يجب أن يكون طول LenString مساويا ل 1 حرف\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"يجب أن يكون LenNumber مساويا ل 1,113.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"يجب أن يحتوي LenMultiple على 7 عناصر\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"حقل RequiredString مطلوب\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"حقل RequiredNumber مطلوب\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"حقل RequiredMultiple مطلوب\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen يجب أن يكون 10 أحرف على الأقل\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"يجب أن يكون طول StrPtrMaxLen بحد أقصى 1 حرف\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"يجب أن يكون طول StrPtrLen مساويا ل 2 أحرف\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"يجب أن يكون طول StrPtrLt أقل من 1 حرف\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"يجب أن يكون طول StrPtrLte كحد أقصى 1 حرف\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"يجب أن يكون طول StrPtrGt أكبر من 10 أحرف\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"يجب أن يكون طول StrPtrGte على الأقل 10 أحرف\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"يجب أن يكون OneOfString واحدا من [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"يجب أن يكون OneOfInt واحدا من [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"يجب أن يحتوي UniqueSlice على قيم فريدة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"يجب أن يحتوي UniqueArray على قيم فريدة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"يجب أن يحتوي UniqueMap على قيم فريدة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JSONString\",\n\t\t\texpected: \"يجب أن يكون JSONString نص json صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JWTString\",\n\t\t\texpected: \"يجب أن يكون JWTString نص jwt صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"يجب أن يكون LowercaseString نص حروف صغيرة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"يجب أن يكون UppercaseString نص حروف كبيرة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"لا يتطابق Datetime مع تنسيق 2006-01-02\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCode\",\n\t\t\texpected: \"لا يتطابق PostCode مع تنسيق الرمز البريدي للبلد SG\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCodeByField\",\n\t\t\texpected: \"لا يتطابق PostCodeByField مع تنسيق الرمز البريدي للبلد في حقل PostCodeCountry\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"يجب أن تكون Image صورة صالحة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.BooleanString\",\n\t\t\texpected: \"يجب أن يكون BooleanString قيمة منطقية صالحة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CveString\",\n\t\t\texpected: \"يجب أن يكون CveString معرف CVE صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.FQDN\",\n\t\t\texpected: \"يجب أن يكون FQDN اسم نطاق مؤهل بالكامل صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinDuration\",\n\t\t\texpected: \"يجب أن تكون مدة MinDuration 1h30m أو أكبر\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxDuration\",\n\t\t\texpected: \"يجب أن تكون مدة MaxDuration 2h أو أقل\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CronString\",\n\t\t\texpected: \"يجب أن يكون CronString تعبير cron صالح\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MD5String\",\n\t\t\texpected: \"يجب أن يكون MD5String تجزئة MD5 صالحة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SHA256String\",\n\t\t\texpected: \"يجب أن يكون SHA256String تجزئة SHA256 صالحة\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Semver\",\n\t\t\texpected: \"يجب أن يكون Semver إصدار دلالي صالح\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/de/de.go",
    "content": "package de\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} ist ein Pflichtfeld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_if\",\n\t\t\ttranslation: \"{0} ist ein Pflichtfeld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_unless\",\n\t\t\ttranslation: \"{0} ist ein Pflichtfeld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with\",\n\t\t\ttranslation: \"{0} ist ein Pflichtfeld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with_all\",\n\t\t\ttranslation: \"{0} ist ein Pflichtfeld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without\",\n\t\t\ttranslation: \"{0} ist ein Pflichtfeld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without_all\",\n\t\t\ttranslation: \"{0} ist ein Pflichtfeld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_if\",\n\t\t\ttranslation: \"{0} ist ein ausgeschlossenes Feld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_unless\",\n\t\t\ttranslation: \"{0} ist ein ausgeschlossenes Feld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with\",\n\t\t\ttranslation: \"{0} ist ein ausgeschlossenes Feld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with_all\",\n\t\t\ttranslation: \"{0} ist ein ausgeschlossenes Feld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without\",\n\t\t\ttranslation: \"{0} ist ein ausgeschlossenes Feld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without_all\",\n\t\t\ttranslation: \"{0} ist ein ausgeschlossenes Feld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isdefault\",\n\t\t\ttranslation: \"{0} muss der Standardwert sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} darf nur {1} lang sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} Zeichen\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} Zeichen\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} muss gleich {1} sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} muss {1} enthalten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} Element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} Elemente\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} muss mindestens {1} lang sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} Zeichen\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} Zeichen\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} muss {1} oder größer sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} muss mindestens {1} enthalten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} Element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} Elemente\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} darf maximal {1} lang sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} Zeichen\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} Zeichen\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} darf {1} oder weniger sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} darf maximal {1} enthalten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} Element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} Elemente\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0} ist nicht gleich {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0} darf nicht gleich {1} sein\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} muss kleiner als {1} sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} Zeichen\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} Zeichen\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} muss kleiner als {1} sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} muss {1} oder weniger enthalten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} Element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} Elemente\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} muss vor dem aktuellen Datum und Uhrzeit liegen\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} darf maximal {1} lang sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} Zeichen\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} Zeichen\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} darf {1} oder weniger sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} darf maximal {1} enthalten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} Element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} Elemente\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} muss vor dem aktuellen Datum und Uhrzeit liegen oder gleich sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} muss größer als {1} sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} Zeichen\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} Zeichen\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} muss größer als {1} sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} muss {1} oder mehr enthalten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} Element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} Elemente\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} muss vor dem aktuellen Datum und Uhrzeit liegen\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} muss mindestens {1} lang sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} Zeichen\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} Zeichen\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} muss {1} oder größer sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} muss mindestens {1} enthalten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} Element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} Elemente\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} muss vor dem aktuellen Datum und Uhrzeit liegen oder gleich sein\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0} muss gleich {1} sein\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0} muss gleich {1} sein\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0} darf nicht gleich {1} sein\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0} muss größer als {1} sein\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0} muss größer als oder gleich {1} sein\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0} muss kleiner als {1} sein\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0} muss kleiner als oder gleich {1} sein\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0} darf nicht gleich {1} sein\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0} muss größer als {1} sein\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0} muss größer als oder gleich {1} sein\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0} muss kleiner als {1} sein\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0} muss kleiner als oder gleich {1} sein\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} darf nur alphabetische Zeichen enthalten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} darf nur alphanumerische Zeichen enthalten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} muss eine gültige Zahl sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} muss eine gültige Zahl sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} muss eine gültige hexadezimale Zahl sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} muss eine gültige Hexadezimalfarbe sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} muss eine gültige RGB-Farbe sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} muss eine gültige RGBA-Farbe sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} muss eine gültige HSL-Farbe sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} muss eine gültige HSLA-Farbe sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0} muss eine gültige E.164-Telefonnummer sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} muss eine gültige E-Mail-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} muss eine gültige URL sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} muss eine gültige URI sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} muss eine gültige Base64-Zeichenkette sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0} muss den Text '{1}' enthalten\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0} muss mindestens eines der folgenden Zeichen enthalten: '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0} darf den Text '{1}' nicht enthalten\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0} darf keines der folgenden Zeichen enthalten: '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0} darf die folgenden Runen nicht enthalten: '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} muss eine gültige ISBN-Nummer sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} muss eine gültige ISBN-10-Nummer sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} muss eine gültige ISBN-13-Nummer sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} muss eine gültige ISSN-Nummer sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} muss eine gültige UUID sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} muss eine gültige Version 3 UUID sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} muss eine gültige Version 4 UUID sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} muss eine gültige Version 5 UUID sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} muss eine gültige ULID sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} darf nur ASCII-Zeichen enthalten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} darf nur druckbare ASCII-Zeichen enthalten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} darf nur Mehrbyte-Zeichen enthalten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} muss eine gültige Data-URI sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} muss gültige Breitengradkoordinaten enthalten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} muss gültige Längengradkoordinaten enthalten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} muss eine gültige SSN-Nummer sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} muss eine gültige IPv4-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} muss eine gültige IPv6-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} muss eine gültige IP-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} muss eine gültige CIDR-Notation enthalten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} muss eine gültige CIDR-Notation für eine IPv4-Adresse enthalten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} muss eine gültige CIDR-Notation für eine IPv6-Adresse enthalten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} muss eine gültige TCP-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} muss eine gültige IPv4-TCP-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} muss eine gültige IPv6-TCP-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} muss eine gültige UDP-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} muss eine gültige IPv4-UDP-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} muss eine gültige IPv6-UDP-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} muss eine auflösbare IP-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} muss eine auflösbare IPv4-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} muss eine auflösbare IPv6-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} muss eine auflösbare UNIX-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} muss eine gültige MAC-Adresse sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"fqdn\",\n\t\t\ttranslation: \"{0} muss eine gültige FQDN sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} darf nur einmal vorkommen\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} muss eine gültige Farbe sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cron\",\n\t\t\ttranslation: \"{0} muss eine gültige Cron-Ausdruck sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0} muss einer der folgenden sein: [{1}]\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0} muss eine gültige JSON-Zeichenkette sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"jwt\",\n\t\t\ttranslation: \"{0} muss eine gültige JWT-Zeichenkette sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0} darf nur Kleinbuchstaben enthalten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0} darf nur Großbuchstaben enthalten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datetime\",\n\t\t\ttranslation: \"{0} entspricht nicht dem {1}-Format\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2\",\n\t\t\ttranslation: \"{0} entspricht nicht dem Postleitzahlformat von {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2_field\",\n\t\t\ttranslation: \"{0} entspricht nicht dem Postleitzahlformat des Feldes {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"boolean\",\n\t\t\ttranslation: \"{0} muss eine gültige Booleanwert sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} muss ein Bild sein\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cve\",\n\t\t\ttranslation: \"{0} muss eine gültige CVE-Kennung sein\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/de/de_test.go",
    "content": "package de\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tgerman \"github.com/go-playground/locales/de\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tger := german.New()\n\tuni := ut.New(ger, ger)\n\ttrans, _ := uni.GetTranslator(\"de\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString    string\n\t\tNeCSFieldString    string\n\t\tGtCSFieldString    string\n\t\tGteCSFieldString   string\n\t\tLtCSFieldString    string\n\t\tLteCSFieldString   string\n\t\tRequiredIf         string\n\t\tRequiredUnless     string\n\t\tRequiredWith       string\n\t\tRequiredWithAll    string\n\t\tRequiredWithout    string\n\t\tRequiredWithoutAll string\n\t\tExcludedIf         string\n\t\tExcludedUnless     string\n\t\tExcludedWith       string\n\t\tExcludedWithAll    string\n\t\tExcludedWithout    string\n\t\tExcludedWithoutAll string\n\t}\n\n\ttype Test struct {\n\t\tInner              Inner\n\t\tRequiredString     string            `validate:\"required\"`\n\t\tRequiredNumber     int               `validate:\"required\"`\n\t\tRequiredMultiple   []string          `validate:\"required\"`\n\t\tRequiredIf         string            `validate:\"required_if=Inner.RequiredIf abcd\"`\n\t\tRequiredUnless     string            `validate:\"required_unless=Inner.RequiredUnless abcd\"`\n\t\tRequiredWith       string            `validate:\"required_with=Inner.RequiredWith\"`\n\t\tRequiredWithAll    string            `validate:\"required_with_all=Inner.RequiredWith Inner.RequiredWithAll\"`\n\t\tRequiredWithout    string            `validate:\"required_without=Inner.RequiredWithout\"`\n\t\tRequiredWithoutAll string            `validate:\"required_without_all=Inner.RequiredWithout Inner.RequiredWithoutAll\"`\n\t\tExcludedIf         string            `validate:\"excluded_if=Inner.ExcludedIf abcd\"`\n\t\tExcludedUnless     string            `validate:\"excluded_unless=Inner.ExcludedUnless abcd\"`\n\t\tExcludedWith       string            `validate:\"excluded_with=Inner.ExcludedWith\"`\n\t\tExcludedWithout    string            `validate:\"excluded_with_all=Inner.ExcludedWithAll\"`\n\t\tExcludedWithAll    string            `validate:\"excluded_without=Inner.ExcludedWithout\"`\n\t\tExcludedWithoutAll string            `validate:\"excluded_without_all=Inner.ExcludedWithoutAll\"`\n\t\tIsDefault          string            `validate:\"isdefault\"`\n\t\tLenString          string            `validate:\"len=1\"`\n\t\tLenNumber          float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple        []string          `validate:\"len=7\"`\n\t\tMinString          string            `validate:\"min=1\"`\n\t\tMinNumber          float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple        []string          `validate:\"min=7\"`\n\t\tMaxString          string            `validate:\"max=3\"`\n\t\tMaxNumber          float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple        []string          `validate:\"max=7\"`\n\t\tEqString           string            `validate:\"eq=3\"`\n\t\tEqNumber           float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple         []string          `validate:\"eq=7\"`\n\t\tNeString           string            `validate:\"ne=\"`\n\t\tNeNumber           float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple         []string          `validate:\"ne=0\"`\n\t\tLtString           string            `validate:\"lt=3\"`\n\t\tLtNumber           float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple         []string          `validate:\"lt=2\"`\n\t\tLtTime             time.Time         `validate:\"lt\"`\n\t\tLteString          string            `validate:\"lte=3\"`\n\t\tLteNumber          float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple        []string          `validate:\"lte=2\"`\n\t\tLteTime            time.Time         `validate:\"lte\"`\n\t\tGtString           string            `validate:\"gt=3\"`\n\t\tGtNumber           float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple         []string          `validate:\"gt=2\"`\n\t\tGtTime             time.Time         `validate:\"gt\"`\n\t\tGteString          string            `validate:\"gte=3\"`\n\t\tGteNumber          float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple        []string          `validate:\"gte=2\"`\n\t\tGteTime            time.Time         `validate:\"gte\"`\n\t\tEqFieldString      string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString    string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString    string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString    string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString   string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString    string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString   string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString      string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString      string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString     string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString      string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString     string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString        string            `validate:\"alpha\"`\n\t\tAlphanumString     string            `validate:\"alphanum\"`\n\t\tNumericString      string            `validate:\"numeric\"`\n\t\tNumberString       string            `validate:\"number\"`\n\t\tHexadecimalString  string            `validate:\"hexadecimal\"`\n\t\tHexColorString     string            `validate:\"hexcolor\"`\n\t\tRGBColorString     string            `validate:\"rgb\"`\n\t\tRGBAColorString    string            `validate:\"rgba\"`\n\t\tHSLColorString     string            `validate:\"hsl\"`\n\t\tHSLAColorString    string            `validate:\"hsla\"`\n\t\tEmail              string            `validate:\"email\"`\n\t\tURL                string            `validate:\"url\"`\n\t\tURI                string            `validate:\"uri\"`\n\t\tBase64             string            `validate:\"base64\"`\n\t\tContains           string            `validate:\"contains=purpose\"`\n\t\tContainsAny        string            `validate:\"containsany=!@#$\"`\n\t\tExcludes           string            `validate:\"excludes=text\"`\n\t\tExcludesAll        string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune       string            `validate:\"excludesrune=☻\"`\n\t\tISBN               string            `validate:\"isbn\"`\n\t\tISBN10             string            `validate:\"isbn10\"`\n\t\tISBN13             string            `validate:\"isbn13\"`\n\t\tISSN               string            `validate:\"issn\"`\n\t\tUUID               string            `validate:\"uuid\"`\n\t\tUUID3              string            `validate:\"uuid3\"`\n\t\tUUID4              string            `validate:\"uuid4\"`\n\t\tUUID5              string            `validate:\"uuid5\"`\n\t\tULID               string            `validate:\"ulid\"`\n\t\tASCII              string            `validate:\"ascii\"`\n\t\tPrintableASCII     string            `validate:\"printascii\"`\n\t\tMultiByte          string            `validate:\"multibyte\"`\n\t\tDataURI            string            `validate:\"datauri\"`\n\t\tLatitude           string            `validate:\"latitude\"`\n\t\tLongitude          string            `validate:\"longitude\"`\n\t\tSSN                string            `validate:\"ssn\"`\n\t\tIP                 string            `validate:\"ip\"`\n\t\tIPv4               string            `validate:\"ipv4\"`\n\t\tIPv6               string            `validate:\"ipv6\"`\n\t\tCIDR               string            `validate:\"cidr\"`\n\t\tCIDRv4             string            `validate:\"cidrv4\"`\n\t\tCIDRv6             string            `validate:\"cidrv6\"`\n\t\tTCPAddr            string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4          string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6          string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr            string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4          string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6          string            `validate:\"udp6_addr\"`\n\t\tIPAddr             string            `validate:\"ip_addr\"`\n\t\tIPAddrv4           string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6           string            `validate:\"ip6_addr\"`\n\t\tUinxAddr           string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC                string            `validate:\"mac\"`\n\t\tFQDN               string            `validate:\"fqdn\"`\n\t\tIsColor            string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen       *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen       *string           `validate:\"max=1\"`\n\t\tStrPtrLen          *string           `validate:\"len=2\"`\n\t\tStrPtrLt           *string           `validate:\"lt=1\"`\n\t\tStrPtrLte          *string           `validate:\"lte=1\"`\n\t\tStrPtrGt           *string           `validate:\"gt=10\"`\n\t\tStrPtrGte          *string           `validate:\"gte=10\"`\n\t\tOneOfString        string            `validate:\"oneof=red green\"`\n\t\tOneOfInt           int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice        []string          `validate:\"unique\"`\n\t\tUniqueArray        [3]string         `validate:\"unique\"`\n\t\tUniqueMap          map[string]string `validate:\"unique\"`\n\t\tJSONString         string            `validate:\"json\"`\n\t\tJWTString          string            `validate:\"jwt\"`\n\t\tLowercaseString    string            `validate:\"lowercase\"`\n\t\tUppercaseString    string            `validate:\"uppercase\"`\n\t\tDatetime           string            `validate:\"datetime=2006-01-02\"`\n\t\tPostCode           string            `validate:\"postcode_iso3166_alpha2=SG\"`\n\t\tPostCodeCountry    string\n\t\tPostCodeByField    string `validate:\"postcode_iso3166_alpha2_field=PostCodeCountry\"`\n\t\tBooleanString      string `validate:\"boolean\"`\n\t\tImage              string `validate:\"image\"`\n\t\tCveString          string `validate:\"cve\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\ttest.Inner.RequiredUnless = \"1234\"\n\ttest.Inner.RequiredWith = \"1234\"\n\ttest.Inner.RequiredWithAll = \"1234\"\n\ttest.Inner.ExcludedIf = \"abcd\"\n\ttest.Inner.ExcludedUnless = \"1234\"\n\ttest.Inner.ExcludedWith = \"1234\"\n\ttest.Inner.ExcludedWithAll = \"1234\"\n\n\ttest.ExcludedIf = \"1234\"\n\ttest.ExcludedUnless = \"1234\"\n\ttest.ExcludedWith = \"1234\"\n\ttest.ExcludedWithAll = \"1234\"\n\ttest.ExcludedWithout = \"1234\"\n\ttest.ExcludedWithoutAll = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\ttest.Datetime = \"2008-Feb-01\"\n\ttest.BooleanString = \"A\"\n\ttest.CveString = \"A\"\n\n\ttest.Inner.RequiredIf = \"abcd\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor muss eine gültige Farbe sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC muss eine gültige MAC-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.FQDN\",\n\t\t\texpected: \"FQDN muss eine gültige FQDN sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr muss eine auflösbare IP-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 muss eine auflösbare IPv4-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 muss eine auflösbare IPv6-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr muss eine gültige UDP-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 muss eine gültige IPv4-UDP-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 muss eine gültige IPv6-UDP-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr muss eine gültige TCP-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 muss eine gültige IPv4-TCP-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 muss eine gültige IPv6-TCP-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR muss eine gültige CIDR-Notation enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 muss eine gültige CIDR-Notation für eine IPv4-Adresse enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 muss eine gültige CIDR-Notation für eine IPv6-Adresse enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN muss eine gültige SSN-Nummer sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP muss eine gültige IP-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 muss eine gültige IPv4-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 muss eine gültige IPv6-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI muss eine gültige Data-URI sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude muss gültige Breitengradkoordinaten enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude muss gültige Längengradkoordinaten enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte darf nur Mehrbyte-Zeichen enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII darf nur ASCII-Zeichen enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII darf nur druckbare ASCII-Zeichen enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID muss eine gültige UUID sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 muss eine gültige Version 3 UUID sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 muss eine gültige Version 4 UUID sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 muss eine gültige Version 5 UUID sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID muss eine gültige ULID sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN muss eine gültige ISBN-Nummer sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 muss eine gültige ISBN-10-Nummer sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 muss eine gültige ISBN-13-Nummer sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN muss eine gültige ISSN-Nummer sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes darf den Text 'text' nicht enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll darf keines der folgenden Zeichen enthalten: '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune darf die folgenden Runen nicht enthalten: '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny muss mindestens eines der folgenden Zeichen enthalten: '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains muss den Text 'purpose' enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 muss eine gültige Base64-Zeichenkette sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email muss eine gültige E-Mail-Adresse sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL muss eine gültige URL sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI muss eine gültige URI sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString muss eine gültige RGB-Farbe sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString muss eine gültige RGBA-Farbe sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString muss eine gültige HSL-Farbe sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString muss eine gültige HSLA-Farbe sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString muss eine gültige hexadezimale Zahl sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString muss eine gültige Hexadezimalfarbe sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString muss eine gültige Zahl sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString muss eine gültige Zahl sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString darf nur alphanumerische Zeichen enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString darf nur alphabetische Zeichen enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString muss kleiner als MaxString sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString muss kleiner als oder gleich MaxString sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString muss größer als MaxString sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString muss größer als oder gleich MaxString sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString darf nicht gleich EqFieldString sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString muss kleiner als Inner.LtCSFieldString sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString muss kleiner als oder gleich Inner.LteCSFieldString sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString muss größer als Inner.GtCSFieldString sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString muss größer als oder gleich Inner.GteCSFieldString sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString darf nicht gleich Inner.NeCSFieldString sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString muss gleich Inner.EqCSFieldString sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString muss gleich MaxString sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString muss mindestens 3 Zeichen lang sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber muss 5,56 oder größer sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple muss mindestens 2 Elemente enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime muss vor dem aktuellen Datum und Uhrzeit liegen oder gleich sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString muss größer als 3 Zeichen sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber muss größer als 5,56 sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple muss 2 Elemente oder mehr enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime muss vor dem aktuellen Datum und Uhrzeit liegen\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString darf maximal 3 Zeichen lang sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber darf 5,56 oder weniger sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple darf maximal 2 Elemente enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime muss vor dem aktuellen Datum und Uhrzeit liegen oder gleich sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString muss kleiner als 3 Zeichen sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber muss kleiner als 5,56 sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple muss 2 Elemente oder weniger enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime muss vor dem aktuellen Datum und Uhrzeit liegen\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString darf nicht gleich  sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber darf nicht gleich 0.00 sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple darf nicht gleich 0 sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString ist nicht gleich 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber ist nicht gleich 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple ist nicht gleich 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString darf maximal 3 Zeichen lang sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber darf 1.113,00 oder weniger sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple darf maximal 7 Elemente enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString muss mindestens 1 Zeichen lang sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber muss 1.113,00 oder größer sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple muss mindestens 7 Elemente enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString darf nur 1 Zeichen lang sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber muss gleich 1.113,00 sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple muss 7 Elemente enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString ist ein Pflichtfeld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredIf\",\n\t\t\texpected: \"RequiredIf ist ein Pflichtfeld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber ist ein Pflichtfeld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple ist ein Pflichtfeld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredUnless\",\n\t\t\texpected: \"RequiredUnless ist ein Pflichtfeld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWith\",\n\t\t\texpected: \"RequiredWith ist ein Pflichtfeld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithAll\",\n\t\t\texpected: \"RequiredWithAll ist ein Pflichtfeld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithout\",\n\t\t\texpected: \"RequiredWithout ist ein Pflichtfeld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithoutAll\",\n\t\t\texpected: \"RequiredWithoutAll ist ein Pflichtfeld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedIf\",\n\t\t\texpected: \"ExcludedIf ist ein ausgeschlossenes Feld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedUnless\",\n\t\t\texpected: \"ExcludedUnless ist ein ausgeschlossenes Feld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWith\",\n\t\t\texpected: \"ExcludedWith ist ein ausgeschlossenes Feld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithAll\",\n\t\t\texpected: \"ExcludedWithAll ist ein ausgeschlossenes Feld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithout\",\n\t\t\texpected: \"ExcludedWithout ist ein ausgeschlossenes Feld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithoutAll\",\n\t\t\texpected: \"ExcludedWithoutAll ist ein ausgeschlossenes Feld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen muss mindestens 10 Zeichen lang sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen darf maximal 1 Zeichen lang sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen darf nur 2 Zeichen lang sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt muss kleiner als 1 Zeichen sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte darf maximal 1 Zeichen lang sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt muss größer als 10 Zeichen sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte muss mindestens 10 Zeichen lang sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString muss einer der folgenden sein: [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt muss einer der folgenden sein: [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice darf nur einmal vorkommen\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray darf nur einmal vorkommen\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap darf nur einmal vorkommen\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JSONString\",\n\t\t\texpected: \"JSONString muss eine gültige JSON-Zeichenkette sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JWTString\",\n\t\t\texpected: \"JWTString muss eine gültige JWT-Zeichenkette sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"LowercaseString darf nur Kleinbuchstaben enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"UppercaseString darf nur Großbuchstaben enthalten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"Datetime entspricht nicht dem 2006-01-02-Format\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCode\",\n\t\t\texpected: \"PostCode entspricht nicht dem Postleitzahlformat von SG\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCodeByField\",\n\t\t\texpected: \"PostCodeByField entspricht nicht dem Postleitzahlformat des Feldes PostCodeCountry\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.BooleanString\",\n\t\t\texpected: \"BooleanString muss eine gültige Booleanwert sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image muss ein Bild sein\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CveString\",\n\t\t\texpected: \"CveString muss eine gültige CVE-Kennung sein\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/en/en.go",
    "content": "package en\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} is a required field\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_if\",\n\t\t\ttranslation: \"{0} is a required field\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_unless\",\n\t\t\ttranslation: \"{0} is a required field\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with\",\n\t\t\ttranslation: \"{0} is a required field\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with_all\",\n\t\t\ttranslation: \"{0} is a required field\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without\",\n\t\t\ttranslation: \"{0} is a required field\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without_all\",\n\t\t\ttranslation: \"{0} is a required field\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_if\",\n\t\t\ttranslation: \"{0} is an excluded field\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_unless\",\n\t\t\ttranslation: \"{0} is an excluded field\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with\",\n\t\t\ttranslation: \"{0} is an excluded field\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with_all\",\n\t\t\ttranslation: \"{0} is an excluded field\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without\",\n\t\t\ttranslation: \"{0} is an excluded field\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without_all\",\n\t\t\ttranslation: \"{0} is an excluded field\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isdefault\",\n\t\t\ttranslation: \"{0} must be default value\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} must be {1} in length\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} character\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} characters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} must be equal to {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} must contain {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} must be at least {1} in length\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} character\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} characters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} must be {1} or greater\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} must contain at least {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tif fe.Type() == reflect.TypeOf(time.Duration(0)) {\n\t\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), fe.Param())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} must be a maximum of {1} in length\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} character\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} characters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} must be {1} or less\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} must contain at maximum {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tif fe.Type() == reflect.TypeOf(time.Duration(0)) {\n\t\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), fe.Param())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0} is not equal to {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0} should not be equal to {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} must be less than {1} in length\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} character\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} characters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} must be less than {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} must contain less than {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} must be less than the current Date & Time\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} must be at maximum {1} in length\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} character\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} characters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} must be {1} or less\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} must contain at maximum {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} must be less than or equal to the current Date & Time\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} must be greater than {1} in length\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} character\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} characters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} must be greater than {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} must contain more than {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} must be greater than the current Date & Time\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} must be at least {1} in length\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} character\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} characters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} must be {1} or greater\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} must contain at least {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} must be greater than or equal to the current Date & Time\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0} must be equal to {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0} must be equal to {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0} cannot be equal to {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0} must be greater than {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0} must be greater than or equal to {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0} must be less than {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0} must be less than or equal to {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0} cannot be equal to {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0} must be greater than {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0} must be greater than or equal to {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0} must be less than {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0} must be less than or equal to {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} can only contain alphabetic characters\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} can only contain alphanumeric characters\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphaspace\",\n\t\t\ttranslation: \"{0} can only contain alphabetic and space characters\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanumspace\",\n\t\t\ttranslation: \"{0} can only contain alphanumeric and space characters\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphaunicode\",\n\t\t\ttranslation: \"{0} can only contain unicode alphabetic characters\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanumunicode\",\n\t\t\ttranslation: \"{0} can only contain unicode alphanumeric characters\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} must be a valid numeric value\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} must be a valid number\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} must be a valid hexadecimal\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} must be a valid HEX color\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} must be a valid RGB color\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} must be a valid RGBA color\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} must be a valid HSL color\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} must be a valid HSLA color\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0} must be a valid E.164 formatted phone number\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} must be a valid email address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} must be a valid URL\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} must be a valid URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} must be a valid Base64 string\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0} must contain the text '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0} must contain at least one of the following characters '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0} cannot contain the text '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0} cannot contain any of the following characters '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0} cannot contain the following '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} must be a valid ISBN number\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} must be a valid ISBN-10 number\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} must be a valid ISBN-13 number\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} must be a valid ISSN number\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"urn_rfc2141\",\n\t\t\ttranslation: \"{0} must be a valid RFC 2141 URN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} must be a valid UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} must be a valid version 3 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} must be a valid version 4 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} must be a valid version 5 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} must be a valid ULID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} must contain only ascii characters\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} must contain only printable ascii characters\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} must contain multibyte characters\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} must contain a valid Data URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} must contain valid latitude coordinates\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} must contain a valid longitude coordinates\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} must be a valid SSN number\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} must be a valid IPv4 address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} must be a valid IPv6 address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} must be a valid IP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} must contain a valid CIDR notation\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} must contain a valid CIDR notation for an IPv4 address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} must contain a valid CIDR notation for an IPv6 address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} must be a valid TCP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} must be a valid IPv4 TCP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} must be a valid IPv6 TCP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} must be a valid UDP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} must be a valid IPv4 UDP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} must be a valid IPv6 UDP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} must be a resolvable IP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} must be a resolvable IPv4 address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} must be a resolvable IPv6 address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} must be a resolvable UNIX address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} must contain a valid MAC address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"fqdn\",\n\t\t\ttranslation: \"{0} must be a valid FQDN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} must contain unique values\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} must be a valid color\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cron\",\n\t\t\ttranslation: \"{0} must be a valid cron expression\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0} must be one of [{1}]\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0} must be a valid json string\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"jwt\",\n\t\t\ttranslation: \"{0} must be a valid jwt string\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0} must be a lowercase string\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0} must be an uppercase string\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datetime\",\n\t\t\ttranslation: \"{0} does not match the {1} format\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2\",\n\t\t\ttranslation: \"{0} does not match postcode format of {1} country\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2_field\",\n\t\t\ttranslation: \"{0} does not match postcode format of country in {1} field\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"boolean\",\n\t\t\ttranslation: \"{0} must be a valid boolean value\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} must be a valid image\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cve\",\n\t\t\ttranslation: \"{0} must be a valid cve identifier\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"validateFn\",\n\t\t\ttranslation: \"{0} must be a valid object\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/en/en_test.go",
    "content": "package en\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tenglish \"github.com/go-playground/locales/en\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\ntype Foo struct{}\n\nfunc (Foo) IsBar() bool { return false }\n\nfunc TestTranslations(t *testing.T) {\n\teng := english.New()\n\tuni := ut.New(eng, eng)\n\ttrans, _ := uni.GetTranslator(\"en\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString    string\n\t\tNeCSFieldString    string\n\t\tGtCSFieldString    string\n\t\tGteCSFieldString   string\n\t\tLtCSFieldString    string\n\t\tLteCSFieldString   string\n\t\tRequiredIf         string\n\t\tRequiredUnless     string\n\t\tRequiredWith       string\n\t\tRequiredWithAll    string\n\t\tRequiredWithout    string\n\t\tRequiredWithoutAll string\n\t\tExcludedIf         string\n\t\tExcludedUnless     string\n\t\tExcludedWith       string\n\t\tExcludedWithAll    string\n\t\tExcludedWithout    string\n\t\tExcludedWithoutAll string\n\t}\n\n\ttype Test struct {\n\t\tInner              Inner\n\t\tRequiredString     string            `validate:\"required\"`\n\t\tRequiredNumber     int               `validate:\"required\"`\n\t\tRequiredMultiple   []string          `validate:\"required\"`\n\t\tRequiredIf         string            `validate:\"required_if=Inner.RequiredIf abcd\"`\n\t\tRequiredUnless     string            `validate:\"required_unless=Inner.RequiredUnless abcd\"`\n\t\tRequiredWith       string            `validate:\"required_with=Inner.RequiredWith\"`\n\t\tRequiredWithAll    string            `validate:\"required_with_all=Inner.RequiredWith Inner.RequiredWithAll\"`\n\t\tRequiredWithout    string            `validate:\"required_without=Inner.RequiredWithout\"`\n\t\tRequiredWithoutAll string            `validate:\"required_without_all=Inner.RequiredWithout Inner.RequiredWithoutAll\"`\n\t\tExcludedIf         string            `validate:\"excluded_if=Inner.ExcludedIf abcd\"`\n\t\tExcludedUnless     string            `validate:\"excluded_unless=Inner.ExcludedUnless abcd\"`\n\t\tExcludedWith       string            `validate:\"excluded_with=Inner.ExcludedWith\"`\n\t\tExcludedWithout    string            `validate:\"excluded_with_all=Inner.ExcludedWithAll\"`\n\t\tExcludedWithAll    string            `validate:\"excluded_without=Inner.ExcludedWithout\"`\n\t\tExcludedWithoutAll string            `validate:\"excluded_without_all=Inner.ExcludedWithoutAll\"`\n\t\tIsDefault          string            `validate:\"isdefault\"`\n\t\tLenString          string            `validate:\"len=1\"`\n\t\tLenNumber          float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple        []string          `validate:\"len=7\"`\n\t\tMinString          string            `validate:\"min=1\"`\n\t\tMinNumber          float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple        []string          `validate:\"min=7\"`\n\t\tMaxString          string            `validate:\"max=3\"`\n\t\tMaxNumber          float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple        []string          `validate:\"max=7\"`\n\t\tEqString           string            `validate:\"eq=3\"`\n\t\tEqNumber           float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple         []string          `validate:\"eq=7\"`\n\t\tNeString           string            `validate:\"ne=\"`\n\t\tNeNumber           float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple         []string          `validate:\"ne=0\"`\n\t\tLtString           string            `validate:\"lt=3\"`\n\t\tLtNumber           float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple         []string          `validate:\"lt=2\"`\n\t\tLtTime             time.Time         `validate:\"lt\"`\n\t\tLteString          string            `validate:\"lte=3\"`\n\t\tLteNumber          float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple        []string          `validate:\"lte=2\"`\n\t\tLteTime            time.Time         `validate:\"lte\"`\n\t\tGtString           string            `validate:\"gt=3\"`\n\t\tGtNumber           float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple         []string          `validate:\"gt=2\"`\n\t\tGtTime             time.Time         `validate:\"gt\"`\n\t\tGteString          string            `validate:\"gte=3\"`\n\t\tGteNumber          float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple        []string          `validate:\"gte=2\"`\n\t\tGteTime            time.Time         `validate:\"gte\"`\n\t\tEqFieldString      string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString    string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString    string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString    string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString   string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString    string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString   string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString      string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString      string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString     string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString      string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString     string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString           string            `validate:\"alpha\"`\n\t\tAlphanumString        string            `validate:\"alphanum\"`\n\t\tAlphaSpaceString      string            `validate:\"alphaspace\"`\n\t\tAlphaNumSpaceString   string            `validate:\"alphanumspace\"`\n\t\tAlphaUnicodeString    string            `validate:\"alphaunicode\"`\n\t\tAlphaNumUnicodeString string            `validate:\"alphanumunicode\"`\n\t\tNumericString         string            `validate:\"numeric\"`\n\t\tNumberString       string            `validate:\"number\"`\n\t\tHexadecimalString  string            `validate:\"hexadecimal\"`\n\t\tHexColorString     string            `validate:\"hexcolor\"`\n\t\tRGBColorString     string            `validate:\"rgb\"`\n\t\tRGBAColorString    string            `validate:\"rgba\"`\n\t\tHSLColorString     string            `validate:\"hsl\"`\n\t\tHSLAColorString    string            `validate:\"hsla\"`\n\t\tEmail              string            `validate:\"email\"`\n\t\tURL                string            `validate:\"url\"`\n\t\tURI                string            `validate:\"uri\"`\n\t\tBase64             string            `validate:\"base64\"`\n\t\tContains           string            `validate:\"contains=purpose\"`\n\t\tContainsAny        string            `validate:\"containsany=!@#$\"`\n\t\tExcludes           string            `validate:\"excludes=text\"`\n\t\tExcludesAll        string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune       string            `validate:\"excludesrune=☻\"`\n\t\tISBN               string            `validate:\"isbn\"`\n\t\tISBN10             string            `validate:\"isbn10\"`\n\t\tISBN13             string            `validate:\"isbn13\"`\n\t\tISSN               string            `validate:\"issn\"`\n\t\tURN                string            `validate:\"urn_rfc2141\"`\n\t\tUUID               string            `validate:\"uuid\"`\n\t\tUUID3              string            `validate:\"uuid3\"`\n\t\tUUID4              string            `validate:\"uuid4\"`\n\t\tUUID5              string            `validate:\"uuid5\"`\n\t\tULID               string            `validate:\"ulid\"`\n\t\tASCII              string            `validate:\"ascii\"`\n\t\tPrintableASCII     string            `validate:\"printascii\"`\n\t\tMultiByte          string            `validate:\"multibyte\"`\n\t\tDataURI            string            `validate:\"datauri\"`\n\t\tLatitude           string            `validate:\"latitude\"`\n\t\tLongitude          string            `validate:\"longitude\"`\n\t\tSSN                string            `validate:\"ssn\"`\n\t\tIP                 string            `validate:\"ip\"`\n\t\tIPv4               string            `validate:\"ipv4\"`\n\t\tIPv6               string            `validate:\"ipv6\"`\n\t\tCIDR               string            `validate:\"cidr\"`\n\t\tCIDRv4             string            `validate:\"cidrv4\"`\n\t\tCIDRv6             string            `validate:\"cidrv6\"`\n\t\tTCPAddr            string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4          string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6          string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr            string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4          string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6          string            `validate:\"udp6_addr\"`\n\t\tIPAddr             string            `validate:\"ip_addr\"`\n\t\tIPAddrv4           string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6           string            `validate:\"ip6_addr\"`\n\t\tUinxAddr           string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC                string            `validate:\"mac\"`\n\t\tFQDN               string            `validate:\"fqdn\"`\n\t\tIsColor            string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen       *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen       *string           `validate:\"max=1\"`\n\t\tStrPtrLen          *string           `validate:\"len=2\"`\n\t\tStrPtrLt           *string           `validate:\"lt=1\"`\n\t\tStrPtrLte          *string           `validate:\"lte=1\"`\n\t\tStrPtrGt           *string           `validate:\"gt=10\"`\n\t\tStrPtrGte          *string           `validate:\"gte=10\"`\n\t\tOneOfString        string            `validate:\"oneof=red green\"`\n\t\tOneOfInt           int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice        []string          `validate:\"unique\"`\n\t\tUniqueArray        [3]string         `validate:\"unique\"`\n\t\tUniqueMap          map[string]string `validate:\"unique\"`\n\t\tJSONString         string            `validate:\"json\"`\n\t\tJWTString          string            `validate:\"jwt\"`\n\t\tLowercaseString    string            `validate:\"lowercase\"`\n\t\tUppercaseString    string            `validate:\"uppercase\"`\n\t\tDatetime           string            `validate:\"datetime=2006-01-02\"`\n\t\tPostCode           string            `validate:\"postcode_iso3166_alpha2=SG\"`\n\t\tPostCodeCountry    string\n\t\tPostCodeByField    string        `validate:\"postcode_iso3166_alpha2_field=PostCodeCountry\"`\n\t\tBooleanString      string        `validate:\"boolean\"`\n\t\tImage              string        `validate:\"image\"`\n\t\tCveString          string        `validate:\"cve\"`\n\t\tMinDuration        time.Duration `validate:\"min=1h30m,max=2h\"`\n\t\tMaxDuration        time.Duration `validate:\"min=1h30m,max=2h\"`\n\t\tValidateFn         Foo           `validate:\"validateFn=IsBar\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\ttest.Inner.RequiredUnless = \"1234\"\n\ttest.Inner.RequiredWith = \"1234\"\n\ttest.Inner.RequiredWithAll = \"1234\"\n\ttest.Inner.ExcludedIf = \"abcd\"\n\ttest.Inner.ExcludedUnless = \"1234\"\n\ttest.Inner.ExcludedWith = \"1234\"\n\ttest.Inner.ExcludedWithAll = \"1234\"\n\n\ttest.ExcludedIf = \"1234\"\n\ttest.ExcludedUnless = \"1234\"\n\ttest.ExcludedWith = \"1234\"\n\ttest.ExcludedWithAll = \"1234\"\n\ttest.ExcludedWithout = \"1234\"\n\ttest.ExcludedWithoutAll = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\ttest.Datetime = \"2008-Feb-01\"\n\ttest.BooleanString = \"A\"\n\ttest.CveString = \"A\"\n\n\ttest.MinDuration = 1 * time.Hour\n\ttest.MaxDuration = 3 * time.Hour\n\n\ttest.Inner.RequiredIf = \"abcd\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor must be a valid color\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC must contain a valid MAC address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.FQDN\",\n\t\t\texpected: \"FQDN must be a valid FQDN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr must be a resolvable IP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 must be a resolvable IPv4 address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 must be a resolvable IPv6 address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr must be a valid UDP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 must be a valid IPv4 UDP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 must be a valid IPv6 UDP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr must be a valid TCP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 must be a valid IPv4 TCP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 must be a valid IPv6 TCP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR must contain a valid CIDR notation\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 must contain a valid CIDR notation for an IPv4 address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 must contain a valid CIDR notation for an IPv6 address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN must be a valid SSN number\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP must be a valid IP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 must be a valid IPv4 address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 must be a valid IPv6 address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI must contain a valid Data URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude must contain valid latitude coordinates\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude must contain a valid longitude coordinates\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte must contain multibyte characters\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII must contain only ascii characters\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII must contain only printable ascii characters\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID must be a valid UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 must be a valid version 3 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 must be a valid version 4 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 must be a valid version 5 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID must be a valid ULID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN must be a valid ISBN number\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 must be a valid ISBN-10 number\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 must be a valid ISBN-13 number\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN must be a valid ISSN number\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URN\",\n\t\t\texpected: \"URN must be a valid RFC 2141 URN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes cannot contain the text 'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll cannot contain any of the following characters '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune cannot contain the following '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny must contain at least one of the following characters '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains must contain the text 'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 must be a valid Base64 string\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email must be a valid email address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL must be a valid URL\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI must be a valid URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString must be a valid RGB color\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString must be a valid RGBA color\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString must be a valid HSL color\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString must be a valid HSLA color\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString must be a valid hexadecimal\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString must be a valid HEX color\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString must be a valid number\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString must be a valid numeric value\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString can only contain alphanumeric characters\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString can only contain alphabetic characters\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaSpaceString\",\n\t\t\texpected: \"AlphaSpaceString can only contain alphabetic and space characters\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaNumSpaceString\",\n\t\t\texpected: \"AlphaNumSpaceString can only contain alphanumeric and space characters\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaUnicodeString\",\n\t\t\texpected: \"AlphaUnicodeString can only contain unicode alphabetic characters\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaNumUnicodeString\",\n\t\t\texpected: \"AlphaNumUnicodeString can only contain unicode alphanumeric characters\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString must be less than MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString must be less than or equal to MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString must be greater than MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString must be greater than or equal to MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString cannot be equal to EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString must be less than Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString must be less than or equal to Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString must be greater than Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString must be greater than or equal to Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString cannot be equal to Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString must be equal to Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString must be equal to MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString must be at least 3 characters in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber must be 5.56 or greater\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple must contain at least 2 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime must be greater than or equal to the current Date & Time\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString must be greater than 3 characters in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber must be greater than 5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple must contain more than 2 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime must be greater than the current Date & Time\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString must be at maximum 3 characters in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber must be 5.56 or less\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple must contain at maximum 2 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime must be less than or equal to the current Date & Time\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString must be less than 3 characters in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber must be less than 5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple must contain less than 2 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime must be less than the current Date & Time\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString should not be equal to \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber should not be equal to 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple should not be equal to 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString is not equal to 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber is not equal to 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple is not equal to 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString must be a maximum of 3 characters in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber must be 1,113.00 or less\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple must contain at maximum 7 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString must be at least 1 character in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber must be 1,113.00 or greater\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple must contain at least 7 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString must be 1 character in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber must be equal to 1,113.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple must contain 7 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString is a required field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredIf\",\n\t\t\texpected: \"RequiredIf is a required field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber is a required field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple is a required field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredUnless\",\n\t\t\texpected: \"RequiredUnless is a required field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWith\",\n\t\t\texpected: \"RequiredWith is a required field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithAll\",\n\t\t\texpected: \"RequiredWithAll is a required field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithout\",\n\t\t\texpected: \"RequiredWithout is a required field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithoutAll\",\n\t\t\texpected: \"RequiredWithoutAll is a required field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedIf\",\n\t\t\texpected: \"ExcludedIf is an excluded field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedUnless\",\n\t\t\texpected: \"ExcludedUnless is an excluded field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWith\",\n\t\t\texpected: \"ExcludedWith is an excluded field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithAll\",\n\t\t\texpected: \"ExcludedWithAll is an excluded field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithout\",\n\t\t\texpected: \"ExcludedWithout is an excluded field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithoutAll\",\n\t\t\texpected: \"ExcludedWithoutAll is an excluded field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen must be at least 10 characters in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen must be a maximum of 1 character in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen must be 2 characters in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt must be less than 1 character in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte must be at maximum 1 character in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt must be greater than 10 characters in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte must be at least 10 characters in length\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString must be one of [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt must be one of [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice must contain unique values\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray must contain unique values\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap must contain unique values\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JSONString\",\n\t\t\texpected: \"JSONString must be a valid json string\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JWTString\",\n\t\t\texpected: \"JWTString must be a valid jwt string\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"LowercaseString must be a lowercase string\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"UppercaseString must be an uppercase string\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"Datetime does not match the 2006-01-02 format\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCode\",\n\t\t\texpected: \"PostCode does not match postcode format of SG country\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCodeByField\",\n\t\t\texpected: \"PostCodeByField does not match postcode format of country in PostCodeCountry field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.BooleanString\",\n\t\t\texpected: \"BooleanString must be a valid boolean value\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image must be a valid image\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CveString\",\n\t\t\texpected: \"CveString must be a valid cve identifier\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinDuration\",\n\t\t\texpected: \"MinDuration must be 1h30m or greater\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxDuration\",\n\t\t\texpected: \"MaxDuration must be 2h or less\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ValidateFn\",\n\t\t\texpected: \"ValidateFn must be a valid object\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/es/es.go",
    "content": "package es\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} es un campo requerido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_if\",\n\t\t\ttranslation: \"{0} es un campo requerido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} debe tener {1} de longitud\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} carácter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} debe ser igual a {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} debe contener {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} elementos\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} debe tener al menos {1} de longitud\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} carácter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} debe ser {1} o más\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} debe contener al menos {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} elementos\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} debe tener un máximo de {1} de longitud\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} carácter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} debe ser {1} o menos\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} debe contener como máximo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} elementos\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0} no es igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0} no debería ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} debe tener menos de {1} de longitud\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} carácter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} debe ser menos de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} debe contener menos de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} elementos\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} debe ser antes de la fecha y hora actual\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} debe tener un máximo de {1} de longitud\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} carácter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} debe ser {1} o menos\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} debe contener como máximo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} elementos\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} debe ser antes o durante la fecha y hora actual\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} debe ser mayor que {1} en longitud\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} carácter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} debe ser mayor que {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} debe contener más de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} elementos\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} debe ser después de la fecha y hora actual\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} debe tener al menos {1} de longitud\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} carácter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} debe ser {1} o mayor\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} debe contener al menos {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} elementos\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} debe ser después o durante la fecha y hora actuales\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0} debe ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0} debe ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0} no puede ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0} debe ser mayor que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0} debe ser mayor o igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0} debe ser menor que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0} debe ser menor o igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0} no puede ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0} debe ser mayor que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0} debe ser mayor o igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0} debe ser menor que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0} debe ser menor o igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} sólo puede contener caracteres alfabéticos\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} sólo puede contener caracteres alfanuméricos\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} debe ser un valor numérico válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} debe ser un número válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} debe ser un hexadecimal válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} debe ser un color HEX válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} debe ser un color RGB válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} debe ser un color RGBA válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} debe ser un color HSL válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} debe ser un color HSL válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0} debe ser un número de teléfono válido con formato E.164\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} debe ser una dirección de correo electrónico válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} debe ser un URL válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} debe ser una URI válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} debe ser una cadena de Base64 válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0} debe contener el texto '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0} debe contener al menos uno de los siguientes caracteres '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0} no puede contener el texto '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0} no puede contener ninguno de los siguientes caracteres '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0} no puede contener lo siguiente '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} debe ser un número ISBN válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} debe ser un número ISBN-10 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} debe ser un número ISBN-13 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} debe ser un número ISSN válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} debe ser un UUID válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} debe ser una versión válida 3 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} debe ser una versión válida 4 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} debe ser una versión válida 5 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} debe ser un ULID válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} debe contener sólo caracteres ascii\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} debe contener sólo caracteres ASCII imprimibles\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} debe contener caracteres multibyte\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} debe contener un URI de datos válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} debe contener coordenadas de latitud válidas\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} debe contener unas coordenadas de longitud válidas\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} debe ser un número válido de SSN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} debe ser una dirección IPv4 válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} debe ser una dirección IPv6 válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} debe ser una dirección IP válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} debe contener una anotación válida del CIDR\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} debe contener una notación CIDR válida para una dirección IPv4\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} debe contener una notación CIDR válida para una dirección IPv6\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} debe ser una dirección TCP válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} debe ser una dirección IPv4 TCP válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} debe ser una dirección IPv6 TCP válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} debe ser una dirección UDP válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} debe ser una dirección IPv4 UDP válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} debe ser una dirección IPv6 UDP válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} debe ser una dirección IP resoluble\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} debe ser una dirección IPv4 resoluble\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} debe ser una dirección IPv6 resoluble\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} debe ser una dirección UNIX resoluble\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} debe contener una dirección MAC válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} debe contener valores únicos\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} debe ser un color válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0} debe ser uno de [{1}]\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} debe ser una imagen válida\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/es/es_test.go",
    "content": "package es\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tspanish \"github.com/go-playground/locales/es\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tspa := spanish.New()\n\tuni := ut.New(spa, spa)\n\ttrans, _ := uni.GetTranslator(\"es\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t}\n\n\ttype Test struct {\n\t\tInner             Inner\n\t\tRequiredString    string            `validate:\"required\"`\n\t\tRequiredNumber    int               `validate:\"required\"`\n\t\tRequiredMultiple  []string          `validate:\"required\"`\n\t\tRequiredIf        string            `validate:\"required_if=Inner.RequiredIf abcd\"`\n\t\tLenString         string            `validate:\"len=1\"`\n\t\tLenNumber         float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple       []string          `validate:\"len=7\"`\n\t\tMinString         string            `validate:\"min=1\"`\n\t\tMinNumber         float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple       []string          `validate:\"min=7\"`\n\t\tMaxString         string            `validate:\"max=3\"`\n\t\tMaxNumber         float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple       []string          `validate:\"max=7\"`\n\t\tEqString          string            `validate:\"eq=3\"`\n\t\tEqNumber          float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple        []string          `validate:\"eq=7\"`\n\t\tNeString          string            `validate:\"ne=\"`\n\t\tNeNumber          float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple        []string          `validate:\"ne=0\"`\n\t\tLtString          string            `validate:\"lt=3\"`\n\t\tLtNumber          float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple        []string          `validate:\"lt=2\"`\n\t\tLtTime            time.Time         `validate:\"lt\"`\n\t\tLteString         string            `validate:\"lte=3\"`\n\t\tLteNumber         float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple       []string          `validate:\"lte=2\"`\n\t\tLteTime           time.Time         `validate:\"lte\"`\n\t\tGtString          string            `validate:\"gt=3\"`\n\t\tGtNumber          float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple        []string          `validate:\"gt=2\"`\n\t\tGtTime            time.Time         `validate:\"gt\"`\n\t\tGteString         string            `validate:\"gte=3\"`\n\t\tGteNumber         float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple       []string          `validate:\"gte=2\"`\n\t\tGteTime           time.Time         `validate:\"gte\"`\n\t\tEqFieldString     string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString   string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString   string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString   string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString  string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString   string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString  string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString     string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString     string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString    string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString     string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString    string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString       string            `validate:\"alpha\"`\n\t\tAlphanumString    string            `validate:\"alphanum\"`\n\t\tNumericString     string            `validate:\"numeric\"`\n\t\tNumberString      string            `validate:\"number\"`\n\t\tHexadecimalString string            `validate:\"hexadecimal\"`\n\t\tHexColorString    string            `validate:\"hexcolor\"`\n\t\tRGBColorString    string            `validate:\"rgb\"`\n\t\tRGBAColorString   string            `validate:\"rgba\"`\n\t\tHSLColorString    string            `validate:\"hsl\"`\n\t\tHSLAColorString   string            `validate:\"hsla\"`\n\t\tEmail             string            `validate:\"email\"`\n\t\tURL               string            `validate:\"url\"`\n\t\tURI               string            `validate:\"uri\"`\n\t\tBase64            string            `validate:\"base64\"`\n\t\tContains          string            `validate:\"contains=purpose\"`\n\t\tContainsAny       string            `validate:\"containsany=!@#$\"`\n\t\tExcludes          string            `validate:\"excludes=text\"`\n\t\tExcludesAll       string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune      string            `validate:\"excludesrune=☻\"`\n\t\tISBN              string            `validate:\"isbn\"`\n\t\tISBN10            string            `validate:\"isbn10\"`\n\t\tISBN13            string            `validate:\"isbn13\"`\n\t\tISSN              string            `validate:\"issn\"`\n\t\tUUID              string            `validate:\"uuid\"`\n\t\tUUID3             string            `validate:\"uuid3\"`\n\t\tUUID4             string            `validate:\"uuid4\"`\n\t\tUUID5             string            `validate:\"uuid5\"`\n\t\tULID              string            `validate:\"ulid\"`\n\t\tASCII             string            `validate:\"ascii\"`\n\t\tPrintableASCII    string            `validate:\"printascii\"`\n\t\tMultiByte         string            `validate:\"multibyte\"`\n\t\tDataURI           string            `validate:\"datauri\"`\n\t\tLatitude          string            `validate:\"latitude\"`\n\t\tLongitude         string            `validate:\"longitude\"`\n\t\tSSN               string            `validate:\"ssn\"`\n\t\tIP                string            `validate:\"ip\"`\n\t\tIPv4              string            `validate:\"ipv4\"`\n\t\tIPv6              string            `validate:\"ipv6\"`\n\t\tCIDR              string            `validate:\"cidr\"`\n\t\tCIDRv4            string            `validate:\"cidrv4\"`\n\t\tCIDRv6            string            `validate:\"cidrv6\"`\n\t\tTCPAddr           string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4         string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6         string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr           string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4         string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6         string            `validate:\"udp6_addr\"`\n\t\tIPAddr            string            `validate:\"ip_addr\"`\n\t\tIPAddrv4          string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6          string            `validate:\"ip6_addr\"`\n\t\tUinxAddr          string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC               string            `validate:\"mac\"`\n\t\tIsColor           string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen      *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen      *string           `validate:\"max=1\"`\n\t\tStrPtrLen         *string           `validate:\"len=2\"`\n\t\tStrPtrLt          *string           `validate:\"lt=1\"`\n\t\tStrPtrLte         *string           `validate:\"lte=1\"`\n\t\tStrPtrGt          *string           `validate:\"gt=10\"`\n\t\tStrPtrGte         *string           `validate:\"gte=10\"`\n\t\tOneOfString       string            `validate:\"oneof=red green\"`\n\t\tOneOfInt          int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice       []string          `validate:\"unique\"`\n\t\tUniqueArray       [3]string         `validate:\"unique\"`\n\t\tUniqueMap         map[string]string `validate:\"unique\"`\n\t\tImage             string            `validate:\"image\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor debe ser un color válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC debe contener una dirección MAC válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr debe ser una dirección IP resoluble\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 debe ser una dirección IPv4 resoluble\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 debe ser una dirección IPv6 resoluble\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr debe ser una dirección UDP válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 debe ser una dirección IPv4 UDP válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 debe ser una dirección IPv6 UDP válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr debe ser una dirección TCP válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 debe ser una dirección IPv4 TCP válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 debe ser una dirección IPv6 TCP válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR debe contener una anotación válida del CIDR\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 debe contener una notación CIDR válida para una dirección IPv4\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 debe contener una notación CIDR válida para una dirección IPv6\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN debe ser un número válido de SSN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP debe ser una dirección IP válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 debe ser una dirección IPv4 válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 debe ser una dirección IPv6 válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI debe contener un URI de datos válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude debe contener coordenadas de latitud válidas\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude debe contener unas coordenadas de longitud válidas\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte debe contener caracteres multibyte\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII debe contener sólo caracteres ascii\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII debe contener sólo caracteres ASCII imprimibles\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID debe ser un UUID válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 debe ser una versión válida 3 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 debe ser una versión válida 4 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 debe ser una versión válida 5 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID debe ser un ULID válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN debe ser un número ISBN válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 debe ser un número ISBN-10 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 debe ser un número ISBN-13 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN debe ser un número ISSN válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes no puede contener el texto 'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll no puede contener ninguno de los siguientes caracteres '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune no puede contener lo siguiente '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny debe contener al menos uno de los siguientes caracteres '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains debe contener el texto 'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 debe ser una cadena de Base64 válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email debe ser una dirección de correo electrónico válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL debe ser un URL válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI debe ser una URI válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString debe ser un color RGB válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString debe ser un color RGBA válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString debe ser un color HSL válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString debe ser un color HSL válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString debe ser un hexadecimal válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString debe ser un color HEX válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString debe ser un número válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString debe ser un valor numérico válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString sólo puede contener caracteres alfanuméricos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString sólo puede contener caracteres alfabéticos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString debe ser menor que MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString debe ser menor o igual a MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString debe ser mayor que MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString debe ser mayor o igual a MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString no puede ser igual a EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString debe ser menor que Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString debe ser menor o igual a Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString debe ser mayor que Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString debe ser mayor o igual a Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString no puede ser igual a Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString debe ser igual a Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString debe ser igual a MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString debe tener al menos 3 caracteres de longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber debe ser 5,56 o mayor\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple debe contener al menos 2 elementos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime debe ser después o durante la fecha y hora actuales\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString debe ser mayor que 3 caracteres en longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber debe ser mayor que 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple debe contener más de 2 elementos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime debe ser después de la fecha y hora actual\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString debe tener un máximo de 3 caracteres de longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber debe ser 5,56 o menos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple debe contener como máximo 2 elementos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime debe ser antes o durante la fecha y hora actual\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString debe tener menos de 3 caracteres de longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber debe ser menos de 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple debe contener menos de 2 elementos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime debe ser antes de la fecha y hora actual\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString no debería ser igual a \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber no debería ser igual a 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple no debería ser igual a 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString no es igual a 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber no es igual a 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple no es igual a 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString debe tener un máximo de 3 caracteres de longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber debe ser 1.113,00 o menos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple debe contener como máximo 7 elementos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString debe tener al menos 1 carácter de longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber debe ser 1.113,00 o más\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple debe contener al menos 7 elementos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString debe tener 1 carácter de longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber debe ser igual a 1.113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple debe contener 7 elementos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString es un campo requerido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber es un campo requerido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple es un campo requerido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen debe tener al menos 10 caracteres de longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen debe tener un máximo de 1 carácter de longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen debe tener 2 caracteres de longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt debe tener menos de 1 carácter de longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte debe tener un máximo de 1 carácter de longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt debe ser mayor que 10 caracteres en longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte debe tener al menos 10 caracteres de longitud\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString debe ser uno de [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt debe ser uno de [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice debe contener valores únicos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray debe contener valores únicos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap debe contener valores únicos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image debe ser una imagen válida\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/fa/fa.go",
    "content": "package fa\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"فیلد {0} اجباری میباشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"طول {0} باید {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} کاراکتر\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} کاراکتر\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"طول {0} باید برابر {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"تعداد {0} باید برابر {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} آیتم\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} آیتم\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"طول {0} باید حداقل {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} کاراکتر\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} کاراکتر\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} باید بزرگتر یا برابر {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} باید شامل حداقل {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} آیتم\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} آیتم\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"طول {0} باید حداکثر {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} کاراکتر\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} کاراکتر\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} باید کمتر یا برابر {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} باید شامل حداکثر {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} آیتم\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} آیتم\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0} برابر {1} نمیباشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0} نباید برابر {1} باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"طول {0} باید کمتر از {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} کاراکتر\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} کاراکتر\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} باید کمتر از {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} باید دارای کمتر از {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} آیتم\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} آیتم\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} باید قبل از تاریخ و زمان کنونی باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"طول {0} باید حداکثر {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} کاراکتر\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} کاراکتر\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} باید کمتر یا برابر {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} باید حداکثر شامل {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} آیتم\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} آیتم\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} باید قبل یا برابر تاریخ و زمان کنونی باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"طول {0} باید بیشتر از {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} کاراکتر\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} کاراکتر\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} باید بیشتر از {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} باید دارای بیشتر از {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} آیتم\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} آیتم\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} باید بعد از تاریخ و زمان کنونی باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"طول {0} باید حداقل {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} کاراکتر\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} کاراکتر\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} باید بیشتر یا برابر {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} باید شامل حداقل {1} باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} آیتم\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} آیتم\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} باید بعد یا برابر تاریخ و زمان کنونی باشد\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0} باید برابر {1} باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0} باید برابر {1} باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0} نمیتواند برابر {1} باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"طول {0} باید بیشتر از {1} باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"طول {0} باید بیشتر یا برابر {1} باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"طول {0} باید کمتر از {1} باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"طول {0} باید کمتر یا برابر {1} باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0} نمیتواند برابر {1} باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"طول {0} باید بیشتر از {1} باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"طول {0} باید بیشتر یا برابر {1} باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"طول {0} باید کمتر از {1} باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"طول {0} باید کمتر یا برابر {1} باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} میتواند فقط شامل حروف باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} میتواند فقط شامل حروف و اعداد باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} باید یک عدد معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} باید یک عدد معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} باید یک عدد درمبنای16 باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} باید یک کد رنگ HEX باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} باید یک کد رنگ RGB باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} باید یک کد رنگ RGBA باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} باید یک کد رنگ HSL باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} باید یک کد رنگ HSLA باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0} باید یک شماره‌تلفن معتبر با فرمت E.164 باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} باید یک ایمیل معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} باید یک آدرس اینترنتی معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} باید یک URI معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} باید یک متن درمبنای64 معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0} باید شامل '{1}' باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0} باید شامل کاراکترهای '{1}' باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0} نمیتواند شامل '{1}' باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0} نمیتواند شامل کاراکترهای '{1}' باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0} نمیتواند شامل '{1}' باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} باید یک شابک معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} باید یک شابک(ISBN-10) معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} باید یک شابک(ISBN-13) معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} باید یک شابک(ISSN) معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} باید یک UUID معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} باید یک UUID نسخه 3 معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} باید یک UUID نسخه 4 معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} باید یک UUID نسخه 5 معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} باید یک ULID معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} باید فقط شامل کاراکترهای اسکی باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} باید فقط شامل کاراکترهای اسکی قابل چاپ باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} باید شامل کاراکترهای چندبایته باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} باید یک Data URI معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} باید یک عرض جغرافیایی معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} باید یک طول جغرافیایی معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} باید یک شماره SSN معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} باید یک آدرس آی‌پی IPv4 معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} باید یک آدرس آی‌پی IPv6 معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} باید یک آدرس آی‌پی معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} باید یک نشانه‌گذاری CIDR معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} باید یک نشانه‌گذاری CIDR معتبر برای آدرس آی‌پی IPv4 باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} باید یک نشانه‌گذاری CIDR معتبر برای آدرس آی‌پی IPv6 باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} باید یک آدرس TCP معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} باید یک آدرس TCP IPv4 معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} باید یک آدرس TCP IPv6 معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} باید یک آدرس UDP معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} باید یک آدرس UDP IPv4 معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} باید یک آدرس UDP IPv6 معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} باید یک آدرس آی‌پی قابل دسترس باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} باید یک آدرس آی‌پی IPv4 قابل دسترس باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} باید یک آدرس آی‌پی IPv6 قابل دسترس باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} باید یک آدرس UNIX معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} باید یک مک‌آدرس معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} باید شامل مقادیر منحصربفرد باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} باید یک رنگ معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0} باید یکی از مقادیر [{1}] باشد\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0} باید یک json معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0} باید یک متن با حروف کوچک باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0} باید یک متن با حروف بزرگ باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datetime\",\n\t\t\ttranslation: \"فرمت {0} با {1} سازگار نیست\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2\",\n\t\t\ttranslation: \"{0} یک کدپستی معتبر کشور {1} نیست\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2_field\",\n\t\t\ttranslation: \"{0} یک کدپستی معتبر کشور فیلد {1} نیست\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} باید یک تصویر معتبر باشد\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/fa/fa_test.go",
    "content": "package fa\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tenglish \"github.com/go-playground/locales/en\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\teng := english.New()\n\tuni := ut.New(eng, eng)\n\ttrans, _ := uni.GetTranslator(\"en\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t}\n\n\ttype Test struct {\n\t\tInner             Inner\n\t\tRequiredString    string            `validate:\"required\"`\n\t\tRequiredNumber    int               `validate:\"required\"`\n\t\tRequiredMultiple  []string          `validate:\"required\"`\n\t\tLenString         string            `validate:\"len=1\"`\n\t\tLenNumber         float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple       []string          `validate:\"len=7\"`\n\t\tMinString         string            `validate:\"min=1\"`\n\t\tMinNumber         float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple       []string          `validate:\"min=7\"`\n\t\tMaxString         string            `validate:\"max=3\"`\n\t\tMaxNumber         float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple       []string          `validate:\"max=7\"`\n\t\tEqString          string            `validate:\"eq=3\"`\n\t\tEqNumber          float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple        []string          `validate:\"eq=7\"`\n\t\tNeString          string            `validate:\"ne=\"`\n\t\tNeNumber          float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple        []string          `validate:\"ne=0\"`\n\t\tLtString          string            `validate:\"lt=3\"`\n\t\tLtNumber          float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple        []string          `validate:\"lt=2\"`\n\t\tLtTime            time.Time         `validate:\"lt\"`\n\t\tLteString         string            `validate:\"lte=3\"`\n\t\tLteNumber         float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple       []string          `validate:\"lte=2\"`\n\t\tLteTime           time.Time         `validate:\"lte\"`\n\t\tGtString          string            `validate:\"gt=3\"`\n\t\tGtNumber          float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple        []string          `validate:\"gt=2\"`\n\t\tGtTime            time.Time         `validate:\"gt\"`\n\t\tGteString         string            `validate:\"gte=3\"`\n\t\tGteNumber         float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple       []string          `validate:\"gte=2\"`\n\t\tGteTime           time.Time         `validate:\"gte\"`\n\t\tEqFieldString     string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString   string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString   string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString   string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString  string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString   string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString  string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString     string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString     string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString    string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString     string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString    string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString       string            `validate:\"alpha\"`\n\t\tAlphanumString    string            `validate:\"alphanum\"`\n\t\tNumericString     string            `validate:\"numeric\"`\n\t\tNumberString      string            `validate:\"number\"`\n\t\tHexadecimalString string            `validate:\"hexadecimal\"`\n\t\tHexColorString    string            `validate:\"hexcolor\"`\n\t\tRGBColorString    string            `validate:\"rgb\"`\n\t\tRGBAColorString   string            `validate:\"rgba\"`\n\t\tHSLColorString    string            `validate:\"hsl\"`\n\t\tHSLAColorString   string            `validate:\"hsla\"`\n\t\tEmail             string            `validate:\"email\"`\n\t\tURL               string            `validate:\"url\"`\n\t\tURI               string            `validate:\"uri\"`\n\t\tBase64            string            `validate:\"base64\"`\n\t\tContains          string            `validate:\"contains=purpose\"`\n\t\tContainsAny       string            `validate:\"containsany=!@#$\"`\n\t\tExcludes          string            `validate:\"excludes=text\"`\n\t\tExcludesAll       string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune      string            `validate:\"excludesrune=☻\"`\n\t\tISBN              string            `validate:\"isbn\"`\n\t\tISBN10            string            `validate:\"isbn10\"`\n\t\tISBN13            string            `validate:\"isbn13\"`\n\t\tISSN              string            `validate:\"issn\"`\n\t\tUUID              string            `validate:\"uuid\"`\n\t\tUUID3             string            `validate:\"uuid3\"`\n\t\tUUID4             string            `validate:\"uuid4\"`\n\t\tUUID5             string            `validate:\"uuid5\"`\n\t\tULID              string            `validate:\"ulid\"`\n\t\tASCII             string            `validate:\"ascii\"`\n\t\tPrintableASCII    string            `validate:\"printascii\"`\n\t\tMultiByte         string            `validate:\"multibyte\"`\n\t\tDataURI           string            `validate:\"datauri\"`\n\t\tLatitude          string            `validate:\"latitude\"`\n\t\tLongitude         string            `validate:\"longitude\"`\n\t\tSSN               string            `validate:\"ssn\"`\n\t\tIP                string            `validate:\"ip\"`\n\t\tIPv4              string            `validate:\"ipv4\"`\n\t\tIPv6              string            `validate:\"ipv6\"`\n\t\tCIDR              string            `validate:\"cidr\"`\n\t\tCIDRv4            string            `validate:\"cidrv4\"`\n\t\tCIDRv6            string            `validate:\"cidrv6\"`\n\t\tTCPAddr           string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4         string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6         string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr           string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4         string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6         string            `validate:\"udp6_addr\"`\n\t\tIPAddr            string            `validate:\"ip_addr\"`\n\t\tIPAddrv4          string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6          string            `validate:\"ip6_addr\"`\n\t\tUinxAddr          string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC               string            `validate:\"mac\"`\n\t\tIsColor           string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen      *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen      *string           `validate:\"max=1\"`\n\t\tStrPtrLen         *string           `validate:\"len=2\"`\n\t\tStrPtrLt          *string           `validate:\"lt=1\"`\n\t\tStrPtrLte         *string           `validate:\"lte=1\"`\n\t\tStrPtrGt          *string           `validate:\"gt=10\"`\n\t\tStrPtrGte         *string           `validate:\"gte=10\"`\n\t\tOneOfString       string            `validate:\"oneof=red green\"`\n\t\tOneOfInt          int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice       []string          `validate:\"unique\"`\n\t\tUniqueArray       [3]string         `validate:\"unique\"`\n\t\tUniqueMap         map[string]string `validate:\"unique\"`\n\t\tJSONString        string            `validate:\"json\"`\n\t\tLowercaseString   string            `validate:\"lowercase\"`\n\t\tUppercaseString   string            `validate:\"uppercase\"`\n\t\tDatetime          string            `validate:\"datetime=2006-01-02\"`\n\t\tPostCode          string            `validate:\"postcode_iso3166_alpha2=SG\"`\n\t\tPostCodeCountry   string\n\t\tPostCodeByField   string `validate:\"postcode_iso3166_alpha2_field=PostCodeCountry\"`\n\t\tImage             string `validate:\"image\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\ttest.Datetime = \"2008-Feb-01\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor باید یک رنگ معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC باید یک مک‌آدرس معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr باید یک آدرس آی‌پی قابل دسترس باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 باید یک آدرس آی‌پی IPv4 قابل دسترس باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 باید یک آدرس آی‌پی IPv6 قابل دسترس باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr باید یک آدرس UDP معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 باید یک آدرس UDP IPv4 معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 باید یک آدرس UDP IPv6 معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr باید یک آدرس TCP معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 باید یک آدرس TCP IPv4 معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 باید یک آدرس TCP IPv6 معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR باید یک نشانه‌گذاری CIDR معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 باید یک نشانه‌گذاری CIDR معتبر برای آدرس آی‌پی IPv4 باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 باید یک نشانه‌گذاری CIDR معتبر برای آدرس آی‌پی IPv6 باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN باید یک شماره SSN معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP باید یک آدرس آی‌پی معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 باید یک آدرس آی‌پی IPv4 معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 باید یک آدرس آی‌پی IPv6 معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI باید یک Data URI معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude باید یک عرض جغرافیایی معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude باید یک طول جغرافیایی معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte باید شامل کاراکترهای چندبایته باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII باید فقط شامل کاراکترهای اسکی باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII باید فقط شامل کاراکترهای اسکی قابل چاپ باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID باید یک UUID معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 باید یک UUID نسخه 3 معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 باید یک UUID نسخه 4 معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 باید یک UUID نسخه 5 معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID باید یک ULID معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN باید یک شابک معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 باید یک شابک(ISBN-10) معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 باید یک شابک(ISBN-13) معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN باید یک شابک(ISSN) معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes نمیتواند شامل 'text' باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll نمیتواند شامل کاراکترهای '!@#$' باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune نمیتواند شامل '☻' باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny باید شامل کاراکترهای '!@#$' باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains باید شامل 'purpose' باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 باید یک متن درمبنای64 معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email باید یک ایمیل معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL باید یک آدرس اینترنتی معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI باید یک URI معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString باید یک کد رنگ RGB باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString باید یک کد رنگ RGBA باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString باید یک کد رنگ HSL باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString باید یک کد رنگ HSLA باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString باید یک عدد درمبنای16 باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString باید یک کد رنگ HEX باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString باید یک عدد معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString باید یک عدد معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString میتواند فقط شامل حروف و اعداد باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString میتواند فقط شامل حروف باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"طول LtFieldString باید کمتر از MaxString باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"طول LteFieldString باید کمتر یا برابر MaxString باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"طول GtFieldString باید بیشتر از MaxString باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"طول GteFieldString باید بیشتر یا برابر MaxString باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString نمیتواند برابر EqFieldString باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"طول LtCSFieldString باید کمتر از Inner.LtCSFieldString باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"طول LteCSFieldString باید کمتر یا برابر Inner.LteCSFieldString باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"طول GtCSFieldString باید بیشتر از Inner.GtCSFieldString باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"طول GteCSFieldString باید بیشتر یا برابر Inner.GteCSFieldString باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString نمیتواند برابر Inner.NeCSFieldString باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString باید برابر Inner.EqCSFieldString باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString باید برابر MaxString باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"طول GteString باید حداقل 3 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber باید بیشتر یا برابر 5.56 باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple باید شامل حداقل 2 آیتم باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime باید بعد یا برابر تاریخ و زمان کنونی باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"طول GtString باید بیشتر از 3 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber باید بیشتر از 5.56 باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple باید دارای بیشتر از 2 آیتم باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime باید بعد از تاریخ و زمان کنونی باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"طول LteString باید حداکثر 3 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber باید کمتر یا برابر 5.56 باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple باید حداکثر شامل 2 آیتم باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime باید قبل یا برابر تاریخ و زمان کنونی باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"طول LtString باید کمتر از 3 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber باید کمتر از 5.56 باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple باید دارای کمتر از 2 آیتم باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime باید قبل از تاریخ و زمان کنونی باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString نباید برابر  باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber نباید برابر 0.00 باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple نباید برابر 0 باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString برابر 3 نمیباشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber برابر 2.33 نمیباشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple برابر 7 نمیباشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"طول MaxString باید حداکثر 3 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber باید کمتر یا برابر 1,113.00 باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple باید شامل حداکثر 7 آیتم باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"طول MinString باید حداقل 1 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber باید بزرگتر یا برابر 1,113.00 باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple باید شامل حداقل 7 آیتم باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"طول LenString باید 1 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"طول LenNumber باید برابر 1,113.00 باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"تعداد LenMultiple باید برابر 7 آیتم باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"فیلد RequiredString اجباری میباشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"فیلد RequiredNumber اجباری میباشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"فیلد RequiredMultiple اجباری میباشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"طول StrPtrMinLen باید حداقل 10 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"طول StrPtrMaxLen باید حداکثر 1 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"طول StrPtrLen باید 2 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"طول StrPtrLt باید کمتر از 1 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"طول StrPtrLte باید حداکثر 1 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"طول StrPtrGt باید بیشتر از 10 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"طول StrPtrGte باید حداقل 10 کاراکتر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString باید یکی از مقادیر [red green] باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt باید یکی از مقادیر [5 63] باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice باید شامل مقادیر منحصربفرد باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray باید شامل مقادیر منحصربفرد باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap باید شامل مقادیر منحصربفرد باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JSONString\",\n\t\t\texpected: \"JSONString باید یک json معتبر باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"LowercaseString باید یک متن با حروف کوچک باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"UppercaseString باید یک متن با حروف بزرگ باشد\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"فرمت Datetime با 2006-01-02 سازگار نیست\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCode\",\n\t\t\texpected: \"PostCode یک کدپستی معتبر کشور SG نیست\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCodeByField\",\n\t\t\texpected: \"PostCodeByField یک کدپستی معتبر کشور فیلد PostCodeCountry نیست\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image باید یک تصویر معتبر باشد\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/fr/fr.go",
    "content": "package fr\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} est un champ obligatoire\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} doit faire une taille de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} caractère\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} caractères\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} doit être égal à {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-elements\", \"{0} doit contenir {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"len-elements-element\", \"{0} element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-elements-element\", \"{0} elements\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-elements-element\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-elements\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} doit faire une taille minimum de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} caractère\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} caractères\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} doit être égal à {1} ou plus\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-elements\", \"{0} doit contenir au moins {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"min-elements-element\", \"{0} element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-elements-element\", \"{0} elements\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-elements-element\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-elements\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} doit faire une taille maximum de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} caractère\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} caractères\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} doit être égal à {1} ou moins\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-elements\", \"{0} doit contenir au maximum {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"max-elements-element\", \"{0} element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-elements-element\", \"{0} elements\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-elements-element\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-elements\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0} n'est pas égal à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0} ne doit pas être égal à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} doit avoir une taille inférieure à {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} caractère\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} caractères\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} doit être inférieur à {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-elements\", \"{0} doit contenir mois de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-elements-element\", \"{0} element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-elements-element\", \"{0} elements\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} doit être avant la date et l'heure actuelle\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-elements-element\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-elements\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} doit faire une taille maximum de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} caractère\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} caractères\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} doit faire {1} ou moins\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-elements\", \"{0} doit contenir un maximum de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-elements-element\", \"{0} element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-elements-element\", \"{0} elements\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} doit être avant ou pendant la date et l'heure actuelle\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-elements-element\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-elements\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} doit avoir une taille supérieur à {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} caractère\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} caractères\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} doit être supérieur à {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-elements\", \"{0} doit contenir plus de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-elements-element\", \"{0} element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-elements-element\", \"{0} elements\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} doit être après la date et l'heure actuelle\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-elements-element\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-elements\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} doit faire une taille d'au moins {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} caractère\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} caractères\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} doit être {1} ou plus\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-elements\", \"{0} doit contenir au moins {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-elements-element\", \"{0} element\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-elements-element\", \"{0} elements\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} doit être après ou pendant la date et l'heure actuelle\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-elements-element\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-elements\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0} doit être égal à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0} doit être égal à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0} ne doit pas être égal à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0} doit être supérieur à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0} doit être supérieur ou égal à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0} doit être inférieur à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0} doit être inférieur ou égal à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0} ne doit pas être égal à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0} doit être supérieur à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0} doit être supérieur ou égal à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0} doit être inférieur à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0} doit être inférieur ou égal à {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} ne doit contenir que des caractères alphabétiques\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} ne doit contenir que des caractères alphanumériques\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} doit être une valeur numérique valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} doit être un nombre valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} doit être une chaîne de caractères au format hexadécimal valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} doit être une couleur au format HEX valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} doit être une couleur au format RGB valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} doit être une couleur au format RGBA valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} doit être une couleur au format HSL valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} doit être une couleur au format HSLA valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} doit être une adresse email valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} doit être une URL valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} doit être une URI valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} doit être une chaîne de caractères au format Base64 valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0} doit contenir le texte '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0} doit contenir au moins l' un des caractères suivants '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0} ne doit pas contenir le texte '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0} ne doit pas contenir l'un des caractères suivants '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0} ne doit pas contenir ce qui suit '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} doit être un numéro ISBN valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} doit être un numéro ISBN-10 valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} doit être un numéro ISBN-13 valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} doit être un numéro ISSN valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} doit être un UUID valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} doit être un UUID version 3 valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} doit être un UUID version 4 valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} doit être un UUID version 5 valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} doit être une ULID valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} ne doit contenir que des caractères ascii\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} ne doit contenir que des caractères ascii affichables\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} doit contenir des caractères multioctets\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} doit contenir une URI data valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} doit contenir des coordonnées latitude valides\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} doit contenir des coordonnées longitudes valides\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} doit être un numéro SSN valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} doit être une adressse IPv4 valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} doit être une adressse IPv6 valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} doit être une adressse IP valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} doit contenir une notation CIDR valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} doit contenir une notation CIDR valide pour une adresse IPv4\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} doit contenir une notation CIDR valide pour une adresse IPv6\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} doit être une adressse TCP valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} doit être une adressse IPv4 TCP valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} doit être une adressse IPv6 TCP valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} doit être une adressse UDP valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} doit être une adressse IPv4 UDP valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} doit être une adressse IPv6 UDP valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} doit être une adresse IP résolvable\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} doit être une adresse IPv4 résolvable\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} doit être une adresse IPv6 résolvable\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} doit être une adresse UNIX résolvable\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} doit contenir une adresse MAC valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} doit être une couleur valide\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0} doit être l'un des choix suivants [{1}]\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} doit être une image valide\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/fr/fr_test.go",
    "content": "package fr\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tfrench \"github.com/go-playground/locales/fr\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tfre := french.New()\n\tuni := ut.New(fre, fre)\n\ttrans, _ := uni.GetTranslator(\"fr\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t}\n\n\ttype Test struct {\n\t\tInner             Inner\n\t\tRequiredString    string    `validate:\"required\"`\n\t\tRequiredNumber    int       `validate:\"required\"`\n\t\tRequiredMultiple  []string  `validate:\"required\"`\n\t\tLenString         string    `validate:\"len=1\"`\n\t\tLenNumber         float64   `validate:\"len=1113.00\"`\n\t\tLenMultiple       []string  `validate:\"len=7\"`\n\t\tMinString         string    `validate:\"min=1\"`\n\t\tMinNumber         float64   `validate:\"min=1113.00\"`\n\t\tMinMultiple       []string  `validate:\"min=7\"`\n\t\tMaxString         string    `validate:\"max=3\"`\n\t\tMaxNumber         float64   `validate:\"max=1113.00\"`\n\t\tMaxMultiple       []string  `validate:\"max=7\"`\n\t\tEqString          string    `validate:\"eq=3\"`\n\t\tEqNumber          float64   `validate:\"eq=2.33\"`\n\t\tEqMultiple        []string  `validate:\"eq=7\"`\n\t\tNeString          string    `validate:\"ne=\"`\n\t\tNeNumber          float64   `validate:\"ne=0.00\"`\n\t\tNeMultiple        []string  `validate:\"ne=0\"`\n\t\tLtString          string    `validate:\"lt=3\"`\n\t\tLtNumber          float64   `validate:\"lt=5.56\"`\n\t\tLtMultiple        []string  `validate:\"lt=2\"`\n\t\tLtTime            time.Time `validate:\"lt\"`\n\t\tLteString         string    `validate:\"lte=3\"`\n\t\tLteNumber         float64   `validate:\"lte=5.56\"`\n\t\tLteMultiple       []string  `validate:\"lte=2\"`\n\t\tLteTime           time.Time `validate:\"lte\"`\n\t\tGtString          string    `validate:\"gt=3\"`\n\t\tGtNumber          float64   `validate:\"gt=5.56\"`\n\t\tGtMultiple        []string  `validate:\"gt=2\"`\n\t\tGtTime            time.Time `validate:\"gt\"`\n\t\tGteString         string    `validate:\"gte=3\"`\n\t\tGteNumber         float64   `validate:\"gte=5.56\"`\n\t\tGteMultiple       []string  `validate:\"gte=2\"`\n\t\tGteTime           time.Time `validate:\"gte\"`\n\t\tEqFieldString     string    `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString   string    `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString   string    `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString   string    `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString  string    `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString   string    `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString  string    `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString     string    `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString     string    `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString    string    `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString     string    `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString    string    `validate:\"ltefield=MaxString\"`\n\t\tAlphaString       string    `validate:\"alpha\"`\n\t\tAlphanumString    string    `validate:\"alphanum\"`\n\t\tNumericString     string    `validate:\"numeric\"`\n\t\tNumberString      string    `validate:\"number\"`\n\t\tHexadecimalString string    `validate:\"hexadecimal\"`\n\t\tHexColorString    string    `validate:\"hexcolor\"`\n\t\tRGBColorString    string    `validate:\"rgb\"`\n\t\tRGBAColorString   string    `validate:\"rgba\"`\n\t\tHSLColorString    string    `validate:\"hsl\"`\n\t\tHSLAColorString   string    `validate:\"hsla\"`\n\t\tEmail             string    `validate:\"email\"`\n\t\tURL               string    `validate:\"url\"`\n\t\tURI               string    `validate:\"uri\"`\n\t\tBase64            string    `validate:\"base64\"`\n\t\tContains          string    `validate:\"contains=purpose\"`\n\t\tContainsAny       string    `validate:\"containsany=!@#$\"`\n\t\tExcludes          string    `validate:\"excludes=text\"`\n\t\tExcludesAll       string    `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune      string    `validate:\"excludesrune=☻\"`\n\t\tISBN              string    `validate:\"isbn\"`\n\t\tISBN10            string    `validate:\"isbn10\"`\n\t\tISBN13            string    `validate:\"isbn13\"`\n\t\tISSN              string    `validate:\"issn\"`\n\t\tUUID              string    `validate:\"uuid\"`\n\t\tUUID3             string    `validate:\"uuid3\"`\n\t\tUUID4             string    `validate:\"uuid4\"`\n\t\tUUID5             string    `validate:\"uuid5\"`\n\t\tULID              string    `validate:\"ulid\"`\n\t\tASCII             string    `validate:\"ascii\"`\n\t\tPrintableASCII    string    `validate:\"printascii\"`\n\t\tMultiByte         string    `validate:\"multibyte\"`\n\t\tDataURI           string    `validate:\"datauri\"`\n\t\tLatitude          string    `validate:\"latitude\"`\n\t\tLongitude         string    `validate:\"longitude\"`\n\t\tSSN               string    `validate:\"ssn\"`\n\t\tIP                string    `validate:\"ip\"`\n\t\tIPv4              string    `validate:\"ipv4\"`\n\t\tIPv6              string    `validate:\"ipv6\"`\n\t\tCIDR              string    `validate:\"cidr\"`\n\t\tCIDRv4            string    `validate:\"cidrv4\"`\n\t\tCIDRv6            string    `validate:\"cidrv6\"`\n\t\tTCPAddr           string    `validate:\"tcp_addr\"`\n\t\tTCPAddrv4         string    `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6         string    `validate:\"tcp6_addr\"`\n\t\tUDPAddr           string    `validate:\"udp_addr\"`\n\t\tUDPAddrv4         string    `validate:\"udp4_addr\"`\n\t\tUDPAddrv6         string    `validate:\"udp6_addr\"`\n\t\tIPAddr            string    `validate:\"ip_addr\"`\n\t\tIPAddrv4          string    `validate:\"ip4_addr\"`\n\t\tIPAddrv6          string    `validate:\"ip6_addr\"`\n\t\tUinxAddr          string    `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC               string    `validate:\"mac\"`\n\t\tIsColor           string    `validate:\"iscolor\"`\n\t\tStrPtrMinLen      *string   `validate:\"min=10\"`\n\t\tStrPtrMaxLen      *string   `validate:\"max=1\"`\n\t\tStrPtrLen         *string   `validate:\"len=2\"`\n\t\tStrPtrLt          *string   `validate:\"lt=1\"`\n\t\tStrPtrLte         *string   `validate:\"lte=1\"`\n\t\tStrPtrGt          *string   `validate:\"gt=10\"`\n\t\tStrPtrGte         *string   `validate:\"gte=10\"`\n\t\tOneOfString       string    `validate:\"oneof=red green\"`\n\t\tOneOfInt          int       `validate:\"oneof=5 63\"`\n\t\tImage             string    `validate:\"image\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor doit être une couleur valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC doit contenir une adresse MAC valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr doit être une adresse IP résolvable\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 doit être une adresse IPv4 résolvable\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 doit être une adresse IPv6 résolvable\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr doit être une adressse UDP valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 doit être une adressse IPv4 UDP valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 doit être une adressse IPv6 UDP valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr doit être une adressse TCP valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 doit être une adressse IPv4 TCP valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 doit être une adressse IPv6 TCP valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR doit contenir une notation CIDR valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 doit contenir une notation CIDR valide pour une adresse IPv4\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 doit contenir une notation CIDR valide pour une adresse IPv6\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN doit être un numéro SSN valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP doit être une adressse IP valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 doit être une adressse IPv4 valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 doit être une adressse IPv6 valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI doit contenir une URI data valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude doit contenir des coordonnées latitude valides\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude doit contenir des coordonnées longitudes valides\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte doit contenir des caractères multioctets\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII ne doit contenir que des caractères ascii\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII ne doit contenir que des caractères ascii affichables\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID doit être un UUID valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 doit être un UUID version 3 valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 doit être un UUID version 4 valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 doit être un UUID version 5 valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID doit être une ULID valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN doit être un numéro ISBN valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 doit être un numéro ISBN-10 valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 doit être un numéro ISBN-13 valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN doit être un numéro ISSN valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes ne doit pas contenir le texte 'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll ne doit pas contenir l'un des caractères suivants '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune ne doit pas contenir ce qui suit '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny doit contenir au moins l' un des caractères suivants '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains doit contenir le texte 'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 doit être une chaîne de caractères au format Base64 valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email doit être une adresse email valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL doit être une URL valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI doit être une URI valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString doit être une couleur au format RGB valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString doit être une couleur au format RGBA valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString doit être une couleur au format HSL valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString doit être une couleur au format HSLA valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString doit être une chaîne de caractères au format hexadécimal valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString doit être une couleur au format HEX valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString doit être un nombre valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString doit être une valeur numérique valide\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString ne doit contenir que des caractères alphanumériques\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString ne doit contenir que des caractères alphabétiques\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString doit être inférieur à MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString doit être inférieur ou égal à MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString doit être supérieur à MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString doit être supérieur ou égal à MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString ne doit pas être égal à EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString doit être inférieur à Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString doit être inférieur ou égal à Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString doit être supérieur à Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString doit être supérieur ou égal à Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString ne doit pas être égal à Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString doit être égal à Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString doit être égal à MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString doit faire une taille d'au moins 3 caractères\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber doit être 5,56 ou plus\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple doit contenir au moins 2 elements\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime doit être après ou pendant la date et l'heure actuelle\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString doit avoir une taille supérieur à 3 caractères\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber doit être supérieur à 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple doit contenir plus de 2 elements\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime doit être après la date et l'heure actuelle\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString doit faire une taille maximum de 3 caractères\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber doit faire 5,56 ou moins\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple doit contenir un maximum de 2 elements\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime doit être avant ou pendant la date et l'heure actuelle\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString doit avoir une taille inférieure à 3 caractères\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber doit être inférieur à 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple doit contenir mois de 2 elements\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime doit être avant la date et l'heure actuelle\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString ne doit pas être égal à \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber ne doit pas être égal à 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple ne doit pas être égal à 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString n'est pas égal à 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber n'est pas égal à 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple n'est pas égal à 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString doit faire une taille maximum de 3 caractères\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber doit être égal à 1 113,00 ou moins\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple doit contenir au maximum 7 elements\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString doit faire une taille minimum de 1 caractère\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber doit être égal à 1 113,00 ou plus\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple doit contenir au moins 7 elements\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString doit faire une taille de 1 caractère\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber doit être égal à 1 113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple doit contenir 7 elements\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString est un champ obligatoire\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber est un champ obligatoire\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple est un champ obligatoire\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen doit faire une taille minimum de 10 caractères\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen doit faire une taille maximum de 1 caractère\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen doit faire une taille de 2 caractères\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt doit avoir une taille inférieure à 1 caractère\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte doit faire une taille maximum de 1 caractère\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt doit avoir une taille supérieur à 10 caractères\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte doit faire une taille d'au moins 10 caractères\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString doit être l'un des choix suivants [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt doit être l'un des choix suivants [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image doit être une image valide\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/id/id.go",
    "content": "package id\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t// Field Tags\n\t\t{\n\t\t\ttag:             \"eqcsfield\",\n\t\t\ttranslation:     \"{0} harus sama dengan {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"eqfield\",\n\t\t\ttranslation:     \"{0} harus sama dengan {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"fieldcontains\",\n\t\t\ttranslation:     \"{0} harus berisi nilai dari field {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"fieldexcludes\",\n\t\t\ttranslation:     \"{0} tidak boleh berisi nilai dari field {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtcsfield\",\n\t\t\ttranslation:     \"{0} harus lebih besar dari {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtecsfield\",\n\t\t\ttranslation:     \"{0} harus lebih besar dari atau sama dengan {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtefield\",\n\t\t\ttranslation:     \"{0} harus lebih besar dari atau sama dengan {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtfield\",\n\t\t\ttranslation:     \"{0} harus lebih besar dari {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltcsfield\",\n\t\t\ttranslation:     \"{0} harus kurang dari {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltecsfield\",\n\t\t\ttranslation:     \"{0} harus kurang dari atau sama dengan {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltefield\",\n\t\t\ttranslation:     \"{0} harus kurang dari atau sama dengan {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltfield\",\n\t\t\ttranslation:     \"{0} harus kurang dari {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"necsfield\",\n\t\t\ttranslation:     \"{0} tidak sama dengan {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\n\t\t{\n\t\t\ttag:             \"nefield\",\n\t\t\ttranslation:     \"{0} tidak sama dengan {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\n\t\t// Network Tags\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} harus berupa notasi CIDR yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} harus berupa notasi CIDR IPv4 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} harus berupa notasi CIDR IPv6 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} harus berisi URI Data yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"fqdn\",\n\t\t\ttranslation: \"{0} harus berupa FQDN yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hostname\",\n\t\t\ttranslation: \"{0} harus berupa hostname sesuai RFC 952 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hostname_port\",\n\t\t\ttranslation: \"{0} harus berupa hostname dan port yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hostname_rfc1123\",\n\t\t\ttranslation: \"{0} harus berupa hostname sesuai RFC 1123 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} harus berupa alamat IP yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} harus berupa alamat IPv4 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} harus berupa alamat IPv6 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} harus berupa alamat IP yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} harus berupa alamat IPv4 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} harus berupa alamat IPv6 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} harus berisi alamat MAC yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} harus berupa alamat TCP IPv4 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} harus berupa alamat TCP IPv6 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} harus berupa alamat TCP yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} harus berupa alamat IPv4 UDP yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} harus berupa alamat IPv6 UDP yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} harus berupa alamat UDP yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} harus berupa alamat UNIX yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} harus berupa URI yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} harus berupa URL yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"http_url\",\n\t\t\ttranslation: \"{0} harus berupa URL HTTP/HTTPS yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url_encoded\",\n\t\t\ttranslation: \"{0} harus berupa string URL yang terenkode\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"urn_rfc2141\",\n\t\t\ttranslation: \"{0} harus berupa URN sesuai RFC 2141 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\n\t\t// Strings Tags\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} hanya dapat berisi karakter alfanumerik\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} hanya dapat berisi karakter alfanumerik\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphaspace\",\n\t\t\ttranslation: \"{0} hanya dapat berisi karakter alfabet dan spasi\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanumspace\",\n\t\t\ttranslation: \"{0} hanya dapat berisi karakter alfanumerik dan spasi\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanumunicode\",\n\t\t\ttranslation: \"{0} hanya boleh berisi karakter alfanumerik unicode\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphaunicode\",\n\t\t\ttranslation: \"{0} hanya boleh berisi karakter alfanumerik unicode\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} hanya boleh berisi karakter ASCII\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"boolean\",\n\t\t\ttranslation: \"{0} harus berupa nilai boolean yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"contains\",\n\t\t\ttranslation:     \"{0} harus berisi teks '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"containsany\",\n\t\t\ttranslation:     \"{0} harus berisi setidaknya salah satu karakter berikut '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"containsrune\",\n\t\t\ttranslation:     \"{0} harus berisi setidaknya salah satu karakter berikut '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"endsnotwith\",\n\t\t\ttranslation:     \"{0} tidak boleh diakhiri dengan '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"endswith\",\n\t\t\ttranslation:     \"{0} harus diakhiri dengan '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excludes\",\n\t\t\ttranslation:     \"{0} tidak boleh berisi teks '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excludesall\",\n\t\t\ttranslation:     \"{0} tidak boleh berisi salah satu karakter berikut '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excludesrune\",\n\t\t\ttranslation:     \"{0} tidak boleh berisi '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0} harus berupa string huruf kecil\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} harus berisi karakter multibyte\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} harus berupa angka yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} harus berupa nilai numerik yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} hanya boleh berisi karakter ASCII yang dapat dicetak\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"startsnotwith\",\n\t\t\ttranslation:     \"{0} tidak boleh diawali dengan '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"startswith\",\n\t\t\ttranslation:     \"{0} harus diawali dengan '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0} harus berupa string huruf besar\",\n\t\t\toverride:    false,\n\t\t},\n\n\t\t// Format Tags\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} harus berupa heksadesimal yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} harus berupa string Base64 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64url\",\n\t\t\ttranslation: \"{0} harus berupa string Base64 URL yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64rawurl\",\n\t\t\ttranslation: \"{0} harus berupa string Base64 Raw URL yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"bic\",\n\t\t\ttranslation: \"{0} harus berupa kode BIC (SWIFT) yang valid sesuai ISO 9362\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"bcp47_language_tag\",\n\t\t\ttranslation: \"{0} harus berupa tag bahasa BCP 47 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"btc_addr\",\n\t\t\ttranslation: \"{0} harus berupa alamat Bitcoin yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"btc_addr_bech32\",\n\t\t\ttranslation: \"{0} harus berupa alamat Bitcoin Bech32 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"credit_card\",\n\t\t\ttranslation: \"{0} harus berupa nomor kartu kredit yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mongodb\",\n\t\t\ttranslation: \"{0} harus berupa ObjectID MongoDB yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mongodb_connection_string\",\n\t\t\ttranslation: \"{0} harus berupa string koneksi MongoDB yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cron\",\n\t\t\ttranslation: \"{0} harus berupa ekspresi cron yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"spicedb\",\n\t\t\ttranslation: \"{0} harus berupa format SpiceDB yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"datetime\",\n\t\t\ttranslation:     \"{0} tidak sesuai dengan format {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0} harus berupa nomor telepon format E.164 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} harus berupa alamat email yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"eth_addr\",\n\t\t\ttranslation: \"{0} harus berupa alamat Ethereum yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} harus berupa warna HEX yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} harus berupa warna HSL yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} harus berupa warna HSLA yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"html\",\n\t\t\ttranslation: \"{0} harus berupa HTML yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"html_encoded\",\n\t\t\ttranslation: \"{0} harus berupa HTML terenkode yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} harus berupa nomor ISBN yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} harus berupa nomor ISBN-10 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} harus berupa nomor ISBN-13 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} harus berupa nomor ISSN yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iso3166_1_alpha2\",\n\t\t\ttranslation: \"{0} harus berupa kode negara ISO 3166-1 alpha-2 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iso3166_1_alpha3\",\n\t\t\ttranslation: \"{0} harus berupa kode negara ISO 3166-1 alpha-3 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iso3166_1_alpha_numeric\",\n\t\t\ttranslation: \"{0} harus berupa kode negara numerik ISO 3166-1 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iso3166_2\",\n\t\t\ttranslation: \"{0} harus berupa kode subdivisi negara ISO 3166-2 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iso4217\",\n\t\t\ttranslation: \"{0} harus berupa kode mata uang ISO 4217 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0} harus berupa string JSON yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"jwt\",\n\t\t\ttranslation: \"{0} harus berupa JSON Web Token (JWT) yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} harus berisi koordinat lintang yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} harus berisi koordinat bujur yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"luhn_checksum\",\n\t\t\ttranslation: \"{0} harus memiliki checksum Luhn yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"postcode_iso3166_alpha2\",\n\t\t\ttranslation:     \"{0} tidak sesuai dengan format kode pos negara {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"postcode_iso3166_alpha2_field\",\n\t\t\ttranslation:     \"{0} tidak sesuai dengan format kode pos negara dalam field {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} harus berupa warna RGB yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} harus berupa warna RGBA yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} harus berupa nomor SSN (Social Security Number) yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"timezone\",\n\t\t\ttranslation: \"{0} harus berupa zona waktu yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} harus berupa UUID yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} harus berupa UUID versi 3 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3_rfc4122\",\n\t\t\ttranslation: \"{0} harus berupa UUID versi 3 RFC4122 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} harus berupa UUID versi 4 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4_rfc4122\",\n\t\t\ttranslation: \"{0} harus berupa UUID versi 4 RFC4122 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} harus berupa UUID versi 5 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5_rfc4122\",\n\t\t\ttranslation: \"{0} harus berupa UUID versi 5 RFC4122 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid_rfc4122\",\n\t\t\ttranslation: \"{0} harus berupa UUID RFC4122 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"md4\",\n\t\t\ttranslation: \"{0} harus berupa hash MD4 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"md5\",\n\t\t\ttranslation: \"{0} harus berupa hash MD5 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"sha256\",\n\t\t\ttranslation: \"{0} harus berupa hash SHA256 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"sha384\",\n\t\t\ttranslation: \"{0} harus berupa hash SHA384 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"sha512\",\n\t\t\ttranslation: \"{0} harus berupa hash SHA512 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ripemd128\",\n\t\t\ttranslation: \"{0} harus berupa hash RIPEMD128 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ripemd160\",\n\t\t\ttranslation: \"{0} harus berupa hash RIPEMD160 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tiger128\",\n\t\t\ttranslation: \"{0} harus berupa hash TIGER128 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tiger160\",\n\t\t\ttranslation: \"{0} harus berupa hash TIGER160 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tiger192\",\n\t\t\ttranslation: \"{0} harus berupa hash TIGER192 yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"semver\",\n\t\t\ttranslation: \"{0} harus berupa nomor versi semantik yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} harus berupa ULID yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cve\",\n\t\t\ttranslation: \"{0} harus berupa identifikasi CVE yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\n\t\t// Comparisons Tags\n\t\t{\n\t\t\ttag:             \"eq\",\n\t\t\ttranslation:     \"{0} tidak sama dengan {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"eq_ignore_case\",\n\t\t\ttranslation:     \"{0} harus sama dengan {1} (tidak case-sensitive)\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"panjang {0} harus lebih dari {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} harus lebih besar dari {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} harus berisi lebih dari {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} item\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} harus lebih besar dari tanggal & waktu saat ini\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"panjang minimal {0} adalah {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} harus {1} atau lebih besar\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} harus berisi setidaknya {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} item\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} harus lebih besar dari atau sama dengan tanggal & waktu saat ini\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"panjang {0} harus kurang dari {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} harus kurang dari {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} harus berisi kurang dari {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} item\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} harus kurang dari tanggal & waktu saat ini\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"panjang maksimal {0} adalah {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} harus {1} atau kurang\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} harus berisi maksimal {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} item\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} harus kurang dari atau sama dengan tanggal & waktu saat ini\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:             \"ne\",\n\t\t\ttranslation:     \"{0} tidak sama dengan {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ne_ignore_case\",\n\t\t\ttranslation:     \"{0} tidak sama dengan {1} (tidak case-sensitive)\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\n\t\t// Other Tags\n\t\t{\n\t\t\ttag:         \"dir\",\n\t\t\ttranslation: \"{0} harus berupa direktori yang ada\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"dirpath\",\n\t\t\ttranslation: \"{0} harus berupa path direktori yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"file\",\n\t\t\ttranslation: \"{0} harus berupa file yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"filepath\",\n\t\t\ttranslation: \"{0} harus berupa path file yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} harus berupa gambar yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isdefault\",\n\t\t\ttranslation: \"{0} harus berupa nilai default\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"panjang {0} harus {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} harus sama dengan {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} harus berisi {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} item\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\t\t\t\t\tvar c string\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"panjang maksimal {0} adalah {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} harus {1} atau kurang\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} harus berisi maksimal {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} item\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\t\t\t\t\tvar c string\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"panjang minimal {0} adalah {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} harus {1} atau lebih besar\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} harus berisi minimal {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} item\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\t\t\t\t\tvar c string\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:             \"oneof\",\n\t\t\ttranslation:     \"{0} harus berupa salah satu dari [{1}]\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} wajib diisi\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"required_if\",\n\t\t\ttranslation:     \"{0} wajib diisi jika {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"required_unless\",\n\t\t\ttranslation:     \"{0} wajib diisi kecuali {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"required_with\",\n\t\t\ttranslation:     \"{0} wajib diisi jika {1} telah diisi\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"required_with_all\",\n\t\t\ttranslation:     \"{0} wajib diisi jika {1} telah diisi\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"required_without\",\n\t\t\ttranslation:     \"{0} wajib diisi jika {1} tidak diisi\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"required_without_all\",\n\t\t\ttranslation:     \"{0} wajib diisi jika {1} tidak diisi\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excluded_if\",\n\t\t\ttranslation:     \"{0} tidak boleh diisi jika {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excluded_unless\",\n\t\t\ttranslation:     \"{0} tidak boleh diisi kecuali {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excluded_with\",\n\t\t\ttranslation:     \"{0} tidak boleh diisi jika {1} telah diisi\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excluded_with_all\",\n\t\t\ttranslation:     \"{0} tidak boleh diisi jika semua {1} telah diisi\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excluded_without\",\n\t\t\ttranslation:     \"{0} tidak boleh diisi jika {1} tidak diisi\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excluded_without_all\",\n\t\t\ttranslation:     \"{0} tidak boleh diisi jika {1} tidak diisi\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} harus berisi nilai yang unik\",\n\t\t\toverride:    false,\n\t\t},\n\n\t\t// Aliases Tags\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} harus berupa warna yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"country_code\",\n\t\t\ttranslation: \"{0} harus berupa kode negara yang valid\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\t// register translations\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\n// registrationFunc returns a function that can be used for registering translations\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\t\treturn\n\t}\n}\n\n// translateFunc is the default translation function\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\treturn t\n}\n\n// translateFuncWithParam is the default translation function with parameter\nfunc translateFuncWithParam(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/id/id_test.go",
    "content": "package id\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tindonesia \"github.com/go-playground/locales/id\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// InitValidator initializes a new validator with Indonesian translations\nfunc InitValidator() (*validator.Validate, ut.Translator, error) {\n\t// setup translator\n\tidn := indonesia.New()\n\tuni := ut.New(idn, idn)\n\ttrans, _ := uni.GetTranslator(\"id\")\n\n\t// initialize validator\n\tvalidate := validator.New(validator.WithRequiredStructEnabled())\n\n\t// register translations\n\terr := RegisterDefaultTranslations(validate, trans)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\treturn validate, trans, nil\n}\n\n// TestFieldTagsTranslations tests all field tags registered translations for Indonesian language\nfunc TestFieldTagsTranslations(t *testing.T) {\n\t// init validator with Indonesian translations\n\tvalidate, trans, err := InitValidator()\n\tEqual(t, err, nil)\n\n\t// Inner struct for cross-field validations\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t\tFieldContains    string\n\t\tFieldExcludes    string\n\t}\n\n\t// TestFieldTags for field validations\n\ttype TestFieldTags struct {\n\t\tInner Inner\n\n\t\t// Equal field validations\n\t\tEqCSFieldString string `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tEqFieldString   string `validate:\"eqfield=EqString\"`\n\t\tEqString        string\n\n\t\t// Not equal field validations\n\t\tNeCSFieldString string `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tNeFieldString   string `validate:\"nefield=NeString\"`\n\t\tNeString        string\n\n\t\t// Greater than field validations\n\t\tGtCSFieldString string `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGtFieldString   string `validate:\"gtfield=GtString\"`\n\t\tGtString        string\n\n\t\t// Greater than or equal field validations\n\t\tGteCSFieldString string `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tGteFieldString   string `validate:\"gtefield=GteString\"`\n\t\tGteString        string\n\n\t\t// Less than field validations\n\t\tLtCSFieldString string `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLtFieldString   string `validate:\"ltfield=LtString\"`\n\t\tLtString        string\n\n\t\t// Less than or equal field validations\n\t\tLteCSFieldString string `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tLteFieldString   string `validate:\"ltefield=LteString\"`\n\t\tLteString        string\n\n\t\t// Field contains/excludes validations\n\t\tContainsField string `validate:\"fieldcontains=Inner.FieldContains\"`\n\t\tExcludesField string `validate:\"fieldexcludes=Inner.FieldExcludes\"`\n\t}\n\n\t// init test struct with values\n\ttest := TestFieldTags{\n\t\tInner: Inner{\n\t\t\tEqCSFieldString:  \"equal\",\n\t\t\tNeCSFieldString:  \"not-equal\",\n\t\t\tGtCSFieldString:  \"zzz\",\n\t\t\tGteCSFieldString: \"zzz\",\n\t\t\tLtCSFieldString:  \"aaa\",\n\t\t\tLteCSFieldString: \"aaa\",\n\t\t\tFieldContains:    \"contains\",\n\t\t\tFieldExcludes:    \"excludes\",\n\t\t},\n\t\tEqCSFieldString: \"not-equal\", // should equal Inner.EqCSFieldString\n\t\tEqFieldString:   \"not-equal\", // should equal EqString\n\t\tEqString:        \"equal\",\n\n\t\tNeCSFieldString: \"not-equal\", // should not equal Inner.NeCSFieldString\n\t\tNeFieldString:   \"same\",      // should not equal NeString\n\t\tNeString:        \"same\",\n\n\t\tGtCSFieldString: \"aaa\", // should be greater than Inner.GtCSFieldString\n\t\tGtFieldString:   \"aaa\", // should be greater than GtString\n\t\tGtString:        \"zzz\",\n\n\t\tGteCSFieldString: \"aaa\",  // should be greater than or equal to Inner.GteCSFieldString\n\t\tGteFieldString:   \"aaa\",  // should be greater than or equal to GteString\n\t\tGteString:        \"bbbb\", // reference value for GteFieldString\n\n\t\tLtCSFieldString: \"zzz\", // should be less than Inner.LtCSFieldString\n\t\tLtFieldString:   \"zzz\", // should be less than LtString\n\t\tLtString:        \"aaa\",\n\n\t\tLteCSFieldString: \"zzzzz\", // should be less than or equal to Inner.LteCSFieldString\n\t\tLteFieldString:   \"zzzz\",  // should be less than or equal to LteString\n\t\tLteString:        \"yyy\",   // reference value for LteFieldString\n\n\t\tContainsField: \"xyz\",          // should contain Inner.FieldContains\n\t\tExcludesField: \"has-excludes\", // should not contain Inner.FieldExcludes\n\t}\n\n\t// validate struct\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\t// get validation errors\n\terrs := err.(validator.ValidationErrors)\n\n\t// verify each expected error message\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"TestFieldTags.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString harus sama dengan Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFieldTags.EqFieldString\",\n\t\t\texpected: \"EqFieldString harus sama dengan EqString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFieldTags.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString tidak sama dengan Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFieldTags.NeFieldString\",\n\t\t\texpected: \"NeFieldString tidak sama dengan NeString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFieldTags.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString harus lebih besar dari Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFieldTags.GtFieldString\",\n\t\t\texpected: \"GtFieldString harus lebih besar dari GtString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFieldTags.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString harus lebih besar dari atau sama dengan Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFieldTags.GteFieldString\",\n\t\t\texpected: \"GteFieldString harus lebih besar dari atau sama dengan GteString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFieldTags.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString harus kurang dari Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFieldTags.LtFieldString\",\n\t\t\texpected: \"LtFieldString harus kurang dari LtString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFieldTags.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString harus kurang dari atau sama dengan Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFieldTags.LteFieldString\",\n\t\t\texpected: \"LteFieldString harus kurang dari atau sama dengan LteString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFieldTags.ContainsField\",\n\t\t\texpected: \"ContainsField harus berisi nilai dari field Inner.FieldContains\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFieldTags.ExcludesField\",\n\t\t\texpected: \"ExcludesField tidak boleh berisi nilai dari field Inner.FieldExcludes\",\n\t\t},\n\t}\n\n\t// verify each expected error message\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\t// find matching field error\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n\n// TestNetworkTagsTranslations tests all network tags registered translations for Indonesian language\nfunc TestNetworkTagsTranslations(t *testing.T) {\n\t// init validator with Indonesian translations\n\tvalidate, trans, err := InitValidator()\n\tEqual(t, err, nil)\n\n\t// TestNetworkTags for network validations\n\ttype TestNetworkTags struct {\n\t\tCIDR            string `validate:\"cidr\"`\n\t\tCIDRv4          string `validate:\"cidrv4\"`\n\t\tCIDRv6          string `validate:\"cidrv6\"`\n\t\tDataURI         string `validate:\"datauri\"`\n\t\tFQDN            string `validate:\"fqdn\"`\n\t\tHostname        string `validate:\"hostname\"`\n\t\tHostnamePort    string `validate:\"hostname_port\"`\n\t\tHostnameRFC1123 string `validate:\"hostname_rfc1123\"`\n\t\tIP              string `validate:\"ip\"`\n\t\tIP4Addr         string `validate:\"ip4_addr\"`\n\t\tIP6Addr         string `validate:\"ip6_addr\"`\n\t\tIPAddr          string `validate:\"ip_addr\"`\n\t\tIPv4            string `validate:\"ipv4\"`\n\t\tIPv6            string `validate:\"ipv6\"`\n\t\tMAC             string `validate:\"mac\"`\n\t\tTCP4Addr        string `validate:\"tcp4_addr\"`\n\t\tTCP6Addr        string `validate:\"tcp6_addr\"`\n\t\tTCPAddr         string `validate:\"tcp_addr\"`\n\t\tUDP4Addr        string `validate:\"udp4_addr\"`\n\t\tUDP6Addr        string `validate:\"udp6_addr\"`\n\t\tUDPAddr         string `validate:\"udp_addr\"`\n\t\tUnixAddr        string `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tURI             string `validate:\"uri\"`\n\t\tURL             string `validate:\"url\"`\n\t\tHTTPURL         string `validate:\"http_url\"`\n\t\tURLEncoded      string `validate:\"url_encoded\"`\n\t\tURN             string `validate:\"urn_rfc2141\"`\n\t}\n\n\t// init test struct\n\ttest := TestNetworkTags{\n\t\tURLEncoded: \"<%az\", // invalid URL encoded string\n\t}\n\n\t// validate struct\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\t// get validation errors\n\terrs := err.(validator.ValidationErrors)\n\n\t// verify each expected error message\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"TestNetworkTags.CIDR\",\n\t\t\texpected: \"CIDR harus berupa notasi CIDR yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.CIDRv4\",\n\t\t\texpected: \"CIDRv4 harus berupa notasi CIDR IPv4 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.CIDRv6\",\n\t\t\texpected: \"CIDRv6 harus berupa notasi CIDR IPv6 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.DataURI\",\n\t\t\texpected: \"DataURI harus berisi URI Data yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.FQDN\",\n\t\t\texpected: \"FQDN harus berupa FQDN yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.Hostname\",\n\t\t\texpected: \"Hostname harus berupa hostname sesuai RFC 952 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.HostnamePort\",\n\t\t\texpected: \"HostnamePort harus berupa hostname dan port yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.HostnameRFC1123\",\n\t\t\texpected: \"HostnameRFC1123 harus berupa hostname sesuai RFC 1123 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.IP\",\n\t\t\texpected: \"IP harus berupa alamat IP yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.IP4Addr\",\n\t\t\texpected: \"IP4Addr harus berupa alamat IPv4 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.IP6Addr\",\n\t\t\texpected: \"IP6Addr harus berupa alamat IPv6 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.IPAddr\",\n\t\t\texpected: \"IPAddr harus berupa alamat IP yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.IPv4\",\n\t\t\texpected: \"IPv4 harus berupa alamat IPv4 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.IPv6\",\n\t\t\texpected: \"IPv6 harus berupa alamat IPv6 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.MAC\",\n\t\t\texpected: \"MAC harus berisi alamat MAC yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.TCP4Addr\",\n\t\t\texpected: \"TCP4Addr harus berupa alamat TCP IPv4 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.TCP6Addr\",\n\t\t\texpected: \"TCP6Addr harus berupa alamat TCP IPv6 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.TCPAddr\",\n\t\t\texpected: \"TCPAddr harus berupa alamat TCP yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.UDP4Addr\",\n\t\t\texpected: \"UDP4Addr harus berupa alamat IPv4 UDP yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.UDP6Addr\",\n\t\t\texpected: \"UDP6Addr harus berupa alamat IPv6 UDP yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.UDPAddr\",\n\t\t\texpected: \"UDPAddr harus berupa alamat UDP yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.URI\",\n\t\t\texpected: \"URI harus berupa URI yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.URL\",\n\t\t\texpected: \"URL harus berupa URL yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.HTTPURL\",\n\t\t\texpected: \"HTTPURL harus berupa URL HTTP/HTTPS yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.URLEncoded\",\n\t\t\texpected: \"URLEncoded harus berupa string URL yang terenkode\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestNetworkTags.URN\",\n\t\t\texpected: \"URN harus berupa URN sesuai RFC 2141 yang valid\",\n\t\t},\n\t}\n\n\t// verify each expected error message\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\t// find matching field error\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n\n// TestStringTagsTranslations tests all string tags registered translations for Indonesian language\nfunc TestStringTagsTranslations(t *testing.T) {\n\t// init validator with Indonesian translations\n\tvalidate, trans, err := InitValidator()\n\tEqual(t, err, nil)\n\n\t// TestStringTags for string validations\n\ttype TestStringTags struct {\n\t\tAlpha         string `validate:\"alpha\"`\n\t\tAlphaspace    string `validate:\"alphaspace\"`\n\t\tAlphanumspace string `validate:\"alphanumspace\"`\n\t\tAlphanum      string `validate:\"alphanum\"`\n\t\tAlphanumUni   string `validate:\"alphanumunicode\"`\n\t\tAlphaUni      string `validate:\"alphaunicode\"`\n\t\tASCII         string `validate:\"ascii\"`\n\t\tBoolean       string `validate:\"boolean\"`\n\t\tContains      string `validate:\"contains=test\"`\n\t\tContainsAny   string `validate:\"containsany=!@#\"`\n\t\tContainsRune  string `validate:\"containsrune=☺\"`\n\t\tEndsNotWith   string `validate:\"endsnotwith=end\"`\n\t\tEndsWith      string `validate:\"endswith=end\"`\n\t\tExcludes      string `validate:\"excludes=exclude\"`\n\t\tExcludesAll   string `validate:\"excludesall=!@#\"`\n\t\tExcludesRune  string `validate:\"excludesrune=☺\"`\n\t\tLowercase     string `validate:\"lowercase\"`\n\t\tMultibyte     string `validate:\"multibyte\"`\n\t\tNumber        string `validate:\"number\"`\n\t\tNumeric       string `validate:\"numeric\"`\n\t\tPrintASCII    string `validate:\"printascii\"`\n\t\tStartsNotWith string `validate:\"startsnotwith=start\"`\n\t\tStartsWith    string `validate:\"startswith=start\"`\n\t\tUppercase     string `validate:\"uppercase\"`\n\t}\n\n\t// init test struct with invalid values\n\ttest := TestStringTags{\n\t\tAlpha:         \"123\",                // should only contain letters\n\t\tAlphaspace:    \"abc3\",               // should only contain letters and spaces\n\t\tAlphanumspace: \"abc!\",               // should only contain letters, numbers, and spaces\n\t\tAlphanum:      \"!@#\",                // should only contain letters and numbers\n\t\tAlphanumUni:   \"!@#\",                // should only contain unicode letters and numbers\n\t\tAlphaUni:      \"123\",                // should only contain unicode letters\n\t\tASCII:         \"ñ\",                  // should only contain ASCII characters\n\t\tBoolean:       \"invalid\",            // should be a valid boolean\n\t\tContains:      \"invalid\",            // should contain \"test\"\n\t\tContainsAny:   \"abc\",                // should contain any of \"!@#\"\n\t\tContainsRune:  \"abc\",                // should contain \"☺\"\n\t\tEndsNotWith:   \"test-end\",           // should not end with \"end\"\n\t\tEndsWith:      \"test-no-start\",      // should end with \"end\"\n\t\tExcludes:      \"has-exclude-here\",   // should not contain \"exclude\"\n\t\tExcludesAll:   \"test!@#\",            // should not contain any of \"!@#\"\n\t\tExcludesRune:  \"test☺here\",          // should not contain \"☺\"\n\t\tLowercase:     \"TEST\",               // should be lowercase\n\t\tMultibyte:     \"abc\",                // should contain multibyte characters\n\t\tNumber:        \"abc\",                // should be a valid number\n\t\tNumeric:       \"abc\",                // should be numeric\n\t\tPrintASCII:    string([]byte{0x7f}), // should only contain printable ASCII\n\t\tStartsNotWith: \"start-test\",         // should not start with \"start\"\n\t\tStartsWith:    \"test-no-start\",      // should start with \"start\"\n\t\tUppercase:     \"test\",               // should be uppercase\n\t}\n\n\t// validate struct\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\t// get validation errors\n\terrs := err.(validator.ValidationErrors)\n\n\t// verify each expected error message\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"TestStringTags.Alpha\",\n\t\t\texpected: \"Alpha hanya dapat berisi karakter alfanumerik\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.Alphaspace\",\n\t\t\texpected: \"Alphaspace hanya dapat berisi karakter alfabet dan spasi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.Alphanumspace\",\n\t\t\texpected: \"Alphanumspace hanya dapat berisi karakter alfanumerik dan spasi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.Alphanum\",\n\t\t\texpected: \"Alphanum hanya dapat berisi karakter alfanumerik\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.AlphanumUni\",\n\t\t\texpected: \"AlphanumUni hanya boleh berisi karakter alfanumerik unicode\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.AlphaUni\",\n\t\t\texpected: \"AlphaUni hanya boleh berisi karakter alfanumerik unicode\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.ASCII\",\n\t\t\texpected: \"ASCII hanya boleh berisi karakter ASCII\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.Boolean\",\n\t\t\texpected: \"Boolean harus berupa nilai boolean yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.Contains\",\n\t\t\texpected: \"Contains harus berisi teks 'test'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.ContainsAny\",\n\t\t\texpected: \"ContainsAny harus berisi setidaknya salah satu karakter berikut '!@#'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.ContainsRune\",\n\t\t\texpected: \"ContainsRune harus berisi setidaknya salah satu karakter berikut '☺'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.EndsNotWith\",\n\t\t\texpected: \"EndsNotWith tidak boleh diakhiri dengan 'end'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.EndsWith\",\n\t\t\texpected: \"EndsWith harus diakhiri dengan 'end'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.Excludes\",\n\t\t\texpected: \"Excludes tidak boleh berisi teks 'exclude'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll tidak boleh berisi salah satu karakter berikut '!@#'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune tidak boleh berisi '☺'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.Lowercase\",\n\t\t\texpected: \"Lowercase harus berupa string huruf kecil\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.Multibyte\",\n\t\t\texpected: \"Multibyte harus berisi karakter multibyte\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.Number\",\n\t\t\texpected: \"Number harus berupa angka yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.Numeric\",\n\t\t\texpected: \"Numeric harus berupa nilai numerik yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.PrintASCII\",\n\t\t\texpected: \"PrintASCII hanya boleh berisi karakter ASCII yang dapat dicetak\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.StartsNotWith\",\n\t\t\texpected: \"StartsNotWith tidak boleh diawali dengan 'start'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.StartsWith\",\n\t\t\texpected: \"StartsWith harus diawali dengan 'start'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestStringTags.Uppercase\",\n\t\t\texpected: \"Uppercase harus berupa string huruf besar\",\n\t\t},\n\t}\n\n\t// verify each expected error message\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\t// find matching field error\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n\n// TestFormatTagsTranslations tests all format tags registered translations for Indonesian language\nfunc TestFormatTagsTranslations(t *testing.T) {\n\t// init validator with Indonesian translations\n\tvalidate, trans, err := InitValidator()\n\tEqual(t, err, nil)\n\n\t// TestFormatTags for format validations\n\ttype TestFormatTags struct {\n\t\tHexadecimal                string `validate:\"hexadecimal\"`\n\t\tBase64                     string `validate:\"base64\"`\n\t\tBase64URL                  string `validate:\"base64url\"`\n\t\tBase64RawURL               string `validate:\"base64rawurl\"`\n\t\tBIC                        string `validate:\"bic\"`\n\t\tBCP47Lang                  string `validate:\"bcp47_language_tag\"`\n\t\tBTCAddr                    string `validate:\"btc_addr\"`\n\t\tBTCAddrBech32              string `validate:\"btc_addr_bech32\"`\n\t\tCreditCard                 string `validate:\"credit_card\"`\n\t\tMongoDB                    string `validate:\"mongodb\"`\n\t\tMongoDBConn                string `validate:\"mongodb_connection_string\"`\n\t\tCron                       string `validate:\"cron\"`\n\t\tSpiceDB                    string `validate:\"spicedb\"`\n\t\tDateTime                   string `validate:\"datetime=2006-01-02\"`\n\t\tE164                       string `validate:\"e164\"`\n\t\tEmail                      string `validate:\"email\"`\n\t\tEthAddr                    string `validate:\"eth_addr\"`\n\t\tHexColor                   string `validate:\"hexcolor\"`\n\t\tHSL                        string `validate:\"hsl\"`\n\t\tHSLA                       string `validate:\"hsla\"`\n\t\tHTML                       string `validate:\"html\"`\n\t\tHTMLEncoded                string `validate:\"html_encoded\"`\n\t\tISBN                       string `validate:\"isbn\"`\n\t\tISBN10                     string `validate:\"isbn10\"`\n\t\tISBN13                     string `validate:\"isbn13\"`\n\t\tISSN                       string `validate:\"issn\"`\n\t\tISO3166Alpha2              string `validate:\"iso3166_1_alpha2\"`\n\t\tISO3166Alpha3              string `validate:\"iso3166_1_alpha3\"`\n\t\tISO3166AlphaNumeric        string `validate:\"iso3166_1_alpha_numeric\"`\n\t\tISO31662                   string `validate:\"iso3166_2\"`\n\t\tISO4217                    string `validate:\"iso4217\"`\n\t\tJSON                       string `validate:\"json\"`\n\t\tJWT                        string `validate:\"jwt\"`\n\t\tLatitude                   string `validate:\"latitude\"`\n\t\tLongitude                  string `validate:\"longitude\"`\n\t\tLuhnChecksum               string `validate:\"luhn_checksum\"`\n\t\tPostcodeISO3166Alpha2      string `validate:\"postcode_iso3166_alpha2\"`\n\t\tPostcodeISO3166Alpha2Field string `validate:\"postcode_iso3166_alpha2_field\"`\n\t\tRGB                        string `validate:\"rgb\"`\n\t\tRGBA                       string `validate:\"rgba\"`\n\t\tSSN                        string `validate:\"ssn\"`\n\t\tTimezone                   string `validate:\"timezone\"`\n\t\tUUID                       string `validate:\"uuid\"`\n\t\tUUID3                      string `validate:\"uuid3\"`\n\t\tUUID3RFC4122               string `validate:\"uuid3_rfc4122\"`\n\t\tUUID4                      string `validate:\"uuid4\"`\n\t\tUUID4RFC4122               string `validate:\"uuid4_rfc4122\"`\n\t\tUUID5                      string `validate:\"uuid5\"`\n\t\tUUID5RFC4122               string `validate:\"uuid5_rfc4122\"`\n\t\tUUIDRFC4122                string `validate:\"uuid_rfc4122\"`\n\t\tMD4                        string `validate:\"md4\"`\n\t\tMD5                        string `validate:\"md5\"`\n\t\tSHA256                     string `validate:\"sha256\"`\n\t\tSHA384                     string `validate:\"sha384\"`\n\t\tSHA512                     string `validate:\"sha512\"`\n\t\tRIPEMD128                  string `validate:\"ripemd128\"`\n\t\tRIPEMD160                  string `validate:\"ripemd160\"`\n\t\tTiger128                   string `validate:\"tiger128\"`\n\t\tTiger160                   string `validate:\"tiger160\"`\n\t\tTiger192                   string `validate:\"tiger192\"`\n\t\tSemver                     string `validate:\"semver\"`\n\t\tULID                       string `validate:\"ulid\"`\n\t\tCVE                        string `validate:\"cve\"`\n\t}\n\n\t// init test struct with invalid values\n\ttest := TestFormatTags{}\n\n\t// validate struct\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\t// get validation errors\n\terrs := err.(validator.ValidationErrors)\n\n\t// verify each expected error message\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"TestFormatTags.Hexadecimal\",\n\t\t\texpected: \"Hexadecimal harus berupa heksadesimal yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.Base64\",\n\t\t\texpected: \"Base64 harus berupa string Base64 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.Base64URL\",\n\t\t\texpected: \"Base64URL harus berupa string Base64 URL yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.Base64RawURL\",\n\t\t\texpected: \"Base64RawURL harus berupa string Base64 Raw URL yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.BIC\",\n\t\t\texpected: \"BIC harus berupa kode BIC (SWIFT) yang valid sesuai ISO 9362\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.BCP47Lang\",\n\t\t\texpected: \"BCP47Lang harus berupa tag bahasa BCP 47 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.BTCAddr\",\n\t\t\texpected: \"BTCAddr harus berupa alamat Bitcoin yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.BTCAddrBech32\",\n\t\t\texpected: \"BTCAddrBech32 harus berupa alamat Bitcoin Bech32 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.CreditCard\",\n\t\t\texpected: \"CreditCard harus berupa nomor kartu kredit yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.MongoDB\",\n\t\t\texpected: \"MongoDB harus berupa ObjectID MongoDB yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.MongoDBConn\",\n\t\t\texpected: \"MongoDBConn harus berupa string koneksi MongoDB yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.Cron\",\n\t\t\texpected: \"Cron harus berupa ekspresi cron yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.SpiceDB\",\n\t\t\texpected: \"SpiceDB harus berupa format SpiceDB yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.DateTime\",\n\t\t\texpected: \"DateTime tidak sesuai dengan format 2006-01-02\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.E164\",\n\t\t\texpected: \"E164 harus berupa nomor telepon format E.164 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.Email\",\n\t\t\texpected: \"Email harus berupa alamat email yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.EthAddr\",\n\t\t\texpected: \"EthAddr harus berupa alamat Ethereum yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.HexColor\",\n\t\t\texpected: \"HexColor harus berupa warna HEX yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.HSL\",\n\t\t\texpected: \"HSL harus berupa warna HSL yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.HSLA\",\n\t\t\texpected: \"HSLA harus berupa warna HSLA yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.HTML\",\n\t\t\texpected: \"HTML harus berupa HTML yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.HTMLEncoded\",\n\t\t\texpected: \"HTMLEncoded harus berupa HTML terenkode yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.ISBN\",\n\t\t\texpected: \"ISBN harus berupa nomor ISBN yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.ISBN10\",\n\t\t\texpected: \"ISBN10 harus berupa nomor ISBN-10 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.ISBN13\",\n\t\t\texpected: \"ISBN13 harus berupa nomor ISBN-13 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.ISSN\",\n\t\t\texpected: \"ISSN harus berupa nomor ISSN yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.ISO3166Alpha2\",\n\t\t\texpected: \"ISO3166Alpha2 harus berupa kode negara ISO 3166-1 alpha-2 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.ISO3166Alpha3\",\n\t\t\texpected: \"ISO3166Alpha3 harus berupa kode negara ISO 3166-1 alpha-3 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.ISO3166AlphaNumeric\",\n\t\t\texpected: \"ISO3166AlphaNumeric harus berupa kode negara numerik ISO 3166-1 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.ISO31662\",\n\t\t\texpected: \"ISO31662 harus berupa kode subdivisi negara ISO 3166-2 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.ISO4217\",\n\t\t\texpected: \"ISO4217 harus berupa kode mata uang ISO 4217 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.JSON\",\n\t\t\texpected: \"JSON harus berupa string JSON yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.JWT\",\n\t\t\texpected: \"JWT harus berupa JSON Web Token (JWT) yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.Latitude\",\n\t\t\texpected: \"Latitude harus berisi koordinat lintang yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.Longitude\",\n\t\t\texpected: \"Longitude harus berisi koordinat bujur yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.LuhnChecksum\",\n\t\t\texpected: \"LuhnChecksum harus memiliki checksum Luhn yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.PostcodeISO3166Alpha2\",\n\t\t\texpected: \"PostcodeISO3166Alpha2 tidak sesuai dengan format kode pos negara \",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.PostcodeISO3166Alpha2Field\",\n\t\t\texpected: \"PostcodeISO3166Alpha2Field tidak sesuai dengan format kode pos negara dalam field \",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.RGB\",\n\t\t\texpected: \"RGB harus berupa warna RGB yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.RGBA\",\n\t\t\texpected: \"RGBA harus berupa warna RGBA yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.SSN\",\n\t\t\texpected: \"SSN harus berupa nomor SSN (Social Security Number) yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.Timezone\",\n\t\t\texpected: \"Timezone harus berupa zona waktu yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.UUID\",\n\t\t\texpected: \"UUID harus berupa UUID yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.UUID3\",\n\t\t\texpected: \"UUID3 harus berupa UUID versi 3 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.UUID3RFC4122\",\n\t\t\texpected: \"UUID3RFC4122 harus berupa UUID versi 3 RFC4122 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.UUID4\",\n\t\t\texpected: \"UUID4 harus berupa UUID versi 4 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.UUID4RFC4122\",\n\t\t\texpected: \"UUID4RFC4122 harus berupa UUID versi 4 RFC4122 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.UUID5\",\n\t\t\texpected: \"UUID5 harus berupa UUID versi 5 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.UUID5RFC4122\",\n\t\t\texpected: \"UUID5RFC4122 harus berupa UUID versi 5 RFC4122 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.UUIDRFC4122\",\n\t\t\texpected: \"UUIDRFC4122 harus berupa UUID RFC4122 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.MD4\",\n\t\t\texpected: \"MD4 harus berupa hash MD4 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.MD5\",\n\t\t\texpected: \"MD5 harus berupa hash MD5 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.SHA256\",\n\t\t\texpected: \"SHA256 harus berupa hash SHA256 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.SHA384\",\n\t\t\texpected: \"SHA384 harus berupa hash SHA384 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.SHA512\",\n\t\t\texpected: \"SHA512 harus berupa hash SHA512 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.RIPEMD128\",\n\t\t\texpected: \"RIPEMD128 harus berupa hash RIPEMD128 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.RIPEMD160\",\n\t\t\texpected: \"RIPEMD160 harus berupa hash RIPEMD160 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.Tiger128\",\n\t\t\texpected: \"Tiger128 harus berupa hash TIGER128 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.Tiger160\",\n\t\t\texpected: \"Tiger160 harus berupa hash TIGER160 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.Tiger192\",\n\t\t\texpected: \"Tiger192 harus berupa hash TIGER192 yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.Semver\",\n\t\t\texpected: \"Semver harus berupa nomor versi semantik yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.ULID\",\n\t\t\texpected: \"ULID harus berupa ULID yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestFormatTags.CVE\",\n\t\t\texpected: \"CVE harus berupa identifikasi CVE yang valid\",\n\t\t},\n\t}\n\n\t// verify each expected error message\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\t// find matching field error\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n\n// TestComparisonTagsTranslations tests all comparison tags registered translations for Indonesian language\nfunc TestComparisonTagsTranslations(t *testing.T) {\n\t// init validator with Indonesian translations\n\tvalidate, trans, err := InitValidator()\n\tEqual(t, err, nil)\n\n\t// TestComparisonTags for comparison validations\n\ttype TestComparisonTags struct {\n\t\t// Equal comparisons\n\t\tEqString     string `validate:\"eq=test\"`\n\t\tEqNumber     int    `validate:\"eq=10\"`\n\t\tEqIgnoreCase string `validate:\"eq_ignore_case=Test\"`\n\n\t\t// Not equal comparisons\n\t\tNeString     string `validate:\"ne=test\"`\n\t\tNeNumber     int    `validate:\"ne=10\"`\n\t\tNeIgnoreCase string `validate:\"ne_ignore_case=Test\"`\n\n\t\t// Greater than comparisons\n\t\tGtString string    `validate:\"gt=5\"` // length > 5\n\t\tGtNumber float64   `validate:\"gt=10.5\"`\n\t\tGtTime   time.Time `validate:\"gt\"`\n\t\tGtSlice  []string  `validate:\"gt=1\"` // length > 1\n\n\t\t// Greater than or equal comparisons\n\t\tGteString string    `validate:\"gte=5\"` // length >= 5\n\t\tGteNumber float64   `validate:\"gte=10.5\"`\n\t\tGteTime   time.Time `validate:\"gte\"`\n\t\tGteSlice  []string  `validate:\"gte=1\"` // length >= 1\n\n\t\t// Less than comparisons\n\t\tLtString string    `validate:\"lt=5\"` // length < 5\n\t\tLtNumber float64   `validate:\"lt=10.5\"`\n\t\tLtTime   time.Time `validate:\"lt\"`\n\t\tLtSlice  []string  `validate:\"lt=2\"` // length < 1\n\n\t\t// Less than or equal comparisons\n\t\tLteString string    `validate:\"lte=5\"` // length <= 5\n\t\tLteNumber float64   `validate:\"lte=10.5\"`\n\t\tLteTime   time.Time `validate:\"lte\"`\n\t\tLteSlice  []string  `validate:\"lte=1\"` // length <= 1\n\t}\n\n\t// init test struct with invalid values\n\tnow := time.Now()\n\ttest := TestComparisonTags{\n\t\tEqString:     \"not-test\",\n\t\tEqNumber:     20,\n\t\tEqIgnoreCase: \"not-test\",\n\n\t\tNeString:     \"test\",\n\t\tNeNumber:     10,\n\t\tNeIgnoreCase: \"Test\",\n\n\t\tGtString: \"abc\",               // length = 3, should be > 5\n\t\tGtNumber: 5.5,                 // should be > 10.5\n\t\tGtTime:   now.Add(-time.Hour), // should be > now\n\n\t\tGteString: \"abc\",               // length = 3, should be >= 5\n\t\tGteNumber: 5.5,                 // should be >= 10.5\n\t\tGteTime:   now.Add(-time.Hour), // should be >= now\n\n\t\tLtString: \"toolong\",               // length = 7, should be < 5\n\t\tLtNumber: 15.5,                    // should be < 10.5\n\t\tLtTime:   now.Add(time.Hour),      // should be < now\n\t\tLtSlice:  []string{\"satu\", \"dua\"}, // should be < 2\n\n\t\tLteString: \"toolong\",               // length = 7, should be <= 5\n\t\tLteNumber: 15.5,                    // should be <= 10.5\n\t\tLteTime:   now.Add(time.Hour),      // should be <= now\n\t\tLteSlice:  []string{\"satu\", \"dua\"}, // should be <= 1\n\t}\n\n\t// validate struct\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\t// get validation errors\n\terrs := err.(validator.ValidationErrors)\n\n\t// verify each expected error message\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"TestComparisonTags.EqString\",\n\t\t\texpected: \"EqString tidak sama dengan test\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.EqNumber\",\n\t\t\texpected: \"EqNumber tidak sama dengan 10\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.EqIgnoreCase\",\n\t\t\texpected: \"EqIgnoreCase harus sama dengan Test (tidak case-sensitive)\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.NeString\",\n\t\t\texpected: \"NeString tidak sama dengan test\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.NeNumber\",\n\t\t\texpected: \"NeNumber tidak sama dengan 10\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.NeIgnoreCase\",\n\t\t\texpected: \"NeIgnoreCase tidak sama dengan Test (tidak case-sensitive)\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.GtString\",\n\t\t\texpected: \"panjang GtString harus lebih dari 5 karakter\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.GtNumber\",\n\t\t\texpected: \"GtNumber harus lebih besar dari 10,5\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.GtTime\",\n\t\t\texpected: \"GtTime harus lebih besar dari tanggal & waktu saat ini\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.GtSlice\",\n\t\t\texpected: \"GtSlice harus berisi lebih dari 1 item\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.GteString\",\n\t\t\texpected: \"panjang minimal GteString adalah 5 karakter\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.GteNumber\",\n\t\t\texpected: \"GteNumber harus 10,5 atau lebih besar\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.GteTime\",\n\t\t\texpected: \"GteTime harus lebih besar dari atau sama dengan tanggal & waktu saat ini\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.GteSlice\",\n\t\t\texpected: \"GteSlice harus berisi setidaknya 1 item\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.LtString\",\n\t\t\texpected: \"panjang LtString harus kurang dari 5 karakter\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.LtNumber\",\n\t\t\texpected: \"LtNumber harus kurang dari 10,5\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.LtTime\",\n\t\t\texpected: \"LtTime harus kurang dari tanggal & waktu saat ini\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.LtSlice\",\n\t\t\texpected: \"LtSlice harus berisi kurang dari 2 item\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.LteString\",\n\t\t\texpected: \"panjang maksimal LteString adalah 5 karakter\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.LteNumber\",\n\t\t\texpected: \"LteNumber harus 10,5 atau kurang\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.LteTime\",\n\t\t\texpected: \"LteTime harus kurang dari atau sama dengan tanggal & waktu saat ini\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestComparisonTags.LteSlice\",\n\t\t\texpected: \"LteSlice harus berisi maksimal 1 item\",\n\t\t},\n\t}\n\n\t// verify each expected error message\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\t// find matching field error\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n\n// TestOtherTagsTranslations tests all other tags registered translations for Indonesian language\nfunc TestOtherTagsTranslations(t *testing.T) {\n\t// init validator with Indonesian translations\n\tvalidate, trans, err := InitValidator()\n\tEqual(t, err, nil)\n\n\t// TestOtherTags for other validations\n\ttype Inner struct {\n\t\tRequiredWith string\n\t\tExcludedWith string\n\t\tField        string\n\t}\n\n\ttype TestOtherTags struct {\n\t\tDir                string   `validate:\"dir\"`\n\t\tDirPath            string   `validate:\"dirpath\"`\n\t\tFile               string   `validate:\"file\"`\n\t\tFilePath           string   `validate:\"filepath\"`\n\t\tImage              string   `validate:\"image\"`\n\t\tLenString          string   `validate:\"len=5\"`\n\t\tLenSlice           []string `validate:\"len=3\"`\n\t\tLenNumber          int      `validate:\"len=10\"`\n\t\tMinString          string   `validate:\"min=3\"`\n\t\tMinSlice           []string `validate:\"min=1\"`\n\t\tMaxString          string   `validate:\"max=5\"`\n\t\tMaxSlice           []string `validate:\"max=1\"`\n\t\tIsDefault          string   `validate:\"isdefault\"`\n\t\tRequired           string   `validate:\"required\"`\n\t\tRequiredIf         string   `validate:\"required_if=Inner.RequiredWith value\"`\n\t\tRequiredUnless     string   `validate:\"required_unless=Inner.RequiredWith values\"`\n\t\tRequiredWith       string   `validate:\"required_with=Inner.RequiredWith\"`\n\t\tRequiredWithAll    string   `validate:\"required_with_all=Inner.RequiredWith\"`\n\t\tRequiredWithout    string   `validate:\"required_without=Inner.ExcludedWith\"`\n\t\tRequiredWithoutAll string   `validate:\"required_without_all=Inner.ExcludedWith\"`\n\t\tExcludedIf         string   `validate:\"excluded_if=Inner.RequiredWith value\"`\n\t\tExcludedUnless     string   `validate:\"excluded_unless=Inner.ExcludedWith value\"`\n\t\tExcludedWith       string   `validate:\"excluded_with=Inner.RequiredWith\"`\n\t\tExcludedWithAll    string   `validate:\"excluded_with_all=Inner.RequiredWith\"`\n\t\tExcludedWithout    string   `validate:\"excluded_without=Inner.ExcludedWith\"`\n\t\tExcludedWithoutAll string   `validate:\"excluded_without_all=Inner.ExcludedWith\"`\n\t\tOneOf              string   `validate:\"oneof=red green blue\"`\n\t\tUnique             []string `validate:\"unique\"`\n\t\tInner              Inner\n\t}\n\n\t// init test struct with invalid values\n\ttest := TestOtherTags{\n\t\tDir:     \"nonexistent\",\n\t\tDirPath: \"invalid/dir/path\",\n\t\tFile:    \"nonexistent.txt\",\n\t\tImage:   \"not-an-image.txt\",\n\n\t\tLenString: \"toolong\",               // should be exactly 5 chars\n\t\tLenSlice:  []string{\"a\", \"b\"},      // should be exactly 3 items\n\t\tLenNumber: 5,                       // should be 10\n\t\tMinString: \"ab\",                    // should be min 3 chars\n\t\tMinSlice:  []string{},              // should be min 1 item\n\t\tMaxString: \"toolong\",               // should be max 5 chars\n\t\tMaxSlice:  []string{\"satu\", \"dua\"}, // should be max 1 item\n\n\t\tIsDefault: \"non-default\",\n\n\t\tExcludedIf:         \"value\", // should fail when Inner.RequiredWith is \"value\"\n\t\tExcludedUnless:     \"value\", // should fail unless Inner.ExcludedWith is \"value\"\n\t\tExcludedWith:       \"value\", // should fail when Inner.Field is populated\n\t\tExcludedWithAll:    \"value\", // should fail when both Inner.Field and Inner.ExcludedWith are populated\n\t\tExcludedWithout:    \"value\", // should fail when Inner.ExcludedWith is not populated\n\t\tExcludedWithoutAll: \"value\", // should fail when Inner.ExcludedWithoutAll is not populated\n\n\t\tOneOf:  \"yellow\",           // not in [red green blue]\n\t\tUnique: []string{\"a\", \"a\"}, // contains duplicate\n\n\t\tInner: Inner{\n\t\t\tRequiredWith: \"value\", // triggers required_if validation\n\t\t\tExcludedWith: \"\",      // triggers excluded_unless validation\n\t\t},\n\t}\n\n\t// validate struct\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\t// get validation errors\n\terrs := err.(validator.ValidationErrors)\n\n\t// verify each expected error message\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"TestOtherTags.Dir\",\n\t\t\texpected: \"Dir harus berupa direktori yang ada\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.DirPath\",\n\t\t\texpected: \"DirPath harus berupa path direktori yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.File\",\n\t\t\texpected: \"File harus berupa file yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.FilePath\",\n\t\t\texpected: \"FilePath harus berupa path file yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.Image\",\n\t\t\texpected: \"Image harus berupa gambar yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.LenString\",\n\t\t\texpected: \"panjang LenString harus 5 karakter\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.LenSlice\",\n\t\t\texpected: \"LenSlice harus berisi 3 item\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.LenNumber\",\n\t\t\texpected: \"LenNumber harus sama dengan 10\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.MinString\",\n\t\t\texpected: \"panjang minimal MinString adalah 3 karakter\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.MinSlice\",\n\t\t\texpected: \"MinSlice harus berisi minimal 1 item\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.MaxString\",\n\t\t\texpected: \"panjang maksimal MaxString adalah 5 karakter\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.MaxSlice\",\n\t\t\texpected: \"MaxSlice harus berisi maksimal 1 item\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.IsDefault\",\n\t\t\texpected: \"IsDefault harus berupa nilai default\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.Required\",\n\t\t\texpected: \"Required wajib diisi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.RequiredIf\",\n\t\t\texpected: \"RequiredIf wajib diisi jika Inner.RequiredWith value\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.RequiredUnless\",\n\t\t\texpected: \"RequiredUnless wajib diisi kecuali Inner.RequiredWith values\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.RequiredWith\",\n\t\t\texpected: \"RequiredWith wajib diisi jika Inner.RequiredWith telah diisi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.RequiredWithAll\",\n\t\t\texpected: \"RequiredWithAll wajib diisi jika Inner.RequiredWith telah diisi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.RequiredWithout\",\n\t\t\texpected: \"RequiredWithout wajib diisi jika Inner.ExcludedWith tidak diisi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.RequiredWithoutAll\",\n\t\t\texpected: \"RequiredWithoutAll wajib diisi jika Inner.ExcludedWith tidak diisi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.ExcludedIf\",\n\t\t\texpected: \"ExcludedIf tidak boleh diisi jika Inner.RequiredWith value\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.ExcludedUnless\",\n\t\t\texpected: \"ExcludedUnless tidak boleh diisi kecuali Inner.ExcludedWith value\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.ExcludedWith\",\n\t\t\texpected: \"ExcludedWith tidak boleh diisi jika Inner.RequiredWith telah diisi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.ExcludedWithAll\",\n\t\t\texpected: \"ExcludedWithAll tidak boleh diisi jika semua Inner.RequiredWith telah diisi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.ExcludedWithout\",\n\t\t\texpected: \"ExcludedWithout tidak boleh diisi jika Inner.ExcludedWith tidak diisi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.ExcludedWithoutAll\",\n\t\t\texpected: \"ExcludedWithoutAll tidak boleh diisi jika Inner.ExcludedWith tidak diisi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.OneOf\",\n\t\t\texpected: \"OneOf harus berupa salah satu dari [red green blue]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestOtherTags.Unique\",\n\t\t\texpected: \"Unique harus berisi nilai yang unik\",\n\t\t},\n\t}\n\n\t// verify each expected error message\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\t// find matching field error\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n\n// TestAliasesTagsTranslations tests all aliases tags registered translations for Indonesian language\nfunc TestAliasesTagsTranslations(t *testing.T) {\n\t// init validator with Indonesian translations\n\tvalidate, trans, err := InitValidator()\n\tEqual(t, err, nil)\n\n\t// TestAliasTags for alias validations\n\ttype TestAliasTags struct {\n\t\t// Color validations\n\t\tColor     string `validate:\"iscolor\"`\n\t\tHexColor  string `validate:\"hexcolor\"`\n\t\tRGBColor  string `validate:\"rgb\"`\n\t\tRGBAColor string `validate:\"rgba\"`\n\t\tHSLColor  string `validate:\"hsl\"`\n\t\tHSLAColor string `validate:\"hsla\"`\n\n\t\t// Country code validation\n\t\tCountryCode string `validate:\"country_code\"`\n\t\tISO2Code    string `validate:\"iso3166_1_alpha2\"`\n\t\tISO3Code    string `validate:\"iso3166_1_alpha3\"`\n\t}\n\n\t// init test struct with invalid values\n\ttest := TestAliasTags{\n\t\tColor:     \"not-a-color\",\n\t\tHexColor:  \"not-hex\",\n\t\tRGBColor:  \"not-rgb\",\n\t\tRGBAColor: \"not-rgba\",\n\t\tHSLColor:  \"not-hsl\",\n\t\tHSLAColor: \"not-hsla\",\n\n\t\tCountryCode: \"XX\",  // invalid country code\n\t\tISO2Code:    \"XX\",  // invalid ISO 3166-1 alpha-2\n\t\tISO3Code:    \"XXX\", // invalid ISO 3166-1 alpha-3\n\t}\n\n\t// validate struct\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\t// get validation errors\n\terrs := err.(validator.ValidationErrors)\n\n\t// verify each expected error message\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"TestAliasTags.Color\",\n\t\t\texpected: \"Color harus berupa warna yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestAliasTags.HexColor\",\n\t\t\texpected: \"HexColor harus berupa warna HEX yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestAliasTags.RGBColor\",\n\t\t\texpected: \"RGBColor harus berupa warna RGB yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestAliasTags.RGBAColor\",\n\t\t\texpected: \"RGBAColor harus berupa warna RGBA yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestAliasTags.HSLColor\",\n\t\t\texpected: \"HSLColor harus berupa warna HSL yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestAliasTags.HSLAColor\",\n\t\t\texpected: \"HSLAColor harus berupa warna HSLA yang valid\",\n\t\t},\n\t\t{\n\t\t\tns:       \"TestAliasTags.CountryCode\",\n\t\t\texpected: \"CountryCode harus berupa kode negara yang valid\",\n\t\t},\n\t}\n\n\t// verify each expected error message\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\t// find matching field error\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/it/it.go",
    "content": "package it\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} è un campo obbligatorio\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without\",\n\t\t\ttranslation: \"{0} è un campo obbligatorio\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} deve essere lungo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} carattere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} caratteri\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} deve essere uguale a {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} deve contenere {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} elementi\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} deve essere lungo almeno {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} carattere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} caratteri\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} deve essere maggiore o uguale a {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} deve contenere almeno {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} elementi\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} deve essere lungo al massimo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} carattere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} caratteri\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} deve essere minore o uguale a {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} deve contenere al massimo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} elementi\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:             \"eq\",\n\t\t\ttranslation:     \"{0} non è uguale a {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ne\",\n\t\t\ttranslation:     \"{0} deve essere diverso da {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} deve essere lungo meno di {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} carattere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} caratteri\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} deve essere minore di {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} deve contenere meno di {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} elementi\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} deve essere precedente alla Data/Ora corrente\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} deve essere lungo al massimo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} carattere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} caratteri\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} deve essere minore o uguale a {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} deve contenere al massimo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} elementi\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} deve essere uguale o precedente alla Data/Ora corrente\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} deve essere lungo più di {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} carattere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} caratteri\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} deve essere maggiore di {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} deve contenere più di {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} elementi\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} deve essere successivo alla Data/Ora corrente\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} deve essere lungo almeno {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} carattere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} caratteri\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} deve essere maggiore o uguale a {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} deve contenere almeno {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} elemento\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} elementi\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} deve essere uguale o successivo alla Data/Ora corrente\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:             \"eqfield\",\n\t\t\ttranslation:     \"{0} deve essere uguale a {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"eqcsfield\",\n\t\t\ttranslation:     \"{0} deve essere uguale a {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"necsfield\",\n\t\t\ttranslation:     \"{0} deve essere diverso da {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtcsfield\",\n\t\t\ttranslation:     \"{0} deve essere maggiore di {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtecsfield\",\n\t\t\ttranslation:     \"{0} deve essere maggiore o uguale a {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltcsfield\",\n\t\t\ttranslation:     \"{0} deve essere minore di {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltecsfield\",\n\t\t\ttranslation:     \"{0} deve essere minore o uguale a {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"nefield\",\n\t\t\ttranslation:     \"{0} deve essere diverso da {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtfield\",\n\t\t\ttranslation:     \"{0} deve essere maggiore di {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtefield\",\n\t\t\ttranslation:     \"{0} deve essere maggiore o uguale a {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltfield\",\n\t\t\ttranslation:     \"{0} deve essere minore di {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltefield\",\n\t\t\ttranslation:     \"{0} deve essere minore o uguale a {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} può contenere solo caratteri alfabetici\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} può contenere solo caratteri alfanumerici\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} deve essere un valore numerico valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} deve essere un numero valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} deve essere un esadecimale valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} deve essere un colore HEX valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} deve essere un colore RGB valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} deve essere un colore RGBA valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} deve essere un colore HSL valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} deve essere un colore HSLA valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0} deve essere un numero telefonico in formato E.164 valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo email valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} deve essere un URL valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} deve essere un URI valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} deve essere una stringa Base64 valida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"contains\",\n\t\t\ttranslation:     \"{0} deve contenere il testo '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"containsany\",\n\t\t\ttranslation:     \"{0} deve contenere almeno uno dei seguenti caratteri '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excludes\",\n\t\t\ttranslation:     \"{0} non deve contenere il testo '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excludesall\",\n\t\t\ttranslation:     \"{0} non deve contenere alcuno dei seguenti caratteri '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excludesrune\",\n\t\t\ttranslation:     \"{0} non deve contenere '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} deve essere un numero ISBN valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} deve essere un numero ISBN-10 valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} deve essere un numero ISBN-13 valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} deve essere un numero ISSN valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} deve essere un UUID valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} deve essere un UUID versione 3 valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} deve essere un UUID versione 4 valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} deve essere un UUID versione 5 valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} deve essere un ULID valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} deve contenere solo caratteri ascii\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} deve contenere solo caratteri ascii stampabili\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} deve contenere caratteri multibyte\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} deve contenere un Data URI valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} deve contenere una latitudine valida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} deve contenere una longitudine valida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} deve essere un numero SSN valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo IPv4 valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo IPv6 valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo IP valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} deve contenere una notazione CIDR valida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} deve contenere una notazione CIDR per un indirizzo IPv4 valida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} deve contenere una notazione CIDR per un indirizzo IPv6 valida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo TCP valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo IPv4 TCP valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo IPv6 TCP valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo UDP valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo IPv4 UDP valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo IPv6 UDP valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo IP risolvibile\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo IPv4 risolvibile\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo IPv6 risolvibile\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} deve essere un indirizzo UNIX risolvibile\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} deve contenere un indirizzo MAC valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} deve contenere valori unici\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} deve essere un colore valido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cron\",\n\t\t\ttranslation: \"{0} deve essere una stringa cron valida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"oneof\",\n\t\t\ttranslation:     \"{0} deve essere uno di [{1}]\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0} deve essere una stringa json valida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"jwt\",\n\t\t\ttranslation: \"{0} deve essere una stringa jwt valida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0} deve essere una stringa minuscola\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"boolean\",\n\t\t\ttranslation: \"{0} deve rappresentare un valore booleano\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0} deve essere una stringa maiuscola\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"startswith\",\n\t\t\ttranslation:     \"{0} deve iniziare con {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"startsnotwith\",\n\t\t\ttranslation:     \"{0} non deve iniziare con {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"endswith\",\n\t\t\ttranslation:     \"{0} deve terminare con {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"endsnotwith\",\n\t\t\ttranslation:     \"{0} non deve terminare con {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"datetime\",\n\t\t\ttranslation:     \"{0} non corrisponde al formato {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"postcode_iso3166_alpha2\",\n\t\t\ttranslation:     \"{0} non corrisponde al formato del codice postale dello stato {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:             \"postcode_iso3166_alpha2_field\",\n\t\t\ttranslation:     \"{0} non corrisponde al formato del codice postale dello stato nel campo {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: customTransFuncV1,\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} deve essere un'immagine valida\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n\nfunc customTransFuncV1(ut ut.Translator, fe validator.FieldError) string {\n\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "translations/it/it_test.go",
    "content": "package it\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\titalian \"github.com/go-playground/locales/it\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tita := italian.New()\n\tuni := ut.New(ita, ita)\n\ttrans, _ := uni.GetTranslator(\"it\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t}\n\n\ttype Test struct {\n\t\tInner               Inner\n\t\tRequiredString      string            `validate:\"required\"`\n\t\tRequiredNumber      int               `validate:\"required\"`\n\t\tRequiredMultiple    []string          `validate:\"required\"`\n\t\tLenString           string            `validate:\"len=1\"`\n\t\tLenNumber           float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple         []string          `validate:\"len=7\"`\n\t\tMinString           string            `validate:\"min=1\"`\n\t\tMinNumber           float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple         []string          `validate:\"min=7\"`\n\t\tMaxString           string            `validate:\"max=3\"`\n\t\tMaxNumber           float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple         []string          `validate:\"max=7\"`\n\t\tEqString            string            `validate:\"eq=3\"`\n\t\tEqNumber            float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple          []string          `validate:\"eq=7\"`\n\t\tNeString            string            `validate:\"ne=\"`\n\t\tNeNumber            float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple          []string          `validate:\"ne=0\"`\n\t\tLtString            string            `validate:\"lt=3\"`\n\t\tLtNumber            float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple          []string          `validate:\"lt=2\"`\n\t\tLtTime              time.Time         `validate:\"lt\"`\n\t\tLteString           string            `validate:\"lte=3\"`\n\t\tLteNumber           float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple         []string          `validate:\"lte=2\"`\n\t\tLteTime             time.Time         `validate:\"lte\"`\n\t\tGtString            string            `validate:\"gt=3\"`\n\t\tGtNumber            float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple          []string          `validate:\"gt=2\"`\n\t\tGtTime              time.Time         `validate:\"gt\"`\n\t\tGteString           string            `validate:\"gte=3\"`\n\t\tGteNumber           float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple         []string          `validate:\"gte=2\"`\n\t\tGteTime             time.Time         `validate:\"gte\"`\n\t\tEqFieldString       string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString     string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString     string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString     string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString    string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString     string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString    string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString       string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString       string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString      string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString       string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString      string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString         string            `validate:\"alpha\"`\n\t\tAlphanumString      string            `validate:\"alphanum\"`\n\t\tNumericString       string            `validate:\"numeric\"`\n\t\tNumberString        string            `validate:\"number\"`\n\t\tHexadecimalString   string            `validate:\"hexadecimal\"`\n\t\tHexColorString      string            `validate:\"hexcolor\"`\n\t\tRGBColorString      string            `validate:\"rgb\"`\n\t\tRGBAColorString     string            `validate:\"rgba\"`\n\t\tHSLColorString      string            `validate:\"hsl\"`\n\t\tHSLAColorString     string            `validate:\"hsla\"`\n\t\tEmail               string            `validate:\"email\"`\n\t\tURL                 string            `validate:\"url\"`\n\t\tURI                 string            `validate:\"uri\"`\n\t\tBase64              string            `validate:\"base64\"`\n\t\tContains            string            `validate:\"contains=purpose\"`\n\t\tContainsAny         string            `validate:\"containsany=!@#$\"`\n\t\tExcludes            string            `validate:\"excludes=text\"`\n\t\tExcludesAll         string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune        string            `validate:\"excludesrune=☻\"`\n\t\tISBN                string            `validate:\"isbn\"`\n\t\tISBN10              string            `validate:\"isbn10\"`\n\t\tISBN13              string            `validate:\"isbn13\"`\n\t\tISSN                string            `validate:\"issn\"`\n\t\tUUID                string            `validate:\"uuid\"`\n\t\tUUID3               string            `validate:\"uuid3\"`\n\t\tUUID4               string            `validate:\"uuid4\"`\n\t\tUUID5               string            `validate:\"uuid5\"`\n\t\tULID                string            `validate:\"ulid\"`\n\t\tASCII               string            `validate:\"ascii\"`\n\t\tPrintableASCII      string            `validate:\"printascii\"`\n\t\tMultiByte           string            `validate:\"multibyte\"`\n\t\tDataURI             string            `validate:\"datauri\"`\n\t\tLatitude            string            `validate:\"latitude\"`\n\t\tLongitude           string            `validate:\"longitude\"`\n\t\tSSN                 string            `validate:\"ssn\"`\n\t\tIP                  string            `validate:\"ip\"`\n\t\tIPv4                string            `validate:\"ipv4\"`\n\t\tIPv6                string            `validate:\"ipv6\"`\n\t\tCIDR                string            `validate:\"cidr\"`\n\t\tCIDRv4              string            `validate:\"cidrv4\"`\n\t\tCIDRv6              string            `validate:\"cidrv6\"`\n\t\tTCPAddr             string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4           string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6           string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr             string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4           string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6           string            `validate:\"udp6_addr\"`\n\t\tIPAddr              string            `validate:\"ip_addr\"`\n\t\tIPAddrv4            string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6            string            `validate:\"ip6_addr\"`\n\t\tUinxAddr            string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC                 string            `validate:\"mac\"`\n\t\tIsColor             string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen        *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen        *string           `validate:\"max=1\"`\n\t\tStrPtrLen           *string           `validate:\"len=2\"`\n\t\tStrPtrLt            *string           `validate:\"lt=1\"`\n\t\tStrPtrLte           *string           `validate:\"lte=1\"`\n\t\tStrPtrGt            *string           `validate:\"gt=10\"`\n\t\tStrPtrGte           *string           `validate:\"gte=10\"`\n\t\tOneOfString         string            `validate:\"oneof=red green\"`\n\t\tOneOfInt            int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice         []string          `validate:\"unique\"`\n\t\tUniqueArray         [3]string         `validate:\"unique\"`\n\t\tUniqueMap           map[string]string `validate:\"unique\"`\n\t\tBooleanString       string            `validate:\"boolean\"`\n\t\tJSONString          string            `validate:\"json\"`\n\t\tJWTString           string            `validate:\"jwt\"`\n\t\tLowercaseString     string            `validate:\"lowercase\"`\n\t\tUppercaseString     string            `validate:\"uppercase\"`\n\t\tStartsWithString    string            `validate:\"startswith=foo\"`\n\t\tStartsNotWithString string            `validate:\"startsnotwith=foo\"`\n\t\tEndsWithString      string            `validate:\"endswith=foo\"`\n\t\tEndsNotWithString   string            `validate:\"endsnotwith=foo\"`\n\t\tDatetime            string            `validate:\"datetime=2006-01-02\"`\n\t\tPostCode            string            `validate:\"postcode_iso3166_alpha2=SG\"`\n\t\tPostCodeCountry     string\n\t\tPostCodeByField     string `validate:\"postcode_iso3166_alpha2_field=PostCodeCountry\"`\n\t\tImage               string `validate:\"image\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ttest.StartsWithString = \"hello\"\n\ttest.StartsNotWithString = \"foo-hello\"\n\ttest.EndsWithString = \"hello\"\n\ttest.EndsNotWithString = \"hello-foo\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\ttest.Datetime = \"2008-Feb-01\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor deve essere un colore valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC deve contenere un indirizzo MAC valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr deve essere un indirizzo IP risolvibile\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 deve essere un indirizzo IPv4 risolvibile\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 deve essere un indirizzo IPv6 risolvibile\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr deve essere un indirizzo UDP valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 deve essere un indirizzo IPv4 UDP valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 deve essere un indirizzo IPv6 UDP valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr deve essere un indirizzo TCP valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 deve essere un indirizzo IPv4 TCP valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 deve essere un indirizzo IPv6 TCP valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR deve contenere una notazione CIDR valida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 deve contenere una notazione CIDR per un indirizzo IPv4 valida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 deve contenere una notazione CIDR per un indirizzo IPv6 valida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN deve essere un numero SSN valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP deve essere un indirizzo IP valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 deve essere un indirizzo IPv4 valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 deve essere un indirizzo IPv6 valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI deve contenere un Data URI valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude deve contenere una latitudine valida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude deve contenere una longitudine valida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte deve contenere caratteri multibyte\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII deve contenere solo caratteri ascii\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII deve contenere solo caratteri ascii stampabili\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID deve essere un UUID valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 deve essere un UUID versione 3 valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 deve essere un UUID versione 4 valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 deve essere un UUID versione 5 valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID deve essere un ULID valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN deve essere un numero ISBN valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 deve essere un numero ISBN-10 valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 deve essere un numero ISBN-13 valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN deve essere un numero ISSN valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes non deve contenere il testo 'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll non deve contenere alcuno dei seguenti caratteri '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune non deve contenere '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny deve contenere almeno uno dei seguenti caratteri '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains deve contenere il testo 'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 deve essere una stringa Base64 valida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email deve essere un indirizzo email valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL deve essere un URL valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI deve essere un URI valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString deve essere un colore RGB valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString deve essere un colore RGBA valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString deve essere un colore HSL valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString deve essere un colore HSLA valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString deve essere un esadecimale valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString deve essere un colore HEX valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString deve essere un numero valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString deve essere un valore numerico valido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString può contenere solo caratteri alfanumerici\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString può contenere solo caratteri alfabetici\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString deve essere minore di MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString deve essere minore o uguale a MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString deve essere maggiore di MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString deve essere maggiore o uguale a MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString deve essere diverso da EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString deve essere minore di Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString deve essere minore o uguale a Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString deve essere maggiore di Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString deve essere maggiore o uguale a Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString deve essere diverso da Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString deve essere uguale a Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString deve essere uguale a MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString deve essere lungo almeno 3 caratteri\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber deve essere maggiore o uguale a 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple deve contenere almeno 2 elementi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime deve essere uguale o successivo alla Data/Ora corrente\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString deve essere lungo più di 3 caratteri\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber deve essere maggiore di 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple deve contenere più di 2 elementi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime deve essere successivo alla Data/Ora corrente\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString deve essere lungo al massimo 3 caratteri\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber deve essere minore o uguale a 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple deve contenere al massimo 2 elementi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime deve essere uguale o precedente alla Data/Ora corrente\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString deve essere lungo meno di 3 caratteri\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber deve essere minore di 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple deve contenere meno di 2 elementi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime deve essere precedente alla Data/Ora corrente\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString deve essere diverso da \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber deve essere diverso da 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple deve essere diverso da 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString non è uguale a 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber non è uguale a 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple non è uguale a 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString deve essere lungo al massimo 3 caratteri\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber deve essere minore o uguale a 1.113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple deve contenere al massimo 7 elementi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString deve essere lungo almeno 1 carattere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber deve essere maggiore o uguale a 1.113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple deve contenere almeno 7 elementi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString deve essere lungo 1 carattere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber deve essere uguale a 1.113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple deve contenere 7 elementi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString è un campo obbligatorio\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber è un campo obbligatorio\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple è un campo obbligatorio\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen deve essere lungo almeno 10 caratteri\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen deve essere lungo al massimo 1 carattere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen deve essere lungo 2 caratteri\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt deve essere lungo meno di 1 carattere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte deve essere lungo al massimo 1 carattere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt deve essere lungo più di 10 caratteri\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte deve essere lungo almeno 10 caratteri\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString deve essere uno di [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt deve essere uno di [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice deve contenere valori unici\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray deve contenere valori unici\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap deve contenere valori unici\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.BooleanString\",\n\t\t\texpected: \"BooleanString deve rappresentare un valore booleano\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JSONString\",\n\t\t\texpected: \"JSONString deve essere una stringa json valida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JWTString\",\n\t\t\texpected: \"JWTString deve essere una stringa jwt valida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"LowercaseString deve essere una stringa minuscola\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"UppercaseString deve essere una stringa maiuscola\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StartsWithString\",\n\t\t\texpected: \"StartsWithString deve iniziare con foo\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StartsNotWithString\",\n\t\t\texpected: \"StartsNotWithString non deve iniziare con foo\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EndsWithString\",\n\t\t\texpected: \"EndsWithString deve terminare con foo\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EndsNotWithString\",\n\t\t\texpected: \"EndsNotWithString non deve terminare con foo\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"Datetime non corrisponde al formato 2006-01-02\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCode\",\n\t\t\texpected: \"PostCode non corrisponde al formato del codice postale dello stato SG\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCodeByField\",\n\t\t\texpected: \"PostCodeByField non corrisponde al formato del codice postale dello stato nel campo PostCodeCountry\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image deve essere un'immagine valida\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/ja/ja.go",
    "content": "package ja\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0}は必須フィールドです\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_if\",\n\t\t\ttranslation: \"{0}は必須フィールドです\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0}の長さは{1}でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"len-string-character\", \"{0}文字\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0}文字\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0}は{1}と等しくなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0}は{1}を含まなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// if err = ut.AddCardinal(\"len-items-item\", \"{0}つの項目\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0}つの項目\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0}の長さは少なくとも{1}はなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"min-string-character\", \"{0}文字\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0}文字\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0}は{1}以上でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0}は少なくとも{1}を含まなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// if err = ut.AddCardinal(\"min-items-item\", \"{0}つの項目\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0}つの項目\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0}の長さは最大でも{1}でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"max-string-character\", \"{0}文字\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0}文字\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0}は{1}以下でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0}は最大でも{1}でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// if err = ut.AddCardinal(\"max-items-item\", \"{0}つの項目\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0}つの項目\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0}は{1}と等しくありません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"ne\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"ne-items\", \"{0}の項目の数は{1}と異ならなければなりません\", false); err != nil {\n\t\t\t\t\tfmt.Printf(\"ne customRegisFunc #1 error because of %v\\n\", err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// if err = ut.AddCardinal(\"ne-items-item\", \"{0}個\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"ne-items-item\", \"{0}個\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"ne\", \"{0}は{1}と異ならなければなりません\", false); err != nil {\n\t\t\t\t\tfmt.Printf(\"ne customRegisFunc #2 error because of %v\\n\", err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.Slice:\n\t\t\t\t\tvar c string\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"ne-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"ne-items\", fe.Field(), c)\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"ne\", fe.Field(), fe.Param())\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0}の長さは{1}よりも少なくなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"lt-string-character\", \"{0}文字\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0}文字\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0}は{1}よりも小さくなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0}は{1}よりも少ない項目でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"lt-items-item\", \"{0}つの項目\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0}つの項目\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0}は現時刻よりも前でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0}の長さは最大でも{1}でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"lte-string-character\", \"{0}文字\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0}文字\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0}は{1}以下でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0}は最大でも{1}でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"lte-items-item\", \"{0}つの項目\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0}つの項目\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0}は現時刻以前でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0}の長さは{1}よりも多くなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"gt-string-character\", \"{0}文字\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0}文字\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0}は{1}よりも大きくなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0}は{1}よりも多い項目を含まなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"gt-items-item\", \"{0}つの項目\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0}つの項目\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0}は現時刻よりも後でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0}の長さは少なくとも{1}以上はなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"gte-string-character\", \"{0}文字\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0}文字\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0}は{1}以上でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0}は少なくとも{1}を含まなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"gte-items-item\", \"{0}つの項目\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0}つの項目\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0}は現時刻以降でなければなりません\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0}は{1}と等しくなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0}は{1}と等しくなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0}は{1}とは異ならなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0}は{1}よりも大きくなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0}は{1}以上でなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0}は{1}よりも小さくなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0}は{1}以下でなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0}は{1}とは異ならなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0}は{1}よりも大きくなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0}は{1}以上でなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0}は{1}よりも小さくなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0}は{1}以下でなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0}はアルファベットのみを含むことができます\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0}はアルファベットと数字のみを含むことができます\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0}は正しい数字でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0}は正しい数でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0}は正しい16進表記でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0}は正しいHEXカラーコードでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0}は正しいRGBカラーコードでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0}は正しいRGBAカラーコードでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0}は正しいHSLカラーコードでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0}は正しいHSLAカラーコードでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0}は正しいメールアドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0}は正しいURLでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0}は正しいURIでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0}は正しいBase64文字列でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0}は'{1}'を含まなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0}は'{1}'の少なくとも1つを含まなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0}には'{1}'というテキストを含むことはできません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0}には'{1}'のどれも含めることはできません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0}には'{1}'を含めることはできません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0}は正しいISBN番号でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0}は正しいISBN-10番号でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0}は正しいISBN-13番号でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0}は正しいISSN番号でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0}は正しいUUIDでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0}はバージョンが3の正しいUUIDでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0}はバージョンが4の正しいUUIDでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0}はバージョンが5の正しいUUIDでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0}は正しいULIDでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0}はASCII文字のみを含まなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0}は印刷可能なASCII文字のみを含まなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0}はマルチバイト文字を含まなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0}は正しいデータURIを含まなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0}は正しい緯度の座標を含まなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0}は正しい経度の座標を含まなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0}は正しい社会保障番号でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0}は正しいIPv4アドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0}は正しいIPv6アドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0}は正しいIPアドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0}は正しいCIDR表記を含まなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0}はIPv4アドレスの正しいCIDR表記を含まなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0}はIPv6アドレスの正しいCIDR表記を含まなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0}は正しいTCPアドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0}は正しいIPv4のTCPアドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0}は正しいIPv6のTCPアドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0}は正しいUDPアドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0}は正しいIPv4のUDPアドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0}は正しいIPv6のUDPアドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0}は解決可能なIPアドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0}は解決可能なIPv4アドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0}は解決可能なIPv6アドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0}は解決可能なUNIXアドレスでなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0}は正しいMACアドレスを含まなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0}は一意な値のみを含まなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0}は正しい色でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0}は[{1}]のうちのいずれかでなければなりません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} は有効な画像でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0}は正しいJSON文字列でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"jwt\",\n\t\t\ttranslation: \"{0}は正しいJWT文字列でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0}は小文字でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0}は大文字でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datetime\",\n\t\t\ttranslation: \"{0}は{1}の書式と一致しません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2\",\n\t\t\ttranslation: \"{0}は国名コード{1}の郵便番号形式と一致しません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2_field\",\n\t\t\ttranslation: \"{0}は{1}フィールドで指定された国名コードの郵便番号形式と一致しません\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"boolean\",\n\t\t\ttranslation: \"{0}は正しいブール値でなければなりません\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/ja/ja_test.go",
    "content": "package ja\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tja_locale \"github.com/go-playground/locales/ja\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tjapanese := ja_locale.New()\n\tuni := ut.New(japanese, japanese)\n\ttrans, _ := uni.GetTranslator(\"ja\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t\tRequiredIf       string\n\t}\n\n\ttype Test struct {\n\t\tInner             Inner\n\t\tRequiredString    string            `validate:\"required\"`\n\t\tRequiredNumber    int               `validate:\"required\"`\n\t\tRequiredMultiple  []string          `validate:\"required\"`\n\t\tRequiredIf        string            `validate:\"required_if=Inner.RequiredIf abcd\"`\n\t\tLenString         string            `validate:\"len=1\"`\n\t\tLenNumber         float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple       []string          `validate:\"len=7\"`\n\t\tMinString         string            `validate:\"min=1\"`\n\t\tMinNumber         float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple       []string          `validate:\"min=7\"`\n\t\tMaxString         string            `validate:\"max=3\"`\n\t\tMaxNumber         float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple       []string          `validate:\"max=7\"`\n\t\tEqString          string            `validate:\"eq=3\"`\n\t\tEqNumber          float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple        []string          `validate:\"eq=7\"`\n\t\tNeString          string            `validate:\"ne=\"`\n\t\tNeNumber          float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple        []string          `validate:\"ne=0\"`\n\t\tLtString          string            `validate:\"lt=3\"`\n\t\tLtNumber          float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple        []string          `validate:\"lt=2\"`\n\t\tLtTime            time.Time         `validate:\"lt\"`\n\t\tLteString         string            `validate:\"lte=3\"`\n\t\tLteNumber         float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple       []string          `validate:\"lte=2\"`\n\t\tLteTime           time.Time         `validate:\"lte\"`\n\t\tGtString          string            `validate:\"gt=3\"`\n\t\tGtNumber          float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple        []string          `validate:\"gt=2\"`\n\t\tGtTime            time.Time         `validate:\"gt\"`\n\t\tGteString         string            `validate:\"gte=3\"`\n\t\tGteNumber         float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple       []string          `validate:\"gte=2\"`\n\t\tGteTime           time.Time         `validate:\"gte\"`\n\t\tEqFieldString     string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString   string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString   string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString   string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString  string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString   string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString  string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString     string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString     string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString    string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString     string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString    string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString       string            `validate:\"alpha\"`\n\t\tAlphanumString    string            `validate:\"alphanum\"`\n\t\tNumericString     string            `validate:\"numeric\"`\n\t\tNumberString      string            `validate:\"number\"`\n\t\tHexadecimalString string            `validate:\"hexadecimal\"`\n\t\tHexColorString    string            `validate:\"hexcolor\"`\n\t\tRGBColorString    string            `validate:\"rgb\"`\n\t\tRGBAColorString   string            `validate:\"rgba\"`\n\t\tHSLColorString    string            `validate:\"hsl\"`\n\t\tHSLAColorString   string            `validate:\"hsla\"`\n\t\tEmail             string            `validate:\"email\"`\n\t\tURL               string            `validate:\"url\"`\n\t\tURI               string            `validate:\"uri\"`\n\t\tBase64            string            `validate:\"base64\"`\n\t\tContains          string            `validate:\"contains=purpose\"`\n\t\tContainsAny       string            `validate:\"containsany=!@#$\"`\n\t\tExcludes          string            `validate:\"excludes=text\"`\n\t\tExcludesAll       string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune      string            `validate:\"excludesrune=☻\"`\n\t\tISBN              string            `validate:\"isbn\"`\n\t\tISBN10            string            `validate:\"isbn10\"`\n\t\tISBN13            string            `validate:\"isbn13\"`\n\t\tISSN              string            `validate:\"issn\"`\n\t\tUUID              string            `validate:\"uuid\"`\n\t\tUUID3             string            `validate:\"uuid3\"`\n\t\tUUID4             string            `validate:\"uuid4\"`\n\t\tUUID5             string            `validate:\"uuid5\"`\n\t\tULID              string            `validate:\"ulid\"`\n\t\tASCII             string            `validate:\"ascii\"`\n\t\tPrintableASCII    string            `validate:\"printascii\"`\n\t\tMultiByte         string            `validate:\"multibyte\"`\n\t\tDataURI           string            `validate:\"datauri\"`\n\t\tLatitude          string            `validate:\"latitude\"`\n\t\tLongitude         string            `validate:\"longitude\"`\n\t\tSSN               string            `validate:\"ssn\"`\n\t\tIP                string            `validate:\"ip\"`\n\t\tIPv4              string            `validate:\"ipv4\"`\n\t\tIPv6              string            `validate:\"ipv6\"`\n\t\tCIDR              string            `validate:\"cidr\"`\n\t\tCIDRv4            string            `validate:\"cidrv4\"`\n\t\tCIDRv6            string            `validate:\"cidrv6\"`\n\t\tTCPAddr           string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4         string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6         string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr           string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4         string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6         string            `validate:\"udp6_addr\"`\n\t\tIPAddr            string            `validate:\"ip_addr\"`\n\t\tIPAddrv4          string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6          string            `validate:\"ip6_addr\"`\n\t\tUinxAddr          string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC               string            `validate:\"mac\"`\n\t\tIsColor           string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen      *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen      *string           `validate:\"max=1\"`\n\t\tStrPtrLen         *string           `validate:\"len=2\"`\n\t\tStrPtrLt          *string           `validate:\"lt=1\"`\n\t\tStrPtrLte         *string           `validate:\"lte=1\"`\n\t\tStrPtrGt          *string           `validate:\"gt=10\"`\n\t\tStrPtrGte         *string           `validate:\"gte=10\"`\n\t\tOneOfString       string            `validate:\"oneof=red green\"`\n\t\tOneOfInt          int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice       []string          `validate:\"unique\"`\n\t\tUniqueArray       [3]string         `validate:\"unique\"`\n\t\tUniqueMap         map[string]string `validate:\"unique\"`\n\t\tJSONString        string            `validate:\"json\"`\n\t\tJWTString         string            `validate:\"jwt\"`\n\t\tLowercaseString   string            `validate:\"lowercase\"`\n\t\tUppercaseString   string            `validate:\"uppercase\"`\n\t\tDatetime          string            `validate:\"datetime=2006-01-02\"`\n\t\tPostCode          string            `validate:\"postcode_iso3166_alpha2=SG\"`\n\t\tPostCodeCountry   string\n\t\tPostCodeByField   string `validate:\"postcode_iso3166_alpha2_field=PostCodeCountry\"`\n\t\tBooleanString     string `validate:\"boolean\"`\n\t\tImage             string `validate:\"image\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\ttest.Datetime = \"2008-Feb-01\"\n\ttest.BooleanString = \"A\"\n\n\ttest.Inner.RequiredIf = \"abcd\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColorは正しい色でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MACは正しいMACアドレスを含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddrは解決可能なIPアドレスでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4は解決可能なIPv4アドレスでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6は解決可能なIPv6アドレスでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddrは正しいUDPアドレスでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4は正しいIPv4のUDPアドレスでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6は正しいIPv6のUDPアドレスでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddrは正しいTCPアドレスでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4は正しいIPv4のTCPアドレスでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6は正しいIPv6のTCPアドレスでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDRは正しいCIDR表記を含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4はIPv4アドレスの正しいCIDR表記を含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6はIPv6アドレスの正しいCIDR表記を含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSNは正しい社会保障番号でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IPは正しいIPアドレスでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4は正しいIPv4アドレスでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6は正しいIPv6アドレスでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURIは正しいデータURIを含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitudeは正しい緯度の座標を含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitudeは正しい経度の座標を含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByteはマルチバイト文字を含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCIIはASCII文字のみを含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCIIは印刷可能なASCII文字のみを含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUIDは正しいUUIDでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3はバージョンが3の正しいUUIDでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4はバージョンが4の正しいUUIDでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5はバージョンが5の正しいUUIDでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULIDは正しいULIDでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBNは正しいISBN番号でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10は正しいISBN-10番号でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13は正しいISBN-13番号でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSNは正しいISSN番号でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludesには'text'というテキストを含むことはできません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAllには'!@#$'のどれも含めることはできません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRuneには'☻'を含めることはできません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAnyは'!@#$'の少なくとも1つを含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Containsは'purpose'を含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64は正しいBase64文字列でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Emailは正しいメールアドレスでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URLは正しいURLでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URIは正しいURIでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorStringは正しいRGBカラーコードでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorStringは正しいRGBAカラーコードでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorStringは正しいHSLカラーコードでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorStringは正しいHSLAカラーコードでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalStringは正しい16進表記でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorStringは正しいHEXカラーコードでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberStringは正しい数でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericStringは正しい数字でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumStringはアルファベットと数字のみを含むことができます\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaStringはアルファベットのみを含むことができます\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldStringはMaxStringよりも小さくなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldStringはMaxString以下でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldStringはMaxStringよりも大きくなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldStringはMaxString以上でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldStringはEqFieldStringとは異ならなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldStringはInner.LtCSFieldStringよりも小さくなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldStringはInner.LteCSFieldString以下でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldStringはInner.GtCSFieldStringよりも大きくなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldStringはInner.GteCSFieldString以上でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldStringはInner.NeCSFieldStringとは異ならなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldStringはInner.EqCSFieldStringと等しくなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldStringはMaxStringと等しくなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteStringの長さは少なくとも3文字以上はなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumberは5.56以上でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultipleは少なくとも2つの項目を含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTimeは現時刻以降でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtStringの長さは3文字よりも多くなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumberは5.56よりも大きくなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultipleは2つの項目よりも多い項目を含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTimeは現時刻よりも後でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteStringの長さは最大でも3文字でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumberは5.56以下でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultipleは最大でも2つの項目でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTimeは現時刻以前でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtStringの長さは3文字よりも少なくなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumberは5.56よりも小さくなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultipleは2つの項目よりも少ない項目でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTimeは現時刻よりも前でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeStringはと異ならなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumberは0.00と異ならなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultipleの項目の数は0個と異ならなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqStringは3と等しくありません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumberは2.33と等しくありません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultipleは7と等しくありません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxStringの長さは最大でも3文字でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumberは1,113.00以下でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultipleは最大でも7つの項目でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinStringの長さは少なくとも1文字はなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumberは1,113.00以上でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultipleは少なくとも7つの項目を含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenStringの長さは1文字でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumberは1,113.00と等しくなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultipleは7つの項目を含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredStringは必須フィールドです\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredIf\",\n\t\t\texpected: \"RequiredIfは必須フィールドです\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumberは必須フィールドです\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultipleは必須フィールドです\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLenの長さは少なくとも10文字はなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLenの長さは最大でも1文字でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLenの長さは2文字でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLtの長さは1文字よりも少なくなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLteの長さは最大でも1文字でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGtの長さは10文字よりも多くなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGteの長さは少なくとも10文字以上はなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfStringは[red green]のうちのいずれかでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfIntは[5 63]のうちのいずれかでなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image は有効な画像でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSliceは一意な値のみを含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArrayは一意な値のみを含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMapは一意な値のみを含まなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JSONString\",\n\t\t\texpected: \"JSONStringは正しいJSON文字列でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JWTString\",\n\t\t\texpected: \"JWTStringは正しいJWT文字列でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"LowercaseStringは小文字でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"UppercaseStringは大文字でなければなりません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"Datetimeは2006-01-02の書式と一致しません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCode\",\n\t\t\texpected: \"PostCodeは国名コードSGの郵便番号形式と一致しません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCodeByField\",\n\t\t\texpected: \"PostCodeByFieldはPostCodeCountryフィールドで指定された国名コードの郵便番号形式と一致しません\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.BooleanString\",\n\t\t\texpected: \"BooleanStringは正しいブール値でなければなりません\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/ko/ko.go",
    "content": "package ko\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0}은(는) 필수 필드입니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_if\",\n\t\t\ttranslation: \"{0}은(는) 필수 필드입니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_unless\",\n\t\t\ttranslation: \"{0}은(는) 필수 필드입니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with\",\n\t\t\ttranslation: \"{0}은(는) 필수 필드입니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with_all\",\n\t\t\ttranslation: \"{0}은(는) 필수 필드입니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without\",\n\t\t\ttranslation: \"{0}은(는) 필수 필드입니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without_all\",\n\t\t\ttranslation: \"{0}은(는) 필수 필드입니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_if\",\n\t\t\ttranslation: \"{0}은(는) 제외된 필드입니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_unless\",\n\t\t\ttranslation: \"{0}은(는) 제외된 필드입니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with\",\n\t\t\ttranslation: \"{0}은(는) 제외된 필드입니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with_all\",\n\t\t\ttranslation: \"{0}은(는) 제외된 필드입니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without\",\n\t\t\ttranslation: \"{0}은(는) 제외된 필드입니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without_all\",\n\t\t\ttranslation: \"{0}은(는) 제외된 필드입니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isdefault\",\n\t\t\ttranslation: \"{0}은(는) 기본값이어야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0}의 길이는 {1}여야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0}자\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0}은(는) {1}와(과) 같아야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0}은(는) {1}을 포함해야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0}개의 항목\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0}의 길이는 최소 {1}여야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0}자\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0}은(는) {1} 이상여야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0}은(는) 최소 {1}을 포함해야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0}개의 항목\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0}의 길이는 최대 {1}여야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0}자\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0}은(는) {1} 이하여야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0}은(는) 최대 {1}여야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0}개의 항목\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0}은(는) {1}와(과) 같아야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"ne\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"ne-items\", \"{0}의 항목 수는 {1}와(과) 달라야 합니다.\", false); err != nil {\n\t\t\t\t\tfmt.Printf(\"ne customRegisFunc #1 error because of %v\\n\", err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"ne-items-item\", \"{0}개\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.Add(\"ne\", \"{0}은(는) {1}와(과) 달라야 합니다.\", false); err != nil {\n\t\t\t\t\tfmt.Printf(\"ne customRegisFunc #2 error because of %v\\n\", err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.Slice:\n\t\t\t\t\tvar c string\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"ne-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\t\t\t\t\tt, err = ut.T(\"ne-items\", fe.Field(), c)\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"ne\", fe.Field(), fe.Param())\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0}의 길이는 {1}보다 작아야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0}자\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0}은(는) {1}보다 작아야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0}은(는) {1}보다 적은 항목여야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0}개의 항목\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0}은(는) 현재 시간보다 이전이어야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0}의 길이는 최대 {1}여야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0}자\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0}은(는) {1} 이하여야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0}은(는) 최대 {1}여야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0}개의 항목\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0}은(는) 현재 시간보다 이전이어야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0}의 길이는 {1}보다 길어야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0}자\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0}은(는) {1}보다 커야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0}은(는) {1}보다 많은 항목을 포함해야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0}개의 항목\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0}은(는) 현재 시간 이후이어야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0}의 길이는 최소 {1} 이상여야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0}자\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0}은(는) {1} 이상여야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0}은(는) 최소 {1}을 포함해야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0}개의 항목\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0}은(는) 현재 시간 이후이어야 합니다.\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0}은(는) {1}와(과) 같아야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0}은(는) {1}와(과) 같아야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0}은(는) {1}와(과) 달라야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0}은(는) {1}보다 커야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0}은(는) {1} 이상여야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0}은(는) {1}보다 작아야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0}은(는) {1} 이하여야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0}은(는) {1}와(과) 달라야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0}은(는) {1}보다 커야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0}은(는) {1} 이상여야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0}은(는) {1}보다 작아야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0}은(는) {1} 이하여야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0}은(는) 알파벳만 포함할 수 있습니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0}은(는) 알파벳과 숫자만 포함할 수 있습니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphaspace\",\n\t\t\ttranslation: \"{0}은(는) 알파벳과 공백만 포함할 수 있습니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanumspace\",\n\t\t\ttranslation: \"{0}은(는) 알파벳, 숫자, 공백만 포함할 수 있습니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphaunicode\",\n\t\t\ttranslation: \"{0}은(는) 유니코드 문자만 포함할 수 있습니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanumunicode\",\n\t\t\ttranslation: \"{0}은(는) 유니코드 문자와 숫자만 포함할 수 있습니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0}은(는) 올바른 숫자여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0}은(는) 올바른 수여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0}은(는) 올바른 16진수 표기여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0}은(는) 올바른 HEX 색상 코드여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0}은(는) 올바른 RGB 색상 코드여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0}은(는) 올바른 RGBA 색상 코드여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0}은(는) 올바른 HSL 색상 코드여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0}은(는) 올바른 HSLA 색상 코드여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0}은(는) 유효한 E.164 형식의 전화번호여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0}은(는) 올바른 이메일 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0}은(는) 올바른 URL여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0}은(는) 올바른 URI여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0}은(는) 올바른 Base64 문자열여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0}은(는) '{1}'을(를) 포함해야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0}은(는) '{1}' 중 최소 하나를 포함해야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0}에는 '{1}'라는 텍스트를 포함할 수 없습니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0}에는 '{1}' 중 어느 것도 포함할 수 없습니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0}에는 '{1}'을(를) 포함할 수 없습니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0}은(는) 올바른 ISBN 번호여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0}은(는) 올바른 ISBN-10 번호여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0}은(는) 올바른 ISBN-13 번호여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0}은(는) 올바른 ISSN 번호여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0}은(는) 올바른 UUID여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0}은(는) 버전 3의 올바른 UUID여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0}은(는) 버전 4의 올바른 UUID여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0}은(는) 버전 5의 올바른 UUID여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0}은(는) 올바른 ULID여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0}은(는) ASCII 문자만 포함해야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0}은(는) 인쇄 가능한 ASCII 문자만 포함해야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0}은(는) 멀티바이트 문자를 포함해야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0}은(는) 올바른 데이터 URI를 포함해야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0}은(는) 올바른 위도 좌표를 포함해야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0}은(는) 올바른 경도 좌표를 포함해야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0}은(는) 올바른 사회 보장 번호여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0}은(는) 올바른 IPv4 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0}은(는) 올바른 IPv6 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0}은(는) 올바른 IP 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0}은(는) 올바른 CIDR 표기를 포함해야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0}은(는) IPv4 주소의 올바른 CIDR 표기를 포함해야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0}은(는) IPv6 주소의 올바른 CIDR 표기를 포함해야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0}은(는) 올바른 TCP 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0}은(는) 올바른 IPv4의 TCP 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0}은(는) 올바른 IPv6의 TCP 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0}은(는) 올바른 UDP 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0}은(는) 올바른 IPv4의 UDP 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0}은(는) 올바른 IPv6의 UDP 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0}은(는) 해석 가능한 IP 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0}은(는) 해석 가능한 IPv4 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0}은(는) 해석 가능한 IPv6 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0}은(는) 해석 가능한 UNIX 주소여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0}은(는) 올바른 MAC 주소를 포함해야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"fqdn\",\n\t\t\ttranslation: \"{0}은(는) 유효한 FQDN이어야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0}은(는) 고유한 값만 포함해야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0}은(는) 올바른 색이여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cron\",\n\t\t\ttranslation: \"{0}은(는) 유효한 cron 표현식이어야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0}은(는) [{1}] 중 하나여야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0}은(는) 올바른 JSON 문자열여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"jwt\",\n\t\t\ttranslation: \"{0}은(는) 올바른 JWT 문자열여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0}은(는) 소문자여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0}은(는) 대문자여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datetime\",\n\t\t\ttranslation: \"{0}은(는) {1} 형식과 일치해야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2\",\n\t\t\ttranslation: \"{0}은(는) 국가 코드 {1}의 우편번호 형식과 일치해야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2_field\",\n\t\t\ttranslation: \"{0}은(는) {1} 필드에 지정된 국가 코드의 우편번호 형식과 일치해야 합니다.\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"경고: FieldError 번역 중 오류 발생: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"boolean\",\n\t\t\ttranslation: \"{0}은(는) 올바른 부울 값여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0}은(는) 유효한 이미지여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cve\",\n\t\t\ttranslation: \"{0}은(는) 유효한 CVE 식별자여야 합니다.\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/ko/ko_test.go",
    "content": "package ko\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tko_locale \"github.com/go-playground/locales/ko\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tkorean := ko_locale.New()\n\tuni := ut.New(korean, korean)\n\ttrans, _ := uni.GetTranslator(\"ko\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString    string\n\t\tNeCSFieldString    string\n\t\tGtCSFieldString    string\n\t\tGteCSFieldString   string\n\t\tLtCSFieldString    string\n\t\tLteCSFieldString   string\n\t\tRequiredIf         string\n\t\tRequiredUnless     string\n\t\tRequiredWith       string\n\t\tRequiredWithAll    string\n\t\tRequiredWithout    string\n\t\tRequiredWithoutAll string\n\t\tExcludedIf         string\n\t\tExcludedUnless     string\n\t\tExcludedWith       string\n\t\tExcludedWithAll    string\n\t\tExcludedWithout    string\n\t\tExcludedWithoutAll string\n\t}\n\n\ttype Test struct {\n\t\tInner              Inner\n\t\tRequiredString     string            `validate:\"required\"`\n\t\tRequiredNumber     int               `validate:\"required\"`\n\t\tRequiredMultiple   []string          `validate:\"required\"`\n\t\tRequiredIf         string            `validate:\"required_if=Inner.RequiredIf abcd\"`\n\t\tRequiredUnless     string            `validate:\"required_unless=Inner.RequiredUnless abcd\"`\n\t\tRequiredWith       string            `validate:\"required_with=Inner.RequiredWith\"`\n\t\tRequiredWithAll    string            `validate:\"required_with_all=Inner.RequiredWith Inner.RequiredWithAll\"`\n\t\tRequiredWithout    string            `validate:\"required_without=Inner.RequiredWithout\"`\n\t\tRequiredWithoutAll string            `validate:\"required_without_all=Inner.RequiredWithout Inner.RequiredWithoutAll\"`\n\t\tExcludedIf         string            `validate:\"excluded_if=Inner.ExcludedIf abcd\"`\n\t\tExcludedUnless     string            `validate:\"excluded_unless=Inner.ExcludedUnless abcd\"`\n\t\tExcludedWith       string            `validate:\"excluded_with=Inner.ExcludedWith\"`\n\t\tExcludedWithout    string            `validate:\"excluded_with_all=Inner.ExcludedWithAll\"`\n\t\tExcludedWithAll    string            `validate:\"excluded_without=Inner.ExcludedWithout\"`\n\t\tExcludedWithoutAll string            `validate:\"excluded_without_all=Inner.ExcludedWithoutAll\"`\n\t\tIsDefault          string            `validate:\"isdefault\"`\n\t\tLenString          string            `validate:\"len=1\"`\n\t\tLenNumber          float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple        []string          `validate:\"len=7\"`\n\t\tMinString          string            `validate:\"min=1\"`\n\t\tMinNumber          float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple        []string          `validate:\"min=7\"`\n\t\tMaxString          string            `validate:\"max=3\"`\n\t\tMaxNumber          float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple        []string          `validate:\"max=7\"`\n\t\tEqString           string            `validate:\"eq=3\"`\n\t\tEqNumber           float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple         []string          `validate:\"eq=7\"`\n\t\tNeString           string            `validate:\"ne=\"`\n\t\tNeNumber           float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple         []string          `validate:\"ne=0\"`\n\t\tLtString           string            `validate:\"lt=3\"`\n\t\tLtNumber           float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple         []string          `validate:\"lt=2\"`\n\t\tLtTime             time.Time         `validate:\"lt\"`\n\t\tLteString          string            `validate:\"lte=3\"`\n\t\tLteNumber          float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple        []string          `validate:\"lte=2\"`\n\t\tLteTime            time.Time         `validate:\"lte\"`\n\t\tGtString           string            `validate:\"gt=3\"`\n\t\tGtNumber           float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple         []string          `validate:\"gt=2\"`\n\t\tGtTime             time.Time         `validate:\"gt\"`\n\t\tGteString          string            `validate:\"gte=3\"`\n\t\tGteNumber          float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple        []string          `validate:\"gte=2\"`\n\t\tGteTime            time.Time         `validate:\"gte\"`\n\t\tEqFieldString      string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString    string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString    string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString    string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString   string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString    string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString   string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString      string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString      string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString     string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString      string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString     string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString           string            `validate:\"alpha\"`\n\t\tAlphanumString        string            `validate:\"alphanum\"`\n\t\tAlphaSpaceString      string            `validate:\"alphaspace\"`\n\t\tAlphaNumSpaceString   string            `validate:\"alphanumspace\"`\n\t\tAlphaUnicodeString    string            `validate:\"alphaunicode\"`\n\t\tAlphaNumUnicodeString string            `validate:\"alphanumunicode\"`\n\t\tNumericString         string            `validate:\"numeric\"`\n\t\tNumberString       string            `validate:\"number\"`\n\t\tHexadecimalString  string            `validate:\"hexadecimal\"`\n\t\tHexColorString     string            `validate:\"hexcolor\"`\n\t\tRGBColorString     string            `validate:\"rgb\"`\n\t\tRGBAColorString    string            `validate:\"rgba\"`\n\t\tHSLColorString     string            `validate:\"hsl\"`\n\t\tHSLAColorString    string            `validate:\"hsla\"`\n\t\tEmail              string            `validate:\"email\"`\n\t\tURL                string            `validate:\"url\"`\n\t\tURI                string            `validate:\"uri\"`\n\t\tBase64             string            `validate:\"base64\"`\n\t\tContains           string            `validate:\"contains=purpose\"`\n\t\tContainsAny        string            `validate:\"containsany=!@#$\"`\n\t\tExcludes           string            `validate:\"excludes=text\"`\n\t\tExcludesAll        string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune       string            `validate:\"excludesrune=☻\"`\n\t\tISBN               string            `validate:\"isbn\"`\n\t\tISBN10             string            `validate:\"isbn10\"`\n\t\tISBN13             string            `validate:\"isbn13\"`\n\t\tISSN               string            `validate:\"issn\"`\n\t\tUUID               string            `validate:\"uuid\"`\n\t\tUUID3              string            `validate:\"uuid3\"`\n\t\tUUID4              string            `validate:\"uuid4\"`\n\t\tUUID5              string            `validate:\"uuid5\"`\n\t\tULID               string            `validate:\"ulid\"`\n\t\tASCII              string            `validate:\"ascii\"`\n\t\tPrintableASCII     string            `validate:\"printascii\"`\n\t\tMultiByte          string            `validate:\"multibyte\"`\n\t\tDataURI            string            `validate:\"datauri\"`\n\t\tLatitude           string            `validate:\"latitude\"`\n\t\tLongitude          string            `validate:\"longitude\"`\n\t\tSSN                string            `validate:\"ssn\"`\n\t\tIP                 string            `validate:\"ip\"`\n\t\tIPv4               string            `validate:\"ipv4\"`\n\t\tIPv6               string            `validate:\"ipv6\"`\n\t\tCIDR               string            `validate:\"cidr\"`\n\t\tCIDRv4             string            `validate:\"cidrv4\"`\n\t\tCIDRv6             string            `validate:\"cidrv6\"`\n\t\tTCPAddr            string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4          string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6          string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr            string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4          string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6          string            `validate:\"udp6_addr\"`\n\t\tIPAddr             string            `validate:\"ip_addr\"`\n\t\tIPAddrv4           string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6           string            `validate:\"ip6_addr\"`\n\t\tUinxAddr           string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC                string            `validate:\"mac\"`\n\t\tFQDN               string            `validate:\"fqdn\"`\n\t\tIsColor            string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen       *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen       *string           `validate:\"max=1\"`\n\t\tStrPtrLen          *string           `validate:\"len=2\"`\n\t\tStrPtrLt           *string           `validate:\"lt=1\"`\n\t\tStrPtrLte          *string           `validate:\"lte=1\"`\n\t\tStrPtrGt           *string           `validate:\"gt=10\"`\n\t\tStrPtrGte          *string           `validate:\"gte=10\"`\n\t\tOneOfString        string            `validate:\"oneof=red green\"`\n\t\tOneOfInt           int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice        []string          `validate:\"unique\"`\n\t\tUniqueArray        [3]string         `validate:\"unique\"`\n\t\tUniqueMap          map[string]string `validate:\"unique\"`\n\t\tJSONString         string            `validate:\"json\"`\n\t\tJWTString          string            `validate:\"jwt\"`\n\t\tLowercaseString    string            `validate:\"lowercase\"`\n\t\tUppercaseString    string            `validate:\"uppercase\"`\n\t\tDatetime           string            `validate:\"datetime=2006-01-02\"`\n\t\tPostCode           string            `validate:\"postcode_iso3166_alpha2=SG\"`\n\t\tPostCodeCountry    string\n\t\tPostCodeByField    string `validate:\"postcode_iso3166_alpha2_field=PostCodeCountry\"`\n\t\tBooleanString      string `validate:\"boolean\"`\n\t\tImage              string `validate:\"image\"`\n\t\tCveString          string `validate:\"cve\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\ttest.Inner.RequiredUnless = \"1234\"\n\ttest.Inner.RequiredWith = \"1234\"\n\ttest.Inner.RequiredWithAll = \"1234\"\n\ttest.Inner.ExcludedIf = \"abcd\"\n\ttest.Inner.ExcludedUnless = \"1234\"\n\ttest.Inner.ExcludedWith = \"1234\"\n\ttest.Inner.ExcludedWithAll = \"1234\"\n\n\ttest.ExcludedIf = \"1234\"\n\ttest.ExcludedUnless = \"1234\"\n\ttest.ExcludedWith = \"1234\"\n\ttest.ExcludedWithAll = \"1234\"\n\ttest.ExcludedWithout = \"1234\"\n\ttest.ExcludedWithoutAll = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.AlphaSpaceString = \"abc3\"\n\ttest.AlphaNumSpaceString = \"abc!\"\n\ttest.AlphaUnicodeString = \"abc3\"\n\ttest.AlphaNumUnicodeString = \"abc!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"가나다라\"\n\ttest.PrintableASCII = \"가나다라\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\ttest.Datetime = \"2008-Feb-01\"\n\ttest.BooleanString = \"A\"\n\ttest.CveString = \"A\"\n\n\ttest.Inner.RequiredIf = \"abcd\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor은(는) 올바른 색이여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC은(는) 올바른 MAC 주소를 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.FQDN\",\n\t\t\texpected: \"FQDN은(는) 유효한 FQDN이어야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr은(는) 해석 가능한 IP 주소여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4은(는) 해석 가능한 IPv4 주소여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6은(는) 해석 가능한 IPv6 주소여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr은(는) 올바른 UDP 주소여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4은(는) 올바른 IPv4의 UDP 주소여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6은(는) 올바른 IPv6의 UDP 주소여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr은(는) 올바른 TCP 주소여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4은(는) 올바른 IPv4의 TCP 주소여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6은(는) 올바른 IPv6의 TCP 주소여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR은(는) 올바른 CIDR 표기를 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4은(는) IPv4 주소의 올바른 CIDR 표기를 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6은(는) IPv6 주소의 올바른 CIDR 표기를 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN은(는) 올바른 사회 보장 번호여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP은(는) 올바른 IP 주소여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4은(는) 올바른 IPv4 주소여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6은(는) 올바른 IPv6 주소여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI은(는) 올바른 데이터 URI를 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude은(는) 올바른 위도 좌표를 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude은(는) 올바른 경도 좌표를 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte은(는) 멀티바이트 문자를 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII은(는) ASCII 문자만 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII은(는) 인쇄 가능한 ASCII 문자만 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID은(는) 올바른 UUID여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3은(는) 버전 3의 올바른 UUID여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4은(는) 버전 4의 올바른 UUID여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5은(는) 버전 5의 올바른 UUID여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID은(는) 올바른 ULID여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN은(는) 올바른 ISBN 번호여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10은(는) 올바른 ISBN-10 번호여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13은(는) 올바른 ISBN-13 번호여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN은(는) 올바른 ISSN 번호여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes에는 'text'라는 텍스트를 포함할 수 없습니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll에는 '!@#$' 중 어느 것도 포함할 수 없습니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune에는 '☻'을(를) 포함할 수 없습니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny은(는) '!@#$' 중 최소 하나를 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains은(는) 'purpose'을(를) 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64은(는) 올바른 Base64 문자열여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email은(는) 올바른 이메일 주소여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL은(는) 올바른 URL여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI은(는) 올바른 URI여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString은(는) 올바른 RGB 색상 코드여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString은(는) 올바른 RGBA 색상 코드여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString은(는) 올바른 HSL 색상 코드여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString은(는) 올바른 HSLA 색상 코드여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString은(는) 올바른 16진수 표기여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString은(는) 올바른 HEX 색상 코드여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString은(는) 올바른 수여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString은(는) 올바른 숫자여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString은(는) 알파벳과 숫자만 포함할 수 있습니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString은(는) 알파벳만 포함할 수 있습니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaSpaceString\",\n\t\t\texpected: \"AlphaSpaceString은(는) 알파벳과 공백만 포함할 수 있습니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaNumSpaceString\",\n\t\t\texpected: \"AlphaNumSpaceString은(는) 알파벳, 숫자, 공백만 포함할 수 있습니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaUnicodeString\",\n\t\t\texpected: \"AlphaUnicodeString은(는) 유니코드 문자만 포함할 수 있습니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaNumUnicodeString\",\n\t\t\texpected: \"AlphaNumUnicodeString은(는) 유니코드 문자와 숫자만 포함할 수 있습니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString은(는) MaxString보다 작아야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString은(는) MaxString 이하여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString은(는) MaxString보다 커야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString은(는) MaxString 이상여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString은(는) EqFieldString와(과) 달라야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString은(는) Inner.LtCSFieldString보다 작아야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString은(는) Inner.LteCSFieldString 이하여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString은(는) Inner.GtCSFieldString보다 커야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString은(는) Inner.GteCSFieldString 이상여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString은(는) Inner.NeCSFieldString와(과) 달라야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString은(는) Inner.EqCSFieldString와(과) 같아야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString은(는) MaxString와(과) 같아야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString의 길이는 최소 3자 이상여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber은(는) 5.56 이상여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple은(는) 최소 2개의 항목을 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime은(는) 현재 시간 이후이어야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString의 길이는 3자보다 길어야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber은(는) 5.56보다 커야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple은(는) 2개의 항목보다 많은 항목을 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime은(는) 현재 시간 이후이어야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString의 길이는 최대 3자여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber은(는) 5.56 이하여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple은(는) 최대 2개의 항목여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime은(는) 현재 시간보다 이전이어야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString의 길이는 3자보다 작아야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber은(는) 5.56보다 작아야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple은(는) 2개의 항목보다 적은 항목여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime은(는) 현재 시간보다 이전이어야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString은(는) 와(과) 달라야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber은(는) 0.00와(과) 달라야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple의 항목 수는 0개와(과) 달라야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString은(는) 3와(과) 같아야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber은(는) 2.33와(과) 같아야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple은(는) 7와(과) 같아야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString의 길이는 최대 3자여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber은(는) 1,113.00 이하여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple은(는) 최대 7개의 항목여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString의 길이는 최소 1자여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber은(는) 1,113.00 이상여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple은(는) 최소 7개의 항목을 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString의 길이는 1자여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber은(는) 1,113.00와(과) 같아야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple은(는) 7개의 항목을 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString은(는) 필수 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredIf\",\n\t\t\texpected: \"RequiredIf은(는) 필수 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber은(는) 필수 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple은(는) 필수 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredUnless\",\n\t\t\texpected: \"RequiredUnless은(는) 필수 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWith\",\n\t\t\texpected: \"RequiredWith은(는) 필수 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithAll\",\n\t\t\texpected: \"RequiredWithAll은(는) 필수 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithout\",\n\t\t\texpected: \"RequiredWithout은(는) 필수 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithoutAll\",\n\t\t\texpected: \"RequiredWithoutAll은(는) 필수 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedIf\",\n\t\t\texpected: \"ExcludedIf은(는) 제외된 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedUnless\",\n\t\t\texpected: \"ExcludedUnless은(는) 제외된 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWith\",\n\t\t\texpected: \"ExcludedWith은(는) 제외된 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithAll\",\n\t\t\texpected: \"ExcludedWithAll은(는) 제외된 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithout\",\n\t\t\texpected: \"ExcludedWithout은(는) 제외된 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithoutAll\",\n\t\t\texpected: \"ExcludedWithoutAll은(는) 제외된 필드입니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen의 길이는 최소 10자여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen의 길이는 최대 1자여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen의 길이는 2자여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt의 길이는 1자보다 작아야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte의 길이는 최대 1자여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt의 길이는 10자보다 길어야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte의 길이는 최소 10자 이상여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString은(는) [red green] 중 하나여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt은(는) [5 63] 중 하나여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice은(는) 고유한 값만 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray은(는) 고유한 값만 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap은(는) 고유한 값만 포함해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JSONString\",\n\t\t\texpected: \"JSONString은(는) 올바른 JSON 문자열여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JWTString\",\n\t\t\texpected: \"JWTString은(는) 올바른 JWT 문자열여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"LowercaseString은(는) 소문자여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"UppercaseString은(는) 대문자여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"Datetime은(는) 2006-01-02 형식과 일치해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCode\",\n\t\t\texpected: \"PostCode은(는) 국가 코드 SG의 우편번호 형식과 일치해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCodeByField\",\n\t\t\texpected: \"PostCodeByField은(는) PostCodeCountry 필드에 지정된 국가 코드의 우편번호 형식과 일치해야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.BooleanString\",\n\t\t\texpected: \"BooleanString은(는) 올바른 부울 값여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image은(는) 유효한 이미지여야 합니다.\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CveString\",\n\t\t\texpected: \"CveString은(는) 유효한 CVE 식별자여야 합니다.\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/lv/lv.go",
    "content": "package lv\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} ir obligāts lauks\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_if\",\n\t\t\ttranslation: \"{0} ir obligāts lauks\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} garumam jābūt {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} rakstu zīme\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} rakstu zīmes\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} vērtībai jābūt {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} vērtībai jāsatur {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} elements\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} elementi\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} garumam jābūt minimums {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} rakstu zīme\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} rakstu zīmes\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} vērtībai jābūt {1} vai lielākai\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} jāsatur minimums {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} elements\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} elementi\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} vērtība pārsniedz maksimālo garumu {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} rakstu zīme\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} rakstu zīmes\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} vērtībai jābūt {1} vai mazākai\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} jāsatur maksimums {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} elements\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} elementi\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0} nav vienāds ar {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0} nedrīkst būt vienāds ar {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} garumam jābūt mazākam par {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} rakstu zīmi\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} rakstu zīmēm\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} jābūt mazākam par {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} jāsatur mazāk par {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} elements\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} elementiem\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} jābūt mazākam par šī brīža Datumu un laiku\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} garumam jābūt maksimums {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} rakstu zīme\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} rakstu zīmes\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} jābūt {1} vai mazākam\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} jāsatur maksimums {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} elements\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} elementi\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} jābūt mazākam par šī brīža Datumu un laiku vai vienādam\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} ir jābūt garākam par {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} rakstu zīme\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} rakstu zīmēm\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} jābūt lielākam par {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} jāsatur vairāk par {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} elements\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} elementiem\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} jābūt lielākam par šī brīža Datumu un laiku\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} garumam jābūt minimums {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} rakstu zīme\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} rakstu zīmes\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} jābūt {1} vai lielākam\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} jāsatur minimums {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} elements\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} elementi\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} jābūt lielākam par šī brīža Datumu un laiku vai vienādam\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0} jābūt vienādam ar {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0} jābūt vienādam ar {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0} nedrīkst būt vienāds ar {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0} jābūt lielākam par {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0} jābūt lielākam par {1} vai vienādam\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0} jābūt mazākam par {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0} jābūt mazākam par {1} vai vienādam\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0} nedrīkst būt vienāds ar {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0} jābūt lielākam par {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0} jābūt lielākam par {1} vai vienādam\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0} jābūt mazākam par {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0} jābūt mazākam par {1} vai vienādam\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} jāsatur tikai simboli no alfabēta\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} jāsatur tikai simboli no alfabēta vai cipari (Alphanumeric)\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} jāsatur tikai cipari\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} jāsatur derīgs skaitlis\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} jābūt heksadecimālam skaitlim\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} jābūt derīgai HEX krāsai\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} jābūt derīgai RGB krāsai\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} jābūt derīgai RGBA krāsai\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} jābūt derīgai HSL krāsai\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} jābūt derīgai HSLA krāsai\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0} jābūt derīgam, pēc E.164 formatētam talruņa numuram\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} jābūt derīgai e-pasta adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} jābūt derīgam URL\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} jābūt derīgam URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} jābūt derīgai Base64 virknei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0} jāsatur teksts '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0} jāsatur minimums 1 no rakstu zīmēm '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0} nedrīkst saturēt tekstu '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0} nedrīkst saturēt nevienu no sekojošām rakstu zīmēm '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0} nedrīkst saturēt sekojošo '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} jābūt derīgam ISBN numuram\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} jābūt derīgam ISBN-10 numuram\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} jābūt derīgam ISBN-13 numuram\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} jābūt derīgam ISSN numuram\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} jābūt derīgam UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} jābūt derīgam 3. versijas UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} jābūt derīgam 4. versijas UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} jābūt derīgam 5. versijas UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} jābūt derīgam ULID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} jāsatur tikai ascii rakstu zīmes\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} jāsatur tikai drukājamas ascii rakstu zīmes\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} jāsatur multibyte rakstu zīmes\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} jāsatur derīgs Data URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} jāsatur derīgus platuma grādus\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} jāsatur derīgus garuma grādus\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} jābūt derīgam SSN numuram\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} jābūt derīgai IPv4 adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} jābūt derīgai IPv6 adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} jābūt derīgai IP adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} jāsatur derīgu CIDR notāciju\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} jāsatur derīgu CIDR notāciju IPv4 adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} jāsatur derīgu CIDR notāciju IPv6 adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} jābūt derīgai TCP adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} jābūt derīgai IPv4 TCP adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} jābūt derīgai IPv6 TCP adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} jābūt derīgai UDP adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} jābūt derīgai IPv4 UDP adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} jābūt derīgai IPv6 UDP adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} jābūt atrisināmai IP adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} jābūt atrisināmai IPv4 adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} jābūt atrisināmai IPv6 adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} jābūt atrisināmai UNIX adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} jābūt derīgai MAC adresei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} jāsatur unikālas vērtības\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} jābūt derīgai krāsai\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0} jābūt vienam no [{1}]\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0} jābūt derīgai json virknei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"jwt\",\n\t\t\ttranslation: \"{0} jābūt derīgai jwt virknei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0} jābūt mazo burtu virknei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0} jābūt lielo burtu virknei\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datetime\",\n\t\t\ttranslation: \"{0} neatbilst formātam {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2\",\n\t\t\ttranslation: \"{0} neatbilst pasta indeksa formātam valstī {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2_field\",\n\t\t\ttranslation: \"{0} neatbilst pasta indeksa formātam valstī, kura norādīta laukā {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"boolean\",\n\t\t\ttranslation: \"{0} jābūt derīgai boolean vērtībai\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/lv/lv_test.go",
    "content": "package lv\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tenglish \"github.com/go-playground/locales/en\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\teng := english.New()\n\tuni := ut.New(eng, eng)\n\ttrans, _ := uni.GetTranslator(\"en\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t\tRequiredIf       string\n\t}\n\n\ttype Test struct {\n\t\tInner             Inner\n\t\tRequiredString    string            `validate:\"required\"`\n\t\tRequiredNumber    int               `validate:\"required\"`\n\t\tRequiredMultiple  []string          `validate:\"required\"`\n\t\tRequiredIf        string            `validate:\"required_if=Inner.RequiredIf abcd\"`\n\t\tLenString         string            `validate:\"len=1\"`\n\t\tLenNumber         float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple       []string          `validate:\"len=7\"`\n\t\tMinString         string            `validate:\"min=1\"`\n\t\tMinNumber         float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple       []string          `validate:\"min=7\"`\n\t\tMaxString         string            `validate:\"max=3\"`\n\t\tMaxNumber         float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple       []string          `validate:\"max=7\"`\n\t\tEqString          string            `validate:\"eq=3\"`\n\t\tEqNumber          float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple        []string          `validate:\"eq=7\"`\n\t\tNeString          string            `validate:\"ne=\"`\n\t\tNeNumber          float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple        []string          `validate:\"ne=0\"`\n\t\tLtString          string            `validate:\"lt=3\"`\n\t\tLtNumber          float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple        []string          `validate:\"lt=2\"`\n\t\tLtTime            time.Time         `validate:\"lt\"`\n\t\tLteString         string            `validate:\"lte=3\"`\n\t\tLteNumber         float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple       []string          `validate:\"lte=2\"`\n\t\tLteTime           time.Time         `validate:\"lte\"`\n\t\tGtString          string            `validate:\"gt=3\"`\n\t\tGtNumber          float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple        []string          `validate:\"gt=2\"`\n\t\tGtTime            time.Time         `validate:\"gt\"`\n\t\tGteString         string            `validate:\"gte=3\"`\n\t\tGteNumber         float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple       []string          `validate:\"gte=2\"`\n\t\tGteTime           time.Time         `validate:\"gte\"`\n\t\tEqFieldString     string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString   string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString   string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString   string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString  string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString   string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString  string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString     string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString     string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString    string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString     string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString    string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString       string            `validate:\"alpha\"`\n\t\tAlphanumString    string            `validate:\"alphanum\"`\n\t\tNumericString     string            `validate:\"numeric\"`\n\t\tNumberString      string            `validate:\"number\"`\n\t\tHexadecimalString string            `validate:\"hexadecimal\"`\n\t\tHexColorString    string            `validate:\"hexcolor\"`\n\t\tRGBColorString    string            `validate:\"rgb\"`\n\t\tRGBAColorString   string            `validate:\"rgba\"`\n\t\tHSLColorString    string            `validate:\"hsl\"`\n\t\tHSLAColorString   string            `validate:\"hsla\"`\n\t\tEmail             string            `validate:\"email\"`\n\t\tURL               string            `validate:\"url\"`\n\t\tURI               string            `validate:\"uri\"`\n\t\tBase64            string            `validate:\"base64\"`\n\t\tContains          string            `validate:\"contains=purpose\"`\n\t\tContainsAny       string            `validate:\"containsany=!@#$\"`\n\t\tExcludes          string            `validate:\"excludes=text\"`\n\t\tExcludesAll       string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune      string            `validate:\"excludesrune=☻\"`\n\t\tISBN              string            `validate:\"isbn\"`\n\t\tISBN10            string            `validate:\"isbn10\"`\n\t\tISBN13            string            `validate:\"isbn13\"`\n\t\tISSN              string            `validate:\"issn\"`\n\t\tUUID              string            `validate:\"uuid\"`\n\t\tUUID3             string            `validate:\"uuid3\"`\n\t\tUUID4             string            `validate:\"uuid4\"`\n\t\tUUID5             string            `validate:\"uuid5\"`\n\t\tULID              string            `validate:\"ulid\"`\n\t\tASCII             string            `validate:\"ascii\"`\n\t\tPrintableASCII    string            `validate:\"printascii\"`\n\t\tMultiByte         string            `validate:\"multibyte\"`\n\t\tDataURI           string            `validate:\"datauri\"`\n\t\tLatitude          string            `validate:\"latitude\"`\n\t\tLongitude         string            `validate:\"longitude\"`\n\t\tSSN               string            `validate:\"ssn\"`\n\t\tIP                string            `validate:\"ip\"`\n\t\tIPv4              string            `validate:\"ipv4\"`\n\t\tIPv6              string            `validate:\"ipv6\"`\n\t\tCIDR              string            `validate:\"cidr\"`\n\t\tCIDRv4            string            `validate:\"cidrv4\"`\n\t\tCIDRv6            string            `validate:\"cidrv6\"`\n\t\tTCPAddr           string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4         string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6         string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr           string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4         string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6         string            `validate:\"udp6_addr\"`\n\t\tIPAddr            string            `validate:\"ip_addr\"`\n\t\tIPAddrv4          string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6          string            `validate:\"ip6_addr\"`\n\t\tUinxAddr          string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC               string            `validate:\"mac\"`\n\t\tIsColor           string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen      *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen      *string           `validate:\"max=1\"`\n\t\tStrPtrLen         *string           `validate:\"len=2\"`\n\t\tStrPtrLt          *string           `validate:\"lt=1\"`\n\t\tStrPtrLte         *string           `validate:\"lte=1\"`\n\t\tStrPtrGt          *string           `validate:\"gt=10\"`\n\t\tStrPtrGte         *string           `validate:\"gte=10\"`\n\t\tOneOfString       string            `validate:\"oneof=red green\"`\n\t\tOneOfInt          int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice       []string          `validate:\"unique\"`\n\t\tUniqueArray       [3]string         `validate:\"unique\"`\n\t\tUniqueMap         map[string]string `validate:\"unique\"`\n\t\tJSONString        string            `validate:\"json\"`\n\t\tJWTString         string            `validate:\"jwt\"`\n\t\tLowercaseString   string            `validate:\"lowercase\"`\n\t\tUppercaseString   string            `validate:\"uppercase\"`\n\t\tDatetime          string            `validate:\"datetime=2006-01-02\"`\n\t\tPostCode          string            `validate:\"postcode_iso3166_alpha2=SG\"`\n\t\tPostCodeCountry   string\n\t\tPostCodeByField   string `validate:\"postcode_iso3166_alpha2_field=PostCodeCountry\"`\n\t\tBooleanString     string `validate:\"boolean\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\ttest.Datetime = \"2008-Feb-01\"\n\ttest.BooleanString = \"A\"\n\n\ttest.Inner.RequiredIf = \"abcd\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor jābūt derīgai krāsai\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC jābūt derīgai MAC adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr jābūt atrisināmai IP adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 jābūt atrisināmai IPv4 adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 jābūt atrisināmai IPv6 adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr jābūt derīgai UDP adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 jābūt derīgai IPv4 UDP adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 jābūt derīgai IPv6 UDP adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr jābūt derīgai TCP adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 jābūt derīgai IPv4 TCP adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 jābūt derīgai IPv6 TCP adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR jāsatur derīgu CIDR notāciju\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 jāsatur derīgu CIDR notāciju IPv4 adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 jāsatur derīgu CIDR notāciju IPv6 adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN jābūt derīgam SSN numuram\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP jābūt derīgai IP adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 jābūt derīgai IPv4 adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 jābūt derīgai IPv6 adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI jāsatur derīgs Data URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude jāsatur derīgus platuma grādus\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude jāsatur derīgus garuma grādus\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte jāsatur multibyte rakstu zīmes\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII jāsatur tikai ascii rakstu zīmes\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII jāsatur tikai drukājamas ascii rakstu zīmes\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID jābūt derīgam UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 jābūt derīgam 3. versijas UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 jābūt derīgam 4. versijas UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 jābūt derīgam 5. versijas UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID jābūt derīgam ULID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN jābūt derīgam ISBN numuram\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 jābūt derīgam ISBN-10 numuram\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 jābūt derīgam ISBN-13 numuram\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN jābūt derīgam ISSN numuram\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes nedrīkst saturēt tekstu 'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll nedrīkst saturēt nevienu no sekojošām rakstu zīmēm '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune nedrīkst saturēt sekojošo '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny jāsatur minimums 1 no rakstu zīmēm '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains jāsatur teksts 'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 jābūt derīgai Base64 virknei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email jābūt derīgai e-pasta adresei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL jābūt derīgam URL\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI jābūt derīgam URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString jābūt derīgai RGB krāsai\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString jābūt derīgai RGBA krāsai\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString jābūt derīgai HSL krāsai\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString jābūt derīgai HSLA krāsai\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString jābūt heksadecimālam skaitlim\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString jābūt derīgai HEX krāsai\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString jāsatur derīgs skaitlis\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString jāsatur tikai cipari\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString jāsatur tikai simboli no alfabēta vai cipari (Alphanumeric)\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString jāsatur tikai simboli no alfabēta\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString jābūt mazākam par MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString jābūt mazākam par MaxString vai vienādam\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString jābūt lielākam par MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString jābūt lielākam par MaxString vai vienādam\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString nedrīkst būt vienāds ar EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString jābūt mazākam par Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString jābūt mazākam par Inner.LteCSFieldString vai vienādam\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString jābūt lielākam par Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString jābūt lielākam par Inner.GteCSFieldString vai vienādam\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString nedrīkst būt vienāds ar Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString jābūt vienādam ar Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString jābūt vienādam ar MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString garumam jābūt minimums 3 rakstu zīmes\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber jābūt 5.56 vai lielākam\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple jāsatur minimums 2 elementi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime jābūt lielākam par šī brīža Datumu un laiku vai vienādam\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString ir jābūt garākam par 3 rakstu zīmēm\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber jābūt lielākam par 5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple jāsatur vairāk par 2 elementiem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime jābūt lielākam par šī brīža Datumu un laiku\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString garumam jābūt maksimums 3 rakstu zīmes\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber jābūt 5.56 vai mazākam\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple jāsatur maksimums 2 elementi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime jābūt mazākam par šī brīža Datumu un laiku vai vienādam\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString garumam jābūt mazākam par 3 rakstu zīmēm\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber jābūt mazākam par 5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple jāsatur mazāk par 2 elementiem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime jābūt mazākam par šī brīža Datumu un laiku\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString nedrīkst būt vienāds ar \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber nedrīkst būt vienāds ar 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple nedrīkst būt vienāds ar 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString nav vienāds ar 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber nav vienāds ar 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple nav vienāds ar 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString vērtība pārsniedz maksimālo garumu 3 rakstu zīmes\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber vērtībai jābūt 1,113.00 vai mazākai\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple jāsatur maksimums 7 elementi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString garumam jābūt minimums 1 rakstu zīme\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber vērtībai jābūt 1,113.00 vai lielākai\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple jāsatur minimums 7 elementi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString garumam jābūt 1 rakstu zīme\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber vērtībai jābūt 1,113.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple vērtībai jāsatur 7 elementi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString ir obligāts lauks\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredIf\",\n\t\t\texpected: \"RequiredIf ir obligāts lauks\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber ir obligāts lauks\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple ir obligāts lauks\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen garumam jābūt minimums 10 rakstu zīmes\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen vērtība pārsniedz maksimālo garumu 1 rakstu zīme\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen garumam jābūt 2 rakstu zīmes\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt garumam jābūt mazākam par 1 rakstu zīmi\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte garumam jābūt maksimums 1 rakstu zīme\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt ir jābūt garākam par 10 rakstu zīmēm\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte garumam jābūt minimums 10 rakstu zīmes\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString jābūt vienam no [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt jābūt vienam no [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice jāsatur unikālas vērtības\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray jāsatur unikālas vērtības\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap jāsatur unikālas vērtības\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JSONString\",\n\t\t\texpected: \"JSONString jābūt derīgai json virknei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JWTString\",\n\t\t\texpected: \"JWTString jābūt derīgai jwt virknei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"LowercaseString jābūt mazo burtu virknei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"UppercaseString jābūt lielo burtu virknei\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"Datetime neatbilst formātam 2006-01-02\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCode\",\n\t\t\texpected: \"PostCode neatbilst pasta indeksa formātam valstī SG\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCodeByField\",\n\t\t\texpected: \"PostCodeByField neatbilst pasta indeksa formātam valstī, kura norādīta laukā PostCodeCountry\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.BooleanString\",\n\t\t\texpected: \"BooleanString jābūt derīgai boolean vērtībai\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/nl/nl.go",
    "content": "package nl\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} is een verplicht veld\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} moet {1} lang zijn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} karakters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} moet gelijk zijn aan {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} moet {1} bevatten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} moet tenminste {1} lang zijn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} karakters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} moet {1} of groter zijn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} moet tenminste {1} bevatten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} mag maximaal {1} lang zijn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} karakters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} moet {1} of kleiner zijn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} mag maximaal {1} bevatten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0} is niet gelijk aan {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0} mag niet gelijk zijn aan {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} moet minder dan {1} lang zijn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} karakters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} moet kleiner zijn dan {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} moet minder dan {1} bevatten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} moet kleiner zijn dan de huidige datum & tijd\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} mag maximaal {1} lang zijn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} karakters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} moet {1} of minder zijn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} mag maximaal {1} bevatten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} moet kleiner dan of gelijk aan de huidige datum & tijd zijn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} moet langer dan {1} zijn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} karakters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} moet groter zijn dan {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} moet meer dan {1} bevatten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} moet groter zijn dan de huidige datum & tijd\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} moet tenminste {1} lang zijn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} karakters\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} moet {1} of groter zijn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} moet tenminste {1} bevatten\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} moet groter dan of gelijk zijn aan de huidige datum & tijd\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0} moet gelijk zijn aan {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0} moet gelijk zijn aan {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0} mag niet gelijk zijn aan {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0} moet groter zijn dan {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0} moet groter dan of gelijk aan {1} zijn\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0} moet kleiner zijn dan {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0} moet kleiner dan of gelijk aan {1} zijn\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0} mag niet gelijk zijn aan {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0} moet groter zijn dan {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0} moet groter dan of gelijk aan {1} zijn\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0} moet kleiner zijn dan {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0} moet kleiner dan of gelijk aan {1} zijn\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} mag alleen alfabetische karakters bevatten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} mag alleen alfanumerieke karakters bevatten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} moet een geldige numerieke waarde zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} moet een geldig getal zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} moet een geldig hexadecimaal getal zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} moet een geldige HEX kleur zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} moet een geldige RGB kleur zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} moet een geldige RGBA kleur zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} moet een geldige HSL kleur zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} moet een geldige HSLA kleur zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} moet een geldig email adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} moet een geldige URL zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} moet een geldige URI zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} moet een geldige Base64 string zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0} moet de tekst '{1}' bevatten\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0} moet tenminste een van de volgende karakters bevatten '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0} mag niet de tekst '{1}' bevatten\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0} mag niet een van de volgende karakters bevatten '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0} mag niet het volgende bevatten '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} moet een geldig ISBN nummer zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} moet een geldig ISBN-10 nummer zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} moet een geldig ISBN-13 nummer zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} moet een geldig ISSN nummer zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} moet een geldige UUID zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} moet een geldige versie 3 UUID zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} moet een geldige versie 4 UUID zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} moet een geldige versie 5 UUID zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} moet een geldige ULID zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} mag alleen ascii karakters bevatten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} mag alleen afdrukbare ascii karakters bevatten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} moet multibyte karakters bevatten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} moet een geldige Data URI bevatten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} moet geldige breedtegraadcoördinaten bevatten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} moet geldige lengtegraadcoördinaten bevatten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} moet een geldig SSN nummer zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} moet een geldig IPv4 adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} moet een geldig IPv6 adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} moet een geldig IP adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} moet een geldige CIDR notatie bevatten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} moet een geldige CIDR notatie voor een IPv4 adres bevatten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} moet een geldige CIDR notatie voor een IPv6 adres bevatten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} moet een geldig TCP adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} moet een geldig IPv4 TCP adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} moet een geldig IPv6 TCP adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} moet een geldig UDP adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} moet een geldig IPv4 UDP adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} moet een geldig IPv6 UDP adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} moet een oplosbaar IP adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} moet een oplosbaar IPv4 adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} moet een oplosbaar IPv6 adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} moet een oplosbaar UNIX adres zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} moet een geldig MAC adres bevatten\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} moet een geldige kleur zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0} moet een van de volgende zijn [{1}]\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} moet een geldige afbeelding zijn\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/nl/nl_test.go",
    "content": "package nl\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tenglish \"github.com/go-playground/locales/en\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\teng := english.New()\n\tuni := ut.New(eng, eng)\n\ttrans, _ := uni.GetTranslator(\"en\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t}\n\n\ttype Test struct {\n\t\tInner             Inner\n\t\tRequiredString    string    `validate:\"required\"`\n\t\tRequiredNumber    int       `validate:\"required\"`\n\t\tRequiredMultiple  []string  `validate:\"required\"`\n\t\tLenString         string    `validate:\"len=1\"`\n\t\tLenNumber         float64   `validate:\"len=1113.00\"`\n\t\tLenMultiple       []string  `validate:\"len=7\"`\n\t\tMinString         string    `validate:\"min=1\"`\n\t\tMinNumber         float64   `validate:\"min=1113.00\"`\n\t\tMinMultiple       []string  `validate:\"min=7\"`\n\t\tMaxString         string    `validate:\"max=3\"`\n\t\tMaxNumber         float64   `validate:\"max=1113.00\"`\n\t\tMaxMultiple       []string  `validate:\"max=7\"`\n\t\tEqString          string    `validate:\"eq=3\"`\n\t\tEqNumber          float64   `validate:\"eq=2.33\"`\n\t\tEqMultiple        []string  `validate:\"eq=7\"`\n\t\tNeString          string    `validate:\"ne=\"`\n\t\tNeNumber          float64   `validate:\"ne=0.00\"`\n\t\tNeMultiple        []string  `validate:\"ne=0\"`\n\t\tLtString          string    `validate:\"lt=3\"`\n\t\tLtNumber          float64   `validate:\"lt=5.56\"`\n\t\tLtMultiple        []string  `validate:\"lt=2\"`\n\t\tLtTime            time.Time `validate:\"lt\"`\n\t\tLteString         string    `validate:\"lte=3\"`\n\t\tLteNumber         float64   `validate:\"lte=5.56\"`\n\t\tLteMultiple       []string  `validate:\"lte=2\"`\n\t\tLteTime           time.Time `validate:\"lte\"`\n\t\tGtString          string    `validate:\"gt=3\"`\n\t\tGtNumber          float64   `validate:\"gt=5.56\"`\n\t\tGtMultiple        []string  `validate:\"gt=2\"`\n\t\tGtTime            time.Time `validate:\"gt\"`\n\t\tGteString         string    `validate:\"gte=3\"`\n\t\tGteNumber         float64   `validate:\"gte=5.56\"`\n\t\tGteMultiple       []string  `validate:\"gte=2\"`\n\t\tGteTime           time.Time `validate:\"gte\"`\n\t\tEqFieldString     string    `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString   string    `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString   string    `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString   string    `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString  string    `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString   string    `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString  string    `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString     string    `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString     string    `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString    string    `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString     string    `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString    string    `validate:\"ltefield=MaxString\"`\n\t\tAlphaString       string    `validate:\"alpha\"`\n\t\tAlphanumString    string    `validate:\"alphanum\"`\n\t\tNumericString     string    `validate:\"numeric\"`\n\t\tNumberString      string    `validate:\"number\"`\n\t\tHexadecimalString string    `validate:\"hexadecimal\"`\n\t\tHexColorString    string    `validate:\"hexcolor\"`\n\t\tRGBColorString    string    `validate:\"rgb\"`\n\t\tRGBAColorString   string    `validate:\"rgba\"`\n\t\tHSLColorString    string    `validate:\"hsl\"`\n\t\tHSLAColorString   string    `validate:\"hsla\"`\n\t\tEmail             string    `validate:\"email\"`\n\t\tURL               string    `validate:\"url\"`\n\t\tURI               string    `validate:\"uri\"`\n\t\tBase64            string    `validate:\"base64\"`\n\t\tContains          string    `validate:\"contains=purpose\"`\n\t\tContainsAny       string    `validate:\"containsany=!@#$\"`\n\t\tExcludes          string    `validate:\"excludes=text\"`\n\t\tExcludesAll       string    `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune      string    `validate:\"excludesrune=☻\"`\n\t\tISBN              string    `validate:\"isbn\"`\n\t\tISBN10            string    `validate:\"isbn10\"`\n\t\tISBN13            string    `validate:\"isbn13\"`\n\t\tISSN              string    `validate:\"issn\"`\n\t\tUUID              string    `validate:\"uuid\"`\n\t\tUUID3             string    `validate:\"uuid3\"`\n\t\tUUID4             string    `validate:\"uuid4\"`\n\t\tUUID5             string    `validate:\"uuid5\"`\n\t\tULID              string    `validate:\"ulid\"`\n\t\tASCII             string    `validate:\"ascii\"`\n\t\tPrintableASCII    string    `validate:\"printascii\"`\n\t\tMultiByte         string    `validate:\"multibyte\"`\n\t\tDataURI           string    `validate:\"datauri\"`\n\t\tLatitude          string    `validate:\"latitude\"`\n\t\tLongitude         string    `validate:\"longitude\"`\n\t\tSSN               string    `validate:\"ssn\"`\n\t\tIP                string    `validate:\"ip\"`\n\t\tIPv4              string    `validate:\"ipv4\"`\n\t\tIPv6              string    `validate:\"ipv6\"`\n\t\tCIDR              string    `validate:\"cidr\"`\n\t\tCIDRv4            string    `validate:\"cidrv4\"`\n\t\tCIDRv6            string    `validate:\"cidrv6\"`\n\t\tTCPAddr           string    `validate:\"tcp_addr\"`\n\t\tTCPAddrv4         string    `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6         string    `validate:\"tcp6_addr\"`\n\t\tUDPAddr           string    `validate:\"udp_addr\"`\n\t\tUDPAddrv4         string    `validate:\"udp4_addr\"`\n\t\tUDPAddrv6         string    `validate:\"udp6_addr\"`\n\t\tIPAddr            string    `validate:\"ip_addr\"`\n\t\tIPAddrv4          string    `validate:\"ip4_addr\"`\n\t\tIPAddrv6          string    `validate:\"ip6_addr\"`\n\t\tUinxAddr          string    `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC               string    `validate:\"mac\"`\n\t\tIsColor           string    `validate:\"iscolor\"`\n\t\tStrPtrMinLen      *string   `validate:\"min=10\"`\n\t\tStrPtrMaxLen      *string   `validate:\"max=1\"`\n\t\tStrPtrLen         *string   `validate:\"len=2\"`\n\t\tStrPtrLt          *string   `validate:\"lt=1\"`\n\t\tStrPtrLte         *string   `validate:\"lte=1\"`\n\t\tStrPtrGt          *string   `validate:\"gt=10\"`\n\t\tStrPtrGte         *string   `validate:\"gte=10\"`\n\t\tOneOfString       string    `validate:\"oneof=red green\"`\n\t\tOneOfInt          int       `validate:\"oneof=5 63\"`\n\t\tImage             string    `validate:\"image\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor moet een geldige kleur zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC moet een geldig MAC adres bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr moet een oplosbaar IP adres zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 moet een oplosbaar IPv4 adres zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 moet een oplosbaar IPv6 adres zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr moet een geldig UDP adres zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 moet een geldig IPv4 UDP adres zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 moet een geldig IPv6 UDP adres zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr moet een geldig TCP adres zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 moet een geldig IPv4 TCP adres zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 moet een geldig IPv6 TCP adres zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR moet een geldige CIDR notatie bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 moet een geldige CIDR notatie voor een IPv4 adres bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 moet een geldige CIDR notatie voor een IPv6 adres bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN moet een geldig SSN nummer zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP moet een geldig IP adres zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 moet een geldig IPv4 adres zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 moet een geldig IPv6 adres zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI moet een geldige Data URI bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude moet geldige breedtegraadcoördinaten bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude moet geldige lengtegraadcoördinaten bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte moet multibyte karakters bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII mag alleen ascii karakters bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII mag alleen afdrukbare ascii karakters bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID moet een geldige UUID zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 moet een geldige versie 3 UUID zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 moet een geldige versie 4 UUID zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 moet een geldige versie 5 UUID zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID moet een geldige ULID zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN moet een geldig ISBN nummer zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 moet een geldig ISBN-10 nummer zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 moet een geldig ISBN-13 nummer zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN moet een geldig ISSN nummer zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes mag niet de tekst 'text' bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll mag niet een van de volgende karakters bevatten '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune mag niet het volgende bevatten '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny moet tenminste een van de volgende karakters bevatten '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains moet de tekst 'purpose' bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 moet een geldige Base64 string zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email moet een geldig email adres zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL moet een geldige URL zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI moet een geldige URI zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString moet een geldige RGB kleur zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString moet een geldige RGBA kleur zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString moet een geldige HSL kleur zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString moet een geldige HSLA kleur zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString moet een geldig hexadecimaal getal zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString moet een geldige HEX kleur zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString moet een geldig getal zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString moet een geldige numerieke waarde zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString mag alleen alfanumerieke karakters bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString mag alleen alfabetische karakters bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString moet kleiner zijn dan MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString moet kleiner dan of gelijk aan MaxString zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString moet groter zijn dan MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString moet groter dan of gelijk aan MaxString zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString mag niet gelijk zijn aan EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString moet kleiner zijn dan Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString moet kleiner dan of gelijk aan Inner.LteCSFieldString zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString moet groter zijn dan Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString moet groter dan of gelijk aan Inner.GteCSFieldString zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString mag niet gelijk zijn aan Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString moet gelijk zijn aan Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString moet gelijk zijn aan MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString moet tenminste 3 karakters lang zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber moet 5.56 of groter zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple moet tenminste 2 items bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime moet groter dan of gelijk zijn aan de huidige datum & tijd\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString moet langer dan 3 karakters zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber moet groter zijn dan 5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple moet meer dan 2 items bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime moet groter zijn dan de huidige datum & tijd\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString mag maximaal 3 karakters lang zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber moet 5.56 of minder zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple mag maximaal 2 items bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime moet kleiner dan of gelijk aan de huidige datum & tijd zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString moet minder dan 3 karakters lang zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber moet kleiner zijn dan 5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple moet minder dan 2 items bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime moet kleiner zijn dan de huidige datum & tijd\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString mag niet gelijk zijn aan \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber mag niet gelijk zijn aan 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple mag niet gelijk zijn aan 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString is niet gelijk aan 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber is niet gelijk aan 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple is niet gelijk aan 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString mag maximaal 3 karakters lang zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber moet 1,113.00 of kleiner zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple mag maximaal 7 items bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString moet tenminste 1 karakter lang zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber moet 1,113.00 of groter zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple moet tenminste 7 items bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString moet 1 karakter lang zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber moet gelijk zijn aan 1,113.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple moet 7 items bevatten\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString is een verplicht veld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber is een verplicht veld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple is een verplicht veld\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen moet tenminste 10 karakters lang zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen mag maximaal 1 karakter lang zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen moet 2 karakters lang zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt moet minder dan 1 karakter lang zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte mag maximaal 1 karakter lang zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt moet langer dan 10 karakters zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte moet tenminste 10 karakters lang zijn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString moet een van de volgende zijn [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt moet een van de volgende zijn [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image moet een geldige afbeelding zijn\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/pl/pl.go",
    "content": "package pl\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} jest wymaganym polem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_if\",\n\t\t\ttranslation: \"{0} jest wymaganym polem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_unless\",\n\t\t\ttranslation: \"{0} jest wymaganym polem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with\",\n\t\t\ttranslation: \"{0} jest wymaganym polem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with_all\",\n\t\t\ttranslation: \"{0} jest wymaganym polem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without\",\n\t\t\ttranslation: \"{0} jest wymaganym polem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without_all\",\n\t\t\ttranslation: \"{0} jest wymaganym polem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_if\",\n\t\t\ttranslation: \"{0} jest wykluczonym polem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_unless\",\n\t\t\ttranslation: \"{0} jest wykluczonym polem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with\",\n\t\t\ttranslation: \"{0} jest wykluczonym polem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with_all\",\n\t\t\ttranslation: \"{0} jest wykluczonym polem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without\",\n\t\t\ttranslation: \"{0} jest wykluczonym polem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without_all\",\n\t\t\ttranslation: \"{0} jest wykluczonym polem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isdefault\",\n\t\t\ttranslation: \"{0} musi być domyślną wartością\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} musi mieć długość na {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} musi być równe {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} musi zawierać {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"len\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} musi mieć długość przynajmniej na {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} musi być równe {1} lub więcej\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} musi zawierać przynajmniej {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"min\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} musi mieć długość maksymalnie na {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} musi być równe {1} lub mniej\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} musi zawierać maksymalnie {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"max\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:             \"eq\",\n\t\t\ttranslation:     \"{0} nie równa się {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ne\",\n\t\t\ttranslation:     \"{0} nie powinien być równy {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} musi mieć długość mniejszą niż {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} musi być mniejsze niż {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} musi zawierać mniej niż {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} musi być mniejsze niż obecny dzień i godzina\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"lt\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} musi mieć długość maksymalnie na {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} musi być równe {1} lub mniej\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} musi zawierać maksymalnie {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} musi być mniejsze lub równe niż obecny dzień i godzina\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"lte\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} musi mieć długość większą niż {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} musi być większe niż {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} musi zawierać więcej niż {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} musi być większe niż obecny dzień i godzina\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"gt\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} musi mieć długość przynajmniej na {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} musi być równe {1} lub większe\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} musi zawierać co najmniej {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} musi być większe lub równe niż obecny dzień i godzina\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"gte\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:             \"eqfield\",\n\t\t\ttranslation:     \"{0} musi być równe {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"eqcsfield\",\n\t\t\ttranslation:     \"{0} musi być równe {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"necsfield\",\n\t\t\ttranslation:     \"{0} nie może być równe {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtcsfield\",\n\t\t\ttranslation:     \"{0} musi być większe niż {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtecsfield\",\n\t\t\ttranslation:     \"{0} musi być większe lub równe niż {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltcsfield\",\n\t\t\ttranslation:     \"{0} musi być mniejsze niż {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltecsfield\",\n\t\t\ttranslation:     \"{0} musi być mniejsze lub równe {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"nefield\",\n\t\t\ttranslation:     \"{0} nie może być równe {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtfield\",\n\t\t\ttranslation:     \"{0} musi być większe niż {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtefield\",\n\t\t\ttranslation:     \"{0} musi być większe lub równe {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltfield\",\n\t\t\ttranslation:     \"{0} musi być mniejsze niż {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltefield\",\n\t\t\ttranslation:     \"{0} musi być mniejsze lub równe {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} może zawierać wyłącznie znaki alfabetu\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} może zawierać wyłącznie znaki alfanumeryczne\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} musi być poprawną wartością numeryczną\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} musi być poprawną liczbą\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} musi być poprawną wartością heksadecymalną\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} musi być poprawnym kolorem w formacie HEX\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} musi być poprawnym kolorem w formacie RGB\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} musi być poprawnym kolorem w formacie RGBA\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} musi być poprawnym kolorem w formacie HSL\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} musi być poprawnym kolorem w formacie HSLA\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0} musi być poprawnym numerem telefonu w formacie E.164\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} musi być poprawnym adresem email\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} musi być poprawnym adresem URL\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} musi być poprawnym adresem URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} musi być ciągiem znaków zakodowanym w formacie Base64\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"contains\",\n\t\t\ttranslation:     \"{0} musi zawierać tekst '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"containsany\",\n\t\t\ttranslation:     \"{0} musi zawierać przynajmniej jeden z następujących znaków '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excludes\",\n\t\t\ttranslation:     \"{0} nie może zawierać tekstu '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excludesall\",\n\t\t\ttranslation:     \"{0} nie może zawierać żadnych z następujących znaków '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excludesrune\",\n\t\t\ttranslation:     \"{0} nie może zawierać następujących znaków '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} musi być poprawnym numerem ISBN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} musi być poprawnym numerem ISBN-10\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} musi być poprawnym numerem ISBN-13\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} musi być poprawnym numerem ISSN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} musi być poprawnym identyfikatorem UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} musi być poprawnym identyfikatorem UUID w wersji 3\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} musi być poprawnym identyfikatorem UUID w wersji 4\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} musi być poprawnym identyfikatorem UUID w wersji 5\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} musi być poprawnym identyfikatorem ULID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} może zawierać wyłącznie znaki ASCII\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} może zawierać wyłącznie drukowalne znaki ASCII\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} musi zawierać znaki wielobajtowe\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} musi zawierać poprawnie zakodowane dane w formie URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} musi zawierać poprawną szerokość geograficzną\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} musi zawierać poprawną długość geograficzną\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} musi zawierać poprawny numer SSN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} musi zawierać poprawny adres IPv4\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} musi zawierać poprawny adres IPv6\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} musi zawierać poprawny adres IP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} musi zawierać adres zapisany metodą CIDR\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} musi zawierać adres IPv4 zapisany metodą CIDR\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} musi zawierać adres IPv6 zapisany metodą CIDR\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} musi być poprawnym adresem TCP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} musi być poprawnym adresem IPv4 TCP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} musi być poprawnym adresem IPv6 TCP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} musi być poprawnym adresem UDP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} musi być poprawnym adresem IPv4 UDP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} musi być poprawnym adresem IPv6 UDP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} musi być rozpoznawalnym adresem IP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} musi być rozpoznawalnym adresem IPv4\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} musi być rozpoznawalnym adresem IPv6\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} musi być rozpoznawalnym adresem UNIX\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} musi zawierać poprawny MAC adres\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"fqdn\",\n\t\t\ttranslation: \"{0} musi być poprawnym FQDN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} musi zawierać unikalne wartości\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} musi być prawdziwym kolorem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cron\",\n\t\t\ttranslation: \"{0} musi być prawdziwym wyrażeniem cron\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"oneof\",\n\t\t\ttranslation:     \"{0} musi być jednym z [{1}]\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0} musi być ciągiem znaków w formacie JSON\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"jwt\",\n\t\t\ttranslation: \"{0} musi być ciągiem znaków w formacie JWT\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0} musi zawierać wyłącznie małe litery\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0} musi zawierać wyłącznie duże litery\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"datetime\",\n\t\t\ttranslation:     \"{0} nie spełnia formatu {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"postcode_iso3166_alpha2\",\n\t\t\ttranslation:     \"{0} nie spełnia formatu kodu pocztowego kraju {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"postcode_iso3166_alpha2_field\",\n\t\t\ttranslation:     \"{0} nie spełnia formatu kodu pocztowego kraju z pola {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"boolean\",\n\t\t\ttranslation: \"{0} musi być wartością logiczną\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} musi być obrazem\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cve\",\n\t\t\ttranslation: \"{0} musi być poprawnym identyfikatorem CVE\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n\nfunc translateFuncWithParam(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n\nfunc registerCardinals(ut ut.Translator, prefix string) (err error) {\n\tvar (\n\t\tstringCharacterKey = fmt.Sprintf(\"%s-string-character\", prefix)\n\t\titemsItemKey       = fmt.Sprintf(\"%s-items-item\", prefix)\n\t)\n\n\tif err = ut.AddCardinal(stringCharacterKey, \"{0} znak\", locales.PluralRuleOne, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(stringCharacterKey, \"{0} znaki\", locales.PluralRuleFew, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(stringCharacterKey, \"{0} znaków\", locales.PluralRuleMany, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(stringCharacterKey, \"{0} znaków\", locales.PluralRuleOther, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(itemsItemKey, \"{0} element\", locales.PluralRuleOne, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(itemsItemKey, \"{0} elementy\", locales.PluralRuleFew, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(itemsItemKey, \"{0} elementów\", locales.PluralRuleMany, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(itemsItemKey, \"{0} elementów\", locales.PluralRuleOther, false); err != nil {\n\t\treturn\n\t}\n\n\treturn\n}\n"
  },
  {
    "path": "translations/pl/pl_test.go",
    "content": "package pl\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tpolish \"github.com/go-playground/locales/pl\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tpl := polish.New()\n\tuni := ut.New(pl, pl)\n\ttrans, ok := uni.GetTranslator(\"pl\")\n\tif !ok {\n\t\tt.Fatalf(\"didn't found translator\")\n\t}\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString    string\n\t\tNeCSFieldString    string\n\t\tGtCSFieldString    string\n\t\tGteCSFieldString   string\n\t\tLtCSFieldString    string\n\t\tLteCSFieldString   string\n\t\tRequiredIf         string\n\t\tRequiredUnless     string\n\t\tRequiredWith       string\n\t\tRequiredWithAll    string\n\t\tRequiredWithout    string\n\t\tRequiredWithoutAll string\n\t\tExcludedIf         string\n\t\tExcludedUnless     string\n\t\tExcludedWith       string\n\t\tExcludedWithAll    string\n\t\tExcludedWithout    string\n\t\tExcludedWithoutAll string\n\t}\n\n\ttype Test struct {\n\t\tInner                     Inner\n\t\tRequiredString            string            `validate:\"required\"`\n\t\tRequiredNumber            int               `validate:\"required\"`\n\t\tRequiredMultiple          []string          `validate:\"required\"`\n\t\tRequiredIf                string            `validate:\"required_if=Inner.RequiredIf abcd\"`\n\t\tRequiredUnless            string            `validate:\"required_unless=Inner.RequiredUnless abcd\"`\n\t\tRequiredWith              string            `validate:\"required_with=Inner.RequiredWith\"`\n\t\tRequiredWithAll           string            `validate:\"required_with_all=Inner.RequiredWith Inner.RequiredWithAll\"`\n\t\tRequiredWithout           string            `validate:\"required_without=Inner.RequiredWithout\"`\n\t\tRequiredWithoutAll        string            `validate:\"required_without_all=Inner.RequiredWithout Inner.RequiredWithoutAll\"`\n\t\tExcludedIf                string            `validate:\"excluded_if=Inner.ExcludedIf abcd\"`\n\t\tExcludedUnless            string            `validate:\"excluded_unless=Inner.ExcludedUnless abcd\"`\n\t\tExcludedWith              string            `validate:\"excluded_with=Inner.ExcludedWith\"`\n\t\tExcludedWithout           string            `validate:\"excluded_with_all=Inner.ExcludedWithAll\"`\n\t\tExcludedWithAll           string            `validate:\"excluded_without=Inner.ExcludedWithout\"`\n\t\tExcludedWithoutAll        string            `validate:\"excluded_without_all=Inner.ExcludedWithoutAll\"`\n\t\tIsDefault                 string            `validate:\"isdefault\"`\n\t\tLenString                 string            `validate:\"len=1\"`\n\t\tLenNumber                 float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple               []string          `validate:\"len=7\"`\n\t\tMinString                 string            `validate:\"min=1\"`\n\t\tMinNumber                 float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple               []string          `validate:\"min=7\"`\n\t\tMaxString                 string            `validate:\"max=3\"`\n\t\tMaxNumber                 float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple               []string          `validate:\"max=7\"`\n\t\tEqString                  string            `validate:\"eq=3\"`\n\t\tEqNumber                  float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple                []string          `validate:\"eq=7\"`\n\t\tNeString                  string            `validate:\"ne=\"`\n\t\tNeNumber                  float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple                []string          `validate:\"ne=0\"`\n\t\tLtString                  string            `validate:\"lt=3\"`\n\t\tLtNumber                  float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple                []string          `validate:\"lt=2\"`\n\t\tLtTime                    time.Time         `validate:\"lt\"`\n\t\tLteString                 string            `validate:\"lte=3\"`\n\t\tLteNumber                 float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple               []string          `validate:\"lte=2\"`\n\t\tLteTime                   time.Time         `validate:\"lte\"`\n\t\tGtString                  string            `validate:\"gt=3\"`\n\t\tGtNumber                  float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple                []string          `validate:\"gt=2\"`\n\t\tGtTime                    time.Time         `validate:\"gt\"`\n\t\tGteString                 string            `validate:\"gte=3\"`\n\t\tGteStringSingle           string            `validate:\"gte=1\"`\n\t\tGteStringFive             string            `validate:\"gte=5\"`\n\t\tGteStringTwentyOne        string            `validate:\"gte=21\"`\n\t\tGteStringBigNumber        string            `validate:\"gte=852\"`\n\t\tGteStringAnotherBigNumber string            `validate:\"gte=2137\"`\n\t\tGteNumber                 float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple               []string          `validate:\"gte=2\"`\n\t\tGteTime                   time.Time         `validate:\"gte\"`\n\t\tEqFieldString             string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString           string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString           string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString           string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString          string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString           string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString          string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString             string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString             string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString            string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString             string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString            string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString               string            `validate:\"alpha\"`\n\t\tAlphanumString            string            `validate:\"alphanum\"`\n\t\tNumericString             string            `validate:\"numeric\"`\n\t\tNumberString              string            `validate:\"number\"`\n\t\tHexadecimalString         string            `validate:\"hexadecimal\"`\n\t\tHexColorString            string            `validate:\"hexcolor\"`\n\t\tRGBColorString            string            `validate:\"rgb\"`\n\t\tRGBAColorString           string            `validate:\"rgba\"`\n\t\tHSLColorString            string            `validate:\"hsl\"`\n\t\tHSLAColorString           string            `validate:\"hsla\"`\n\t\tEmail                     string            `validate:\"email\"`\n\t\tURL                       string            `validate:\"url\"`\n\t\tURI                       string            `validate:\"uri\"`\n\t\tBase64                    string            `validate:\"base64\"`\n\t\tContains                  string            `validate:\"contains=purpose\"`\n\t\tContainsAny               string            `validate:\"containsany=!@#$\"`\n\t\tExcludes                  string            `validate:\"excludes=text\"`\n\t\tExcludesAll               string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune              string            `validate:\"excludesrune=☻\"`\n\t\tISBN                      string            `validate:\"isbn\"`\n\t\tISBN10                    string            `validate:\"isbn10\"`\n\t\tISBN13                    string            `validate:\"isbn13\"`\n\t\tISSN                      string            `validate:\"issn\"`\n\t\tUUID                      string            `validate:\"uuid\"`\n\t\tUUID3                     string            `validate:\"uuid3\"`\n\t\tUUID4                     string            `validate:\"uuid4\"`\n\t\tUUID5                     string            `validate:\"uuid5\"`\n\t\tULID                      string            `validate:\"ulid\"`\n\t\tASCII                     string            `validate:\"ascii\"`\n\t\tPrintableASCII            string            `validate:\"printascii\"`\n\t\tMultiByte                 string            `validate:\"multibyte\"`\n\t\tDataURI                   string            `validate:\"datauri\"`\n\t\tLatitude                  string            `validate:\"latitude\"`\n\t\tLongitude                 string            `validate:\"longitude\"`\n\t\tSSN                       string            `validate:\"ssn\"`\n\t\tIP                        string            `validate:\"ip\"`\n\t\tIPv4                      string            `validate:\"ipv4\"`\n\t\tIPv6                      string            `validate:\"ipv6\"`\n\t\tCIDR                      string            `validate:\"cidr\"`\n\t\tCIDRv4                    string            `validate:\"cidrv4\"`\n\t\tCIDRv6                    string            `validate:\"cidrv6\"`\n\t\tTCPAddr                   string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4                 string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6                 string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr                   string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4                 string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6                 string            `validate:\"udp6_addr\"`\n\t\tIPAddr                    string            `validate:\"ip_addr\"`\n\t\tIPAddrv4                  string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6                  string            `validate:\"ip6_addr\"`\n\t\tUinxAddr                  string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC                       string            `validate:\"mac\"`\n\t\tFQDN                      string            `validate:\"fqdn\"`\n\t\tIsColor                   string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen              *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen              *string           `validate:\"max=1\"`\n\t\tStrPtrLen                 *string           `validate:\"len=2\"`\n\t\tStrPtrLt                  *string           `validate:\"lt=1\"`\n\t\tStrPtrLte                 *string           `validate:\"lte=1\"`\n\t\tStrPtrGt                  *string           `validate:\"gt=10\"`\n\t\tStrPtrGte                 *string           `validate:\"gte=10\"`\n\t\tOneOfString               string            `validate:\"oneof=red green\"`\n\t\tOneOfInt                  int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice               []string          `validate:\"unique\"`\n\t\tUniqueArray               [3]string         `validate:\"unique\"`\n\t\tUniqueMap                 map[string]string `validate:\"unique\"`\n\t\tJSONString                string            `validate:\"json\"`\n\t\tJWTString                 string            `validate:\"jwt\"`\n\t\tLowercaseString           string            `validate:\"lowercase\"`\n\t\tUppercaseString           string            `validate:\"uppercase\"`\n\t\tDatetime                  string            `validate:\"datetime=2006-01-02\"`\n\t\tPostCode                  string            `validate:\"postcode_iso3166_alpha2=SG\"`\n\t\tPostCodeCountry           string\n\t\tPostCodeByField           string `validate:\"postcode_iso3166_alpha2_field=PostCodeCountry\"`\n\t\tBooleanString             string `validate:\"boolean\"`\n\t\tImage                     string `validate:\"image\"`\n\t\tCveString                 string `validate:\"cve\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\ttest.Inner.RequiredUnless = \"1234\"\n\ttest.Inner.RequiredWith = \"1234\"\n\ttest.Inner.RequiredWithAll = \"1234\"\n\ttest.Inner.ExcludedIf = \"abcd\"\n\ttest.Inner.ExcludedUnless = \"1234\"\n\ttest.Inner.ExcludedWith = \"1234\"\n\ttest.Inner.ExcludedWithAll = \"1234\"\n\n\ttest.ExcludedIf = \"1234\"\n\ttest.ExcludedUnless = \"1234\"\n\ttest.ExcludedWith = \"1234\"\n\ttest.ExcludedWithAll = \"1234\"\n\ttest.ExcludedWithout = \"1234\"\n\ttest.ExcludedWithoutAll = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\ttest.Datetime = \"2008-Feb-01\"\n\ttest.BooleanString = \"A\"\n\ttest.CveString = \"A\"\n\n\ttest.Inner.RequiredIf = \"abcd\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor musi być prawdziwym kolorem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC musi zawierać poprawny MAC adres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.FQDN\",\n\t\t\texpected: \"FQDN musi być poprawnym FQDN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr musi być rozpoznawalnym adresem IP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 musi być rozpoznawalnym adresem IPv4\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 musi być rozpoznawalnym adresem IPv6\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr musi być poprawnym adresem UDP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 musi być poprawnym adresem IPv4 UDP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 musi być poprawnym adresem IPv6 UDP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr musi być poprawnym adresem TCP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 musi być poprawnym adresem IPv4 TCP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 musi być poprawnym adresem IPv6 TCP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR musi zawierać adres zapisany metodą CIDR\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 musi zawierać adres IPv4 zapisany metodą CIDR\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 musi zawierać adres IPv6 zapisany metodą CIDR\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN musi zawierać poprawny numer SSN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP musi zawierać poprawny adres IP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 musi zawierać poprawny adres IPv4\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 musi zawierać poprawny adres IPv6\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI musi zawierać poprawnie zakodowane dane w formie URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude musi zawierać poprawną szerokość geograficzną\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude musi zawierać poprawną długość geograficzną\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte musi zawierać znaki wielobajtowe\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII może zawierać wyłącznie znaki ASCII\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII może zawierać wyłącznie drukowalne znaki ASCII\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID musi być poprawnym identyfikatorem UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 musi być poprawnym identyfikatorem UUID w wersji 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 musi być poprawnym identyfikatorem UUID w wersji 4\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 musi być poprawnym identyfikatorem UUID w wersji 5\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID musi być poprawnym identyfikatorem ULID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN musi być poprawnym numerem ISBN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 musi być poprawnym numerem ISBN-10\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 musi być poprawnym numerem ISBN-13\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN musi być poprawnym numerem ISSN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes nie może zawierać tekstu 'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll nie może zawierać żadnych z następujących znaków '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune nie może zawierać następujących znaków '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny musi zawierać przynajmniej jeden z następujących znaków '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains musi zawierać tekst 'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 musi być ciągiem znaków zakodowanym w formacie Base64\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email musi być poprawnym adresem email\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL musi być poprawnym adresem URL\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI musi być poprawnym adresem URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString musi być poprawnym kolorem w formacie RGB\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString musi być poprawnym kolorem w formacie RGBA\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString musi być poprawnym kolorem w formacie HSL\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString musi być poprawnym kolorem w formacie HSLA\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString musi być poprawną wartością heksadecymalną\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString musi być poprawnym kolorem w formacie HEX\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString musi być poprawną liczbą\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString musi być poprawną wartością numeryczną\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString może zawierać wyłącznie znaki alfanumeryczne\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString może zawierać wyłącznie znaki alfabetu\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString musi być mniejsze niż MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString musi być mniejsze lub równe MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString musi być większe niż MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString musi być większe lub równe MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString nie może być równe EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString musi być mniejsze niż Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString musi być mniejsze lub równe Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString musi być większe niż Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString musi być większe lub równe niż Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString nie może być równe Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString musi być równe Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString musi być równe MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString musi mieć długość przynajmniej na 3 znaki\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteStringSingle\",\n\t\t\texpected: \"GteStringSingle musi mieć długość przynajmniej na 1 znak\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteStringFive\",\n\t\t\texpected: \"GteStringFive musi mieć długość przynajmniej na 5 znaków\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteStringTwentyOne\",\n\t\t\texpected: \"GteStringTwentyOne musi mieć długość przynajmniej na 21 znaków\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteStringBigNumber\",\n\t\t\texpected: \"GteStringBigNumber musi mieć długość przynajmniej na 852 znaki\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteStringAnotherBigNumber\",\n\t\t\texpected: \"GteStringAnotherBigNumber musi mieć długość przynajmniej na 2 137 znaków\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber musi być równe 5,56 lub większe\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple musi zawierać co najmniej 2 elementy\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime musi być większe lub równe niż obecny dzień i godzina\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString musi mieć długość większą niż 3 znaki\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber musi być większe niż 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple musi zawierać więcej niż 2 elementy\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime musi być większe niż obecny dzień i godzina\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString musi mieć długość maksymalnie na 3 znaki\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber musi być równe 5,56 lub mniej\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple musi zawierać maksymalnie 2 elementy\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime musi być mniejsze lub równe niż obecny dzień i godzina\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString musi mieć długość mniejszą niż 3 znaki\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber musi być mniejsze niż 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple musi zawierać mniej niż 2 elementy\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime musi być mniejsze niż obecny dzień i godzina\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString nie powinien być równy \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber nie powinien być równy 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple nie powinien być równy 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString nie równa się 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber nie równa się 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple nie równa się 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString musi mieć długość maksymalnie na 3 znaki\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber musi być równe 1 113,00 lub mniej\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple musi zawierać maksymalnie 7 elementów\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString musi mieć długość przynajmniej na 1 znak\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber musi być równe 1 113,00 lub więcej\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple musi zawierać przynajmniej 7 elementów\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString musi mieć długość na 1 znak\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber musi być równe 1 113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple musi zawierać 7 elementów\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString jest wymaganym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredIf\",\n\t\t\texpected: \"RequiredIf jest wymaganym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber jest wymaganym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple jest wymaganym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredUnless\",\n\t\t\texpected: \"RequiredUnless jest wymaganym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWith\",\n\t\t\texpected: \"RequiredWith jest wymaganym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithAll\",\n\t\t\texpected: \"RequiredWithAll jest wymaganym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithout\",\n\t\t\texpected: \"RequiredWithout jest wymaganym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithoutAll\",\n\t\t\texpected: \"RequiredWithoutAll jest wymaganym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedIf\",\n\t\t\texpected: \"ExcludedIf jest wykluczonym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedUnless\",\n\t\t\texpected: \"ExcludedUnless jest wykluczonym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWith\",\n\t\t\texpected: \"ExcludedWith jest wykluczonym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithAll\",\n\t\t\texpected: \"ExcludedWithAll jest wykluczonym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithout\",\n\t\t\texpected: \"ExcludedWithout jest wykluczonym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithoutAll\",\n\t\t\texpected: \"ExcludedWithoutAll jest wykluczonym polem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen musi mieć długość przynajmniej na 10 znaków\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen musi mieć długość maksymalnie na 1 znak\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen musi mieć długość na 2 znaki\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt musi mieć długość mniejszą niż 1 znak\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte musi mieć długość maksymalnie na 1 znak\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt musi mieć długość większą niż 10 znaków\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte musi mieć długość przynajmniej na 10 znaków\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString musi być jednym z [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt musi być jednym z [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice musi zawierać unikalne wartości\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray musi zawierać unikalne wartości\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap musi zawierać unikalne wartości\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JSONString\",\n\t\t\texpected: \"JSONString musi być ciągiem znaków w formacie JSON\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JWTString\",\n\t\t\texpected: \"JWTString musi być ciągiem znaków w formacie JWT\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"LowercaseString musi zawierać wyłącznie małe litery\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"UppercaseString musi zawierać wyłącznie duże litery\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"Datetime nie spełnia formatu 2006-01-02\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCode\",\n\t\t\texpected: \"PostCode nie spełnia formatu kodu pocztowego kraju SG\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCodeByField\",\n\t\t\texpected: \"PostCodeByField nie spełnia formatu kodu pocztowego kraju z pola PostCodeCountry\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.BooleanString\",\n\t\t\texpected: \"BooleanString musi być wartością logiczną\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image musi być obrazem\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CveString\",\n\t\t\texpected: \"CveString musi być poprawnym identyfikatorem CVE\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/pt/pt.go",
    "content": "package pt\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} é obrigatório\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} deve ter {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} deve ser igual a {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} deve conter {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} deve ter pelo menos {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} deve ser {1} ou superior\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} deve conter pelo menos {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} deve ter no máximo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} deve ser {1} ou menos\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} deve conter no máximo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0} não é igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0} não deve ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} deve ter menos de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} deve ser menor que {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} deve conter menos de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} deve ser anterior à data / hora atual\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} deve ter no máximo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} deve ser menor ou igual a {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} deve conter no máximo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} deve ser anterior ou igual à data/hora atual\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} deve conter mais de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} deve ser maior que {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} deve conter mais de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} deve ser posterior à data/hora atual\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} deve ter pelo menos {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} deve ser maior ou igual a {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} deve conter pelo menos {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} items\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} deve ser posterior ou igual à data/hora atual\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0} deve ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0} deve ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0} não deve ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0} deve ser maior que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0} deve ser maior ou igual que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0} deve ser menor que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0} deve ser menor ou igual que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0} não deve ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0} deve ser maior que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0} deve ser maior ou igual que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0} deve ser menor que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0} deve ser menor ou igual que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} deve conter apenas caracteres alfabéticos\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} deve conter apenas caracteres alfanuméricos\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} deve ser um valor numérico válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} deve ser um número válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} deve ser um hexadecimal válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} deve ser uma cor HEX válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} deve ser uma cor RGB válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} deve ser uma cor RGBA válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} deve ser uma cor HSL válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} deve ser uma cor HSLA válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0} deve ser um número de telefone válido no formato E.164\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} deve ser um endereço de e-mail válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} deve ser um URL válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} deve ser um URI válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} deve ser uma string Base64 válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0} deve conter o texto '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0} deve conter pelo menos um dos seguintes caracteres '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0} não deve conter o texto '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0} não deve conter os seguintes caracteres '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0} não pode conter o seguinte '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} deve ser um número de ISBN válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} deve ser um número ISBN-10 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} deve ser um número ISBN-13 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} deve ser um número ISSN válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} deve ser um UUID válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} deve ser um UUID versão 3 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} deve ser um UUID versão 4 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} deve ser um UUID versão 5 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} deve ser um ULID válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} deve conter apenas caracteres ascii\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} deve conter apenas caracteres ascii imprimíveis\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} deve conter caracteres multibyte\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} deve conter um Data URI válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} deve conter uma coordenada de latitude válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} deve conter uma coordenada de longitude válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} deve ser um número SSN válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} deve ser um endereço IPv4 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} deve ser um endereço IPv6 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} deve ser um endereço IP válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} não respeita a notação CIDR\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} não respeita a notação CIDR para um endereço IPv4\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} não respeita a notação CIDR para um endereço IPv6\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço TCP válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço TCP IPv4 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço TCP IPv6 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço UDP válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço UDP IPv4 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço UDP IPv6 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço IP resolvível\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço IPv4 resolvível\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço IPv6 resolvível\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço UNIX resolvível\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} deve conter um endereço MAC válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} deve conter valores únicos\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} deve ser uma cor válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0} deve ser um de [{1}]\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0} deve ser uma string json válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0} deve estar em minuscúlas\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0} deve estar em maiúsculas\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datetime\",\n\t\t\ttranslation: \"{0} não está no formato {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} deve ser uma imagem válida\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/pt/pt_test.go",
    "content": "package pt\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\t\"github.com/go-playground/locales/pt\"\n\tut \"github.com/go-playground/universal-translator\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tpt := pt.New()\n\tuni := ut.New(pt, pt)\n\ttrans, _ := uni.GetTranslator(\"pt\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t}\n\n\ttype Test struct {\n\t\tInner             Inner\n\t\tRequiredString    string            `validate:\"required\"`\n\t\tRequiredNumber    int               `validate:\"required\"`\n\t\tRequiredMultiple  []string          `validate:\"required\"`\n\t\tLenString         string            `validate:\"len=1\"`\n\t\tLenNumber         float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple       []string          `validate:\"len=7\"`\n\t\tMinString         string            `validate:\"min=1\"`\n\t\tMinNumber         float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple       []string          `validate:\"min=7\"`\n\t\tMaxString         string            `validate:\"max=3\"`\n\t\tMaxNumber         float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple       []string          `validate:\"max=7\"`\n\t\tEqString          string            `validate:\"eq=3\"`\n\t\tEqNumber          float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple        []string          `validate:\"eq=7\"`\n\t\tNeString          string            `validate:\"ne=\"`\n\t\tNeNumber          float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple        []string          `validate:\"ne=0\"`\n\t\tLtString          string            `validate:\"lt=3\"`\n\t\tLtNumber          float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple        []string          `validate:\"lt=2\"`\n\t\tLtTime            time.Time         `validate:\"lt\"`\n\t\tLteString         string            `validate:\"lte=3\"`\n\t\tLteNumber         float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple       []string          `validate:\"lte=2\"`\n\t\tLteTime           time.Time         `validate:\"lte\"`\n\t\tGtString          string            `validate:\"gt=3\"`\n\t\tGtNumber          float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple        []string          `validate:\"gt=2\"`\n\t\tGtTime            time.Time         `validate:\"gt\"`\n\t\tGteString         string            `validate:\"gte=3\"`\n\t\tGteNumber         float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple       []string          `validate:\"gte=2\"`\n\t\tGteTime           time.Time         `validate:\"gte\"`\n\t\tEqFieldString     string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString   string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString   string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString   string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString  string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString   string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString  string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString     string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString     string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString    string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString     string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString    string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString       string            `validate:\"alpha\"`\n\t\tAlphanumString    string            `validate:\"alphanum\"`\n\t\tNumericString     string            `validate:\"numeric\"`\n\t\tNumberString      string            `validate:\"number\"`\n\t\tHexadecimalString string            `validate:\"hexadecimal\"`\n\t\tHexColorString    string            `validate:\"hexcolor\"`\n\t\tRGBColorString    string            `validate:\"rgb\"`\n\t\tRGBAColorString   string            `validate:\"rgba\"`\n\t\tHSLColorString    string            `validate:\"hsl\"`\n\t\tHSLAColorString   string            `validate:\"hsla\"`\n\t\tEmail             string            `validate:\"email\"`\n\t\tURL               string            `validate:\"url\"`\n\t\tURI               string            `validate:\"uri\"`\n\t\tBase64            string            `validate:\"base64\"`\n\t\tContains          string            `validate:\"contains=purpose\"`\n\t\tContainsAny       string            `validate:\"containsany=!@#$\"`\n\t\tExcludes          string            `validate:\"excludes=text\"`\n\t\tExcludesAll       string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune      string            `validate:\"excludesrune=☻\"`\n\t\tISBN              string            `validate:\"isbn\"`\n\t\tISBN10            string            `validate:\"isbn10\"`\n\t\tISBN13            string            `validate:\"isbn13\"`\n\t\tISSN              string            `validate:\"issn\"`\n\t\tUUID              string            `validate:\"uuid\"`\n\t\tUUID3             string            `validate:\"uuid3\"`\n\t\tUUID4             string            `validate:\"uuid4\"`\n\t\tUUID5             string            `validate:\"uuid5\"`\n\t\tULID              string            `validate:\"ulid\"`\n\t\tASCII             string            `validate:\"ascii\"`\n\t\tPrintableASCII    string            `validate:\"printascii\"`\n\t\tMultiByte         string            `validate:\"multibyte\"`\n\t\tDataURI           string            `validate:\"datauri\"`\n\t\tLatitude          string            `validate:\"latitude\"`\n\t\tLongitude         string            `validate:\"longitude\"`\n\t\tSSN               string            `validate:\"ssn\"`\n\t\tIP                string            `validate:\"ip\"`\n\t\tIPv4              string            `validate:\"ipv4\"`\n\t\tIPv6              string            `validate:\"ipv6\"`\n\t\tCIDR              string            `validate:\"cidr\"`\n\t\tCIDRv4            string            `validate:\"cidrv4\"`\n\t\tCIDRv6            string            `validate:\"cidrv6\"`\n\t\tTCPAddr           string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4         string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6         string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr           string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4         string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6         string            `validate:\"udp6_addr\"`\n\t\tIPAddr            string            `validate:\"ip_addr\"`\n\t\tIPAddrv4          string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6          string            `validate:\"ip6_addr\"`\n\t\tUinxAddr          string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC               string            `validate:\"mac\"`\n\t\tIsColor           string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen      *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen      *string           `validate:\"max=1\"`\n\t\tStrPtrLen         *string           `validate:\"len=2\"`\n\t\tStrPtrLt          *string           `validate:\"lt=1\"`\n\t\tStrPtrLte         *string           `validate:\"lte=1\"`\n\t\tStrPtrGt          *string           `validate:\"gt=10\"`\n\t\tStrPtrGte         *string           `validate:\"gte=10\"`\n\t\tOneOfString       string            `validate:\"oneof=red green\"`\n\t\tOneOfInt          int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice       []string          `validate:\"unique\"`\n\t\tUniqueArray       [3]string         `validate:\"unique\"`\n\t\tUniqueMap         map[string]string `validate:\"unique\"`\n\t\tJSONString        string            `validate:\"json\"`\n\t\tLowercaseString   string            `validate:\"lowercase\"`\n\t\tUppercaseString   string            `validate:\"uppercase\"`\n\t\tDatetime          string            `validate:\"datetime=2006-01-02\"`\n\t\tImage             string            `validate:\"image\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\ttest.Datetime = \"2008-Feb-01\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor deve ser uma cor válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC deve conter um endereço MAC válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr deve ser um endereço IP resolvível\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 deve ser um endereço IPv4 resolvível\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 deve ser um endereço IPv6 resolvível\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr deve ser um endereço UDP válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 deve ser um endereço UDP IPv4 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 deve ser um endereço UDP IPv6 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr deve ser um endereço TCP válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 deve ser um endereço TCP IPv4 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 deve ser um endereço TCP IPv6 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR não respeita a notação CIDR\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 não respeita a notação CIDR para um endereço IPv4\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 não respeita a notação CIDR para um endereço IPv6\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN deve ser um número SSN válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP deve ser um endereço IP válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 deve ser um endereço IPv4 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 deve ser um endereço IPv6 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI deve conter um Data URI válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude deve conter uma coordenada de latitude válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude deve conter uma coordenada de longitude válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte deve conter caracteres multibyte\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII deve conter apenas caracteres ascii\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII deve conter apenas caracteres ascii imprimíveis\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID deve ser um UUID válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 deve ser um UUID versão 3 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 deve ser um UUID versão 4 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 deve ser um UUID versão 5 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID deve ser um ULID válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN deve ser um número de ISBN válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 deve ser um número ISBN-10 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 deve ser um número ISBN-13 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN deve ser um número ISSN válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes não deve conter o texto 'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll não deve conter os seguintes caracteres '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune não pode conter o seguinte '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny deve conter pelo menos um dos seguintes caracteres '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains deve conter o texto 'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 deve ser uma string Base64 válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email deve ser um endereço de e-mail válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL deve ser um URL válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI deve ser um URI válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString deve ser uma cor RGB válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString deve ser uma cor RGBA válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString deve ser uma cor HSL válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString deve ser uma cor HSLA válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString deve ser um hexadecimal válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString deve ser uma cor HEX válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString deve ser um número válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString deve ser um valor numérico válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString deve conter apenas caracteres alfanuméricos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString deve conter apenas caracteres alfabéticos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString deve ser menor que MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString deve ser menor ou igual que MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString deve ser maior que MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString deve ser maior ou igual que MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString não deve ser igual a EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString deve ser menor que Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString deve ser menor ou igual que Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString deve ser maior que Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString deve ser maior ou igual que Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString não deve ser igual a Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString deve ser igual a Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString deve ser igual a MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString deve ter pelo menos 3 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber deve ser maior ou igual a 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple deve conter pelo menos 2 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime deve ser posterior ou igual à data/hora atual\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString deve conter mais de 3 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber deve ser maior que 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple deve conter mais de 2 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime deve ser posterior à data/hora atual\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString deve ter no máximo 3 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber deve ser menor ou igual a 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple deve conter no máximo 2 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime deve ser anterior ou igual à data/hora atual\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString deve ter menos de 3 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber deve ser menor que 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple deve conter menos de 2 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime deve ser anterior à data / hora atual\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString não deve ser igual a \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber não deve ser igual a 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple não deve ser igual a 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString não é igual a 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber não é igual a 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple não é igual a 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString deve ter no máximo 3 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber deve ser 1.113,00 ou menos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple deve conter no máximo 7 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString deve ter pelo menos 1 caractere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber deve ser 1.113,00 ou superior\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple deve conter pelo menos 7 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString deve ter 1 caractere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber deve ser igual a 1.113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple deve conter 7 items\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString é obrigatório\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber é obrigatório\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple é obrigatório\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen deve ter pelo menos 10 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen deve ter no máximo 1 caractere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen deve ter 2 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt deve ter menos de 1 caractere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte deve ter no máximo 1 caractere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt deve conter mais de 10 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte deve ter pelo menos 10 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString deve ser um de [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt deve ser um de [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice deve conter valores únicos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray deve conter valores únicos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap deve conter valores únicos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JSONString\",\n\t\t\texpected: \"JSONString deve ser uma string json válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"LowercaseString deve estar em minuscúlas\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"UppercaseString deve estar em maiúsculas\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"Datetime não está no formato 2006-01-02\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image deve ser uma imagem válida\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/pt_BR/pt_BR.go",
    "content": "package pt_BR\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} é um campo obrigatório\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} deve ter {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} deve ser igual a {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} deve conter {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} itens\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"alerta: erro na tradução FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} deve ter pelo menos {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} deve ser {1} ou superior\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} deve conter pelo menos {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} itens\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"alerta: erro na tradução FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} deve ter no máximo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} deve ser {1} ou menor\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} deve conter no máximo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} itens\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"alerta: erro na tradução FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0} não é igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0} não deve ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} deve ter menos de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} deve ser menor que {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} deve conter menos de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} itens\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} deve ser inferior à Data e Hora atual\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"a tag '%s' não pode ser usada em uma struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"alerta: erro na tradução FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} deve ter no máximo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} deve ser {1} ou menor\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} deve conter no máximo {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} itens\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} deve ser menor ou igual à Data e Hora atual\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"a tag '%s' não pode ser usado em uma struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"alerta: erro na tradução FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} deve ter mais de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} deve ser maior do que {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} deve conter mais de {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} itens\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} deve ser maior que a Data e Hora atual\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"a tag '%s' não pode ser usado em uma struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"alerta: erro na tradução FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} deve ter pelo menos {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} caractere\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} caracteres\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} deve ser {1} ou superior\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} deve conter pelo menos {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} itens\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} deve ser maior ou igual à Data e Hora atual\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"a tag '%s' não pode ser usado em uma struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"alerta: erro na tradução FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0} deve ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0} deve ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0} não deve ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0} deve ser maior do que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0} deve ser maior ou igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0} deve ser menor que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0} deve ser menor ou igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0} não deve ser igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0} deve ser maior do que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0} deve ser maior ou igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0} deve ser menor que {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0} deve ser menor ou igual a {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} deve conter caracteres alfabéticos\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} deve conter caracteres alfanuméricos\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} deve ser um valor numérico válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} deve ser um número válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} deve ser um hexadecimal válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} deve ser uma cor HEX válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} deve ser uma cor RGB válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} deve ser uma cor RGBA válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} deve ser uma cor HSL válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} deve ser uma cor HSLA válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} deve ser um endereço de e-mail válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} deve ser uma URL válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} deve ser uma URI válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} deve ser uma string Base64 válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0} deve conter o texto '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0} deve conter pelo menos um dos caracteres '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0} não deve conter o texto '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0} não deve conter nenhum dos caracteres '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0} não deve conter '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} deve ser um número ISBN válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} deve ser um número ISBN-10 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} deve ser um número ISBN-13 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} deve ser um número ISSN válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} deve ser um UUID válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} deve ser um UUID versão 3 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} deve ser um UUID versão 4 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} deve ser um UUID versão 5 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} deve ser uma ULID válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} deve conter apenas caracteres ascii\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} deve conter apenas caracteres ascii imprimíveis\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} deve conter caracteres multibyte\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} deve conter um URI data válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} deve conter uma coordenada de latitude válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} deve conter uma coordenada de longitude válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} deve ser um número SSN válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} deve ser um endereço IPv4 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} deve ser um endereço IPv6 válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} deve ser um endereço de IP válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} deve conter uma notação CIDR válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} deve conter uma notação CIDR válida para um endereço IPv4\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} deve conter uma notação CIDR válida para um endereço IPv6\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço TCP válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço IPv4 TCP válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço IPv6 TCP válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço UDP válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço IPv4 UDP válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço IPv6 UDP válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço IP resolvível\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço IPv4 resolvível\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço IPv6 resolvível\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} deve ser um endereço UNIX resolvível\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} deve conter um endereço MAC válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} deve ser uma cor válida\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0} deve ser um de [{1}]\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"boolean\",\n\t\t\ttranslation: \"{0} deve ser um valor booleano válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} deve ser uma imagen válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cve\",\n\t\t\ttranslation: \"{0} deve ser um identificador cve válido\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"validateFn\",\n\t\t\ttranslation: \"{0} deve ser um objeto válido\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"alerta: erro na tradução FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/pt_BR/pt_BR_test.go",
    "content": "package pt_BR\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tbrazilian_portuguese \"github.com/go-playground/locales/pt_BR\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\ntype Foo struct{}\n\nfunc (Foo) IsBar() bool { return false }\n\nfunc TestTranslations(t *testing.T) {\n\tptbr := brazilian_portuguese.New()\n\tuni := ut.New(ptbr, ptbr)\n\ttrans, _ := uni.GetTranslator(\"pt_BR\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t}\n\n\ttype Test struct {\n\t\tInner             Inner\n\t\tRequiredString    string    `validate:\"required\"`\n\t\tRequiredNumber    int       `validate:\"required\"`\n\t\tRequiredMultiple  []string  `validate:\"required\"`\n\t\tLenString         string    `validate:\"len=1\"`\n\t\tLenNumber         float64   `validate:\"len=1113.00\"`\n\t\tLenMultiple       []string  `validate:\"len=7\"`\n\t\tMinString         string    `validate:\"min=1\"`\n\t\tMinNumber         float64   `validate:\"min=1113.00\"`\n\t\tMinMultiple       []string  `validate:\"min=7\"`\n\t\tMaxString         string    `validate:\"max=3\"`\n\t\tMaxNumber         float64   `validate:\"max=1113.00\"`\n\t\tMaxMultiple       []string  `validate:\"max=7\"`\n\t\tEqString          string    `validate:\"eq=3\"`\n\t\tEqNumber          float64   `validate:\"eq=2.33\"`\n\t\tEqMultiple        []string  `validate:\"eq=7\"`\n\t\tNeString          string    `validate:\"ne=\"`\n\t\tNeNumber          float64   `validate:\"ne=0.00\"`\n\t\tNeMultiple        []string  `validate:\"ne=0\"`\n\t\tLtString          string    `validate:\"lt=3\"`\n\t\tLtNumber          float64   `validate:\"lt=5.56\"`\n\t\tLtMultiple        []string  `validate:\"lt=2\"`\n\t\tLtTime            time.Time `validate:\"lt\"`\n\t\tLteString         string    `validate:\"lte=3\"`\n\t\tLteNumber         float64   `validate:\"lte=5.56\"`\n\t\tLteMultiple       []string  `validate:\"lte=2\"`\n\t\tLteTime           time.Time `validate:\"lte\"`\n\t\tGtString          string    `validate:\"gt=3\"`\n\t\tGtNumber          float64   `validate:\"gt=5.56\"`\n\t\tGtMultiple        []string  `validate:\"gt=2\"`\n\t\tGtTime            time.Time `validate:\"gt\"`\n\t\tGteString         string    `validate:\"gte=3\"`\n\t\tGteNumber         float64   `validate:\"gte=5.56\"`\n\t\tGteMultiple       []string  `validate:\"gte=2\"`\n\t\tGteTime           time.Time `validate:\"gte\"`\n\t\tEqFieldString     string    `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString   string    `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString   string    `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString   string    `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString  string    `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString   string    `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString  string    `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString     string    `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString     string    `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString    string    `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString     string    `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString    string    `validate:\"ltefield=MaxString\"`\n\t\tAlphaString       string    `validate:\"alpha\"`\n\t\tAlphanumString    string    `validate:\"alphanum\"`\n\t\tNumericString     string    `validate:\"numeric\"`\n\t\tNumberString      string    `validate:\"number\"`\n\t\tHexadecimalString string    `validate:\"hexadecimal\"`\n\t\tHexColorString    string    `validate:\"hexcolor\"`\n\t\tRGBColorString    string    `validate:\"rgb\"`\n\t\tRGBAColorString   string    `validate:\"rgba\"`\n\t\tHSLColorString    string    `validate:\"hsl\"`\n\t\tHSLAColorString   string    `validate:\"hsla\"`\n\t\tEmail             string    `validate:\"email\"`\n\t\tURL               string    `validate:\"url\"`\n\t\tURI               string    `validate:\"uri\"`\n\t\tBase64            string    `validate:\"base64\"`\n\t\tContains          string    `validate:\"contains=purpose\"`\n\t\tContainsAny       string    `validate:\"containsany=!@#$\"`\n\t\tExcludes          string    `validate:\"excludes=text\"`\n\t\tExcludesAll       string    `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune      string    `validate:\"excludesrune=☻\"`\n\t\tISBN              string    `validate:\"isbn\"`\n\t\tISBN10            string    `validate:\"isbn10\"`\n\t\tISBN13            string    `validate:\"isbn13\"`\n\t\tISSN              string    `validate:\"issn\"`\n\t\tUUID              string    `validate:\"uuid\"`\n\t\tUUID3             string    `validate:\"uuid3\"`\n\t\tUUID4             string    `validate:\"uuid4\"`\n\t\tUUID5             string    `validate:\"uuid5\"`\n\t\tULID              string    `validate:\"ulid\"`\n\t\tASCII             string    `validate:\"ascii\"`\n\t\tPrintableASCII    string    `validate:\"printascii\"`\n\t\tMultiByte         string    `validate:\"multibyte\"`\n\t\tDataURI           string    `validate:\"datauri\"`\n\t\tLatitude          string    `validate:\"latitude\"`\n\t\tLongitude         string    `validate:\"longitude\"`\n\t\tSSN               string    `validate:\"ssn\"`\n\t\tIP                string    `validate:\"ip\"`\n\t\tIPv4              string    `validate:\"ipv4\"`\n\t\tIPv6              string    `validate:\"ipv6\"`\n\t\tCIDR              string    `validate:\"cidr\"`\n\t\tCIDRv4            string    `validate:\"cidrv4\"`\n\t\tCIDRv6            string    `validate:\"cidrv6\"`\n\t\tTCPAddr           string    `validate:\"tcp_addr\"`\n\t\tTCPAddrv4         string    `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6         string    `validate:\"tcp6_addr\"`\n\t\tUDPAddr           string    `validate:\"udp_addr\"`\n\t\tUDPAddrv4         string    `validate:\"udp4_addr\"`\n\t\tUDPAddrv6         string    `validate:\"udp6_addr\"`\n\t\tIPAddr            string    `validate:\"ip_addr\"`\n\t\tIPAddrv4          string    `validate:\"ip4_addr\"`\n\t\tIPAddrv6          string    `validate:\"ip6_addr\"`\n\t\tUinxAddr          string    `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC               string    `validate:\"mac\"`\n\t\tIsColor           string    `validate:\"iscolor\"`\n\t\tStrPtrMinLen      *string   `validate:\"min=10\"`\n\t\tStrPtrMaxLen      *string   `validate:\"max=1\"`\n\t\tStrPtrLen         *string   `validate:\"len=2\"`\n\t\tStrPtrLt          *string   `validate:\"lt=1\"`\n\t\tStrPtrLte         *string   `validate:\"lte=1\"`\n\t\tStrPtrGt          *string   `validate:\"gt=10\"`\n\t\tStrPtrGte         *string   `validate:\"gte=10\"`\n\t\tOneOfString       string    `validate:\"oneof=red green\"`\n\t\tOneOfInt          int       `validate:\"oneof=5 63\"`\n\t\tBooleanString     string    `validate:\"boolean\"`\n\t\tImage             string    `validate:\"image\"`\n\t\tCveString         string    `validate:\"cve\"`\n\t\tValidateFn        Foo       `validate:\"validateFn=IsBar\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\ttest.BooleanString = \"A\"\n\ttest.CveString = \"A\"\n\n\ttest.Excludes = \"este é um texto de teste\"\n\ttest.ExcludesAll = \"Isso é Ótimo!\"\n\ttest.ExcludesRune = \"Amo isso ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor deve ser uma cor válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC deve conter um endereço MAC válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr deve ser um endereço IP resolvível\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 deve ser um endereço IPv4 resolvível\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 deve ser um endereço IPv6 resolvível\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr deve ser um endereço UDP válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 deve ser um endereço IPv4 UDP válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 deve ser um endereço IPv6 UDP válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr deve ser um endereço TCP válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 deve ser um endereço IPv4 TCP válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 deve ser um endereço IPv6 TCP válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR deve conter uma notação CIDR válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 deve conter uma notação CIDR válida para um endereço IPv4\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 deve conter uma notação CIDR válida para um endereço IPv6\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN deve ser um número SSN válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP deve ser um endereço de IP válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 deve ser um endereço IPv4 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 deve ser um endereço IPv6 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI deve conter um URI data válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude deve conter uma coordenada de latitude válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude deve conter uma coordenada de longitude válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte deve conter caracteres multibyte\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII deve conter apenas caracteres ascii\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII deve conter apenas caracteres ascii imprimíveis\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID deve ser um UUID válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 deve ser um UUID versão 3 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 deve ser um UUID versão 4 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 deve ser um UUID versão 5 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID deve ser uma ULID válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN deve ser um número ISBN válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 deve ser um número ISBN-10 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 deve ser um número ISBN-13 válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN deve ser um número ISSN válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes não deve conter o texto 'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll não deve conter nenhum dos caracteres '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune não deve conter '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny deve conter pelo menos um dos caracteres '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains deve conter o texto 'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 deve ser uma string Base64 válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email deve ser um endereço de e-mail válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL deve ser uma URL válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI deve ser uma URI válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString deve ser uma cor RGB válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString deve ser uma cor RGBA válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString deve ser uma cor HSL válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString deve ser uma cor HSLA válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString deve ser um hexadecimal válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString deve ser uma cor HEX válida\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString deve ser um número válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString deve ser um valor numérico válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString deve conter caracteres alfanuméricos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString deve conter caracteres alfabéticos\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString deve ser menor que MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString deve ser menor ou igual a MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString deve ser maior do que MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString deve ser maior ou igual a MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString não deve ser igual a EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString deve ser menor que Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString deve ser menor ou igual a Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString deve ser maior do que Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString deve ser maior ou igual a Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString não deve ser igual a Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString deve ser igual a Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString deve ser igual a MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString deve ter pelo menos 3 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber deve ser 5,56 ou superior\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple deve conter pelo menos 2 itens\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime deve ser maior ou igual à Data e Hora atual\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString deve ter mais de 3 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber deve ser maior do que 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple deve conter mais de 2 itens\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime deve ser maior que a Data e Hora atual\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString deve ter no máximo 3 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber deve ser 5,56 ou menor\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple deve conter no máximo 2 itens\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime deve ser menor ou igual à Data e Hora atual\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString deve ter menos de 3 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber deve ser menor que 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple deve conter menos de 2 itens\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime deve ser inferior à Data e Hora atual\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString não deve ser igual a \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber não deve ser igual a 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple não deve ser igual a 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString não é igual a 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber não é igual a 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple não é igual a 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString deve ter no máximo 3 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber deve ser 1.113,00 ou menor\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple deve conter no máximo 7 itens\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString deve ter pelo menos 1 caractere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber deve ser 1.113,00 ou superior\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple deve conter pelo menos 7 itens\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString deve ter 1 caractere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber deve ser igual a 1.113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple deve conter 7 itens\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString é um campo obrigatório\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber é um campo obrigatório\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple é um campo obrigatório\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen deve ter pelo menos 10 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen deve ter no máximo 1 caractere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen deve ter 2 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt deve ter menos de 1 caractere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte deve ter no máximo 1 caractere\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt deve ter mais de 10 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte deve ter pelo menos 10 caracteres\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString deve ser um de [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt deve ser um de [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.BooleanString\",\n\t\t\texpected: \"BooleanString deve ser um valor booleano válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image deve ser uma imagen válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CveString\",\n\t\t\texpected: \"CveString deve ser um identificador cve válido\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ValidateFn\",\n\t\t\texpected: \"ValidateFn deve ser um objeto válido\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/ru/ru.go",
    "content": "package ru\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} обязательное поле\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} должен быть длиной в {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} символ\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} символа\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} символов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} символы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} должен быть равен {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} должен содержать {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} элемент\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} элемента\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} элементов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} элементы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} должен содержать минимум {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} символ\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} символа\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} символов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} символы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} должен быть больше или равно {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} должен содержать минимум {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} элемент\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} элемента\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} элементов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} элементы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} должен содержать максимум {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} символ\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} символа\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} символов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} символы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} должен быть меньше или равно {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} должен содержать максимум {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} элемент\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} элемента\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} элементов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} элементы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0} не равен {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0} должен быть не равен {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} должен иметь менее {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} символ\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} символов\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} символов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} символы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} должен быть менее {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} должен содержать менее {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} элемент\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} элементов\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} элементов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} элементы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} must be less than the current Date & Time\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} должен содержать максимум {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} символ\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} символа\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} символов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} символы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} должен быть менее или равен {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} должен содержать максимум {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} элемент\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} элемента\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} элементов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} элементы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} must be less than or equal to the current Date & Time\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} должен быть длиннее {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} символ\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} символов\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} символов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} символы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} должен быть больше {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} должен содержать более {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} элемент\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} элементов\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} элементов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} элементы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} должна быть позже текущего момента\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} должен содержать минимум {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} символ\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} символа\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} символов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} символы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} должен быть больше или равно {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} должен содержать минимум {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} элемент\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} элемента\", locales.PluralRuleFew, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} элементов\", locales.PluralRuleMany, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} элементы\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} должна быть позже или равна текущему моменту\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0} должен быть равен {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0} должен быть равен {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0} не должен быть равен {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0} должен быть больше {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0} должен быть больше или равен {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0} должен быть менее {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0} должен быть менее или равен {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0} не должен быть равен {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0} должен быть больше {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0} должен быть больше или равен {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0} должен быть менее {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0} должен быть менее или равен {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} должен содержать только буквы\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} должен содержать только буквы и цифры\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} должен быть цифровым значением\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} должен быть цифрой\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} должен быть шестнадцатеричной строкой\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} должен быть HEX цветом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} должен быть RGB цветом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} должен быть RGBA цветом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} должен быть HSL цветом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} должен быть HSLA цветом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0} должен быть действительным номером телефона в формате E.164\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} должен быть email адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} должен быть URL\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} должен быть URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} должен быть Base64 строкой\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0} должен содержать текст '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0} должен содержать минимум один из символов '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0} не должен содержать текст '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0} не должен содержать символы '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0} не должен содержать '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} должен быть ISBN номером\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} должен быть ISBN-10 номером\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} должен быть ISBN-13 номером\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} должен быть ISSN номером\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} должен быть UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} должен быть UUID 3 версии\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} должен быть UUID 4 версии\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} должен быть UUID 5 версии\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} должен быть ULID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} должен содержать только ascii символы\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} должен содержать только доступные для печати ascii символы\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} должен содержать мультибайтные символы\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} должен содержать Data URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} должен содержать координаты широты\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} должен содержать координаты долготы\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} должен быть SSN номером\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} должен быть IPv4 адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} должен быть IPv6 адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} должен быть IP адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} должен содержать CIDR обозначения\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} должен содержать CIDR обозначения для IPv4 адреса\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} должен содержать CIDR обозначения для IPv6 адреса\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} должен быть TCP адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} должен быть IPv4 TCP адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} должен быть IPv6 TCP адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} должен быть UDP адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} должен быть IPv4 UDP адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} должен быть IPv6 UDP адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} должен быть распознаваемым IP адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} должен быть распознаваемым IPv4 адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} должен быть распознаваемым IPv6 адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} должен быть распознаваемым UNIX адресом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} должен содержать MAC адрес\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} должен содержать уникальные значения\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} должен быть цветом\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0} должен быть одним из [{1}]\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} должно быть допустимым изображением\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/ru/ru_test.go",
    "content": "package ru\n\nimport (\n\t\"log\"\n\t//\"github.com/rustery/validator\"\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\trussian \"github.com/go-playground/locales/ru\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tru := russian.New()\n\tuni := ut.New(ru, ru)\n\ttrans, _ := uni.GetTranslator(\"ru\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t}\n\n\ttype Test struct {\n\t\tInner                   Inner\n\t\tRequiredString          string            `validate:\"required\"`\n\t\tRequiredNumber          int               `validate:\"required\"`\n\t\tRequiredMultiple        []string          `validate:\"required\"`\n\t\tLenString               string            `validate:\"len=1\"`\n\t\tLenNumber               float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple             []string          `validate:\"len=7\"`\n\t\tLenMultipleSecond       []string          `validate:\"len=2\"`\n\t\tMinString               string            `validate:\"min=1\"`\n\t\tMinStringMultiple       string            `validate:\"min=2\"`\n\t\tMinStringMultipleSecond string            `validate:\"min=7\"`\n\t\tMinNumber               float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple             []string          `validate:\"min=7\"`\n\t\tMinMultipleSecond       []string          `validate:\"min=2\"`\n\t\tMaxString               string            `validate:\"max=3\"`\n\t\tMaxStringSecond         string            `validate:\"max=7\"`\n\t\tMaxNumber               float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple             []string          `validate:\"max=7\"`\n\t\tMaxMultipleSecond       []string          `validate:\"max=2\"`\n\t\tEqString                string            `validate:\"eq=3\"`\n\t\tEqNumber                float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple              []string          `validate:\"eq=7\"`\n\t\tNeString                string            `validate:\"ne=\"`\n\t\tNeNumber                float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple              []string          `validate:\"ne=0\"`\n\t\tLtString                string            `validate:\"lt=3\"`\n\t\tLtStringSecond          string            `validate:\"lt=7\"`\n\t\tLtNumber                float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple              []string          `validate:\"lt=2\"`\n\t\tLtMultipleSecond        []string          `validate:\"lt=7\"`\n\t\tLtTime                  time.Time         `validate:\"lt\"`\n\t\tLteString               string            `validate:\"lte=3\"`\n\t\tLteStringSecond         string            `validate:\"lte=7\"`\n\t\tLteNumber               float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple             []string          `validate:\"lte=2\"`\n\t\tLteMultipleSecond       []string          `validate:\"lte=7\"`\n\t\tLteTime                 time.Time         `validate:\"lte\"`\n\t\tGtString                string            `validate:\"gt=3\"`\n\t\tGtStringSecond          string            `validate:\"gt=7\"`\n\t\tGtNumber                float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple              []string          `validate:\"gt=2\"`\n\t\tGtMultipleSecond        []string          `validate:\"gt=7\"`\n\t\tGtTime                  time.Time         `validate:\"gt\"`\n\t\tGteString               string            `validate:\"gte=3\"`\n\t\tGteStringSecond         string            `validate:\"gte=7\"`\n\t\tGteNumber               float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple             []string          `validate:\"gte=2\"`\n\t\tGteMultipleSecond       []string          `validate:\"gte=7\"`\n\t\tGteTime                 time.Time         `validate:\"gte\"`\n\t\tEqFieldString           string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString         string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString         string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString         string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString        string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString         string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString        string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString           string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString           string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString          string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString           string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString          string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString             string            `validate:\"alpha\"`\n\t\tAlphanumString          string            `validate:\"alphanum\"`\n\t\tNumericString           string            `validate:\"numeric\"`\n\t\tNumberString            string            `validate:\"number\"`\n\t\tHexadecimalString       string            `validate:\"hexadecimal\"`\n\t\tHexColorString          string            `validate:\"hexcolor\"`\n\t\tRGBColorString          string            `validate:\"rgb\"`\n\t\tRGBAColorString         string            `validate:\"rgba\"`\n\t\tHSLColorString          string            `validate:\"hsl\"`\n\t\tHSLAColorString         string            `validate:\"hsla\"`\n\t\tEmail                   string            `validate:\"email\"`\n\t\tURL                     string            `validate:\"url\"`\n\t\tURI                     string            `validate:\"uri\"`\n\t\tBase64                  string            `validate:\"base64\"`\n\t\tContains                string            `validate:\"contains=purpose\"`\n\t\tContainsAny             string            `validate:\"containsany=!@#$\"`\n\t\tExcludes                string            `validate:\"excludes=text\"`\n\t\tExcludesAll             string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune            string            `validate:\"excludesrune=☻\"`\n\t\tISBN                    string            `validate:\"isbn\"`\n\t\tISBN10                  string            `validate:\"isbn10\"`\n\t\tISBN13                  string            `validate:\"isbn13\"`\n\t\tISSN                    string            `validate:\"issn\"`\n\t\tUUID                    string            `validate:\"uuid\"`\n\t\tUUID3                   string            `validate:\"uuid3\"`\n\t\tUUID4                   string            `validate:\"uuid4\"`\n\t\tUUID5                   string            `validate:\"uuid5\"`\n\t\tULID                    string            `validate:\"ulid\"`\n\t\tASCII                   string            `validate:\"ascii\"`\n\t\tPrintableASCII          string            `validate:\"printascii\"`\n\t\tMultiByte               string            `validate:\"multibyte\"`\n\t\tDataURI                 string            `validate:\"datauri\"`\n\t\tLatitude                string            `validate:\"latitude\"`\n\t\tLongitude               string            `validate:\"longitude\"`\n\t\tSSN                     string            `validate:\"ssn\"`\n\t\tIP                      string            `validate:\"ip\"`\n\t\tIPv4                    string            `validate:\"ipv4\"`\n\t\tIPv6                    string            `validate:\"ipv6\"`\n\t\tCIDR                    string            `validate:\"cidr\"`\n\t\tCIDRv4                  string            `validate:\"cidrv4\"`\n\t\tCIDRv6                  string            `validate:\"cidrv6\"`\n\t\tTCPAddr                 string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4               string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6               string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr                 string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4               string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6               string            `validate:\"udp6_addr\"`\n\t\tIPAddr                  string            `validate:\"ip_addr\"`\n\t\tIPAddrv4                string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6                string            `validate:\"ip6_addr\"`\n\t\tUinxAddr                string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC                     string            `validate:\"mac\"`\n\t\tIsColor                 string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen            *string           `validate:\"min=10\"`\n\t\tStrPtrMinLenSecond      *string           `validate:\"min=2\"`\n\t\tStrPtrMaxLen            *string           `validate:\"max=1\"`\n\t\tStrPtrLen               *string           `validate:\"len=2\"`\n\t\tStrPtrLenSecond         *string           `validate:\"len=7\"`\n\t\tStrPtrLt                *string           `validate:\"lt=1\"`\n\t\tStrPtrLte               *string           `validate:\"lte=1\"`\n\t\tStrPtrLteMultiple       *string           `validate:\"lte=2\"`\n\t\tStrPtrLteMultipleSecond *string           `validate:\"lte=7\"`\n\t\tStrPtrGt                *string           `validate:\"gt=10\"`\n\t\tStrPtrGte               *string           `validate:\"gte=10\"`\n\t\tStrPtrGtSecond          *string           `validate:\"gt=2\"`\n\t\tStrPtrGteSecond         *string           `validate:\"gte=2\"`\n\t\tOneOfString             string            `validate:\"oneof=red green\"`\n\t\tOneOfInt                int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice             []string          `validate:\"unique\"`\n\t\tUniqueArray             [3]string         `validate:\"unique\"`\n\t\tUniqueMap               map[string]string `validate:\"unique\"`\n\t\tImage                   string            `validate:\"image\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxStringSecond = \"12345678\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\ttest.MaxMultipleSecond = make([]string, 3)\n\n\ttest.LtString = \"1234\"\n\ttest.LtStringSecond = \"12345678\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtMultipleSecond = make([]string, 8)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteStringSecond = \"12345678\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteMultipleSecond = make([]string, 8)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor должен быть цветом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC должен содержать MAC адрес\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr должен быть распознаваемым IP адресом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 должен быть распознаваемым IPv4 адресом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 должен быть распознаваемым IPv6 адресом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr должен быть UDP адресом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 должен быть IPv4 UDP адресом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 должен быть IPv6 UDP адресом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr должен быть TCP адресом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 должен быть IPv4 TCP адресом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 должен быть IPv6 TCP адресом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR должен содержать CIDR обозначения\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 должен содержать CIDR обозначения для IPv4 адреса\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 должен содержать CIDR обозначения для IPv6 адреса\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN должен быть SSN номером\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP должен быть IP адресом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 должен быть IPv4 адресом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 должен быть IPv6 адресом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI должен содержать Data URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude должен содержать координаты широты\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude должен содержать координаты долготы\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte должен содержать мультибайтные символы\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII должен содержать только ascii символы\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII должен содержать только доступные для печати ascii символы\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID должен быть UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 должен быть UUID 3 версии\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 должен быть UUID 4 версии\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 должен быть UUID 5 версии\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID должен быть ULID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN должен быть ISBN номером\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 должен быть ISBN-10 номером\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 должен быть ISBN-13 номером\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN должен быть ISSN номером\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes не должен содержать текст 'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll не должен содержать символы '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune не должен содержать '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny должен содержать минимум один из символов '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains должен содержать текст 'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 должен быть Base64 строкой\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email должен быть email адресом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL должен быть URL\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI должен быть URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString должен быть RGB цветом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString должен быть RGBA цветом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString должен быть HSL цветом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString должен быть HSLA цветом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString должен быть шестнадцатеричной строкой\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString должен быть HEX цветом\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString должен быть цифрой\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString должен быть цифровым значением\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString должен содержать только буквы и цифры\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString должен содержать только буквы\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString должен быть менее MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString должен быть менее или равен MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString должен быть больше MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString должен быть больше или равен MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString не должен быть равен EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString должен быть менее Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString должен быть менее или равен Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString должен быть больше Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString должен быть больше или равен Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString не должен быть равен Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString должен быть равен Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString должен быть равен MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString должен содержать минимум 3 символа\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteStringSecond\",\n\t\t\texpected: \"GteStringSecond должен содержать минимум 7 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber должен быть больше или равно 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple должен содержать минимум 2 элемента\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultipleSecond\",\n\t\t\texpected: \"GteMultipleSecond должен содержать минимум 7 элементов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime должна быть позже или равна текущему моменту\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString должен быть длиннее 3 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtStringSecond\",\n\t\t\texpected: \"GtStringSecond должен быть длиннее 7 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber должен быть больше 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple должен содержать более 2 элементов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultipleSecond\",\n\t\t\texpected: \"GtMultipleSecond должен содержать более 7 элементов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime должна быть позже текущего момента\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString должен содержать максимум 3 символа\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteStringSecond\",\n\t\t\texpected: \"LteStringSecond должен содержать максимум 7 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber должен быть менее или равен 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple должен содержать максимум 2 элемента\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultipleSecond\",\n\t\t\texpected: \"LteMultipleSecond должен содержать максимум 7 элементов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime must be less than or equal to the current Date & Time\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString должен иметь менее 3 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtStringSecond\",\n\t\t\texpected: \"LtStringSecond должен иметь менее 7 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber должен быть менее 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple должен содержать менее 2 элементов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultipleSecond\",\n\t\t\texpected: \"LtMultipleSecond должен содержать менее 7 элементов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime must be less than the current Date & Time\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString должен быть не равен \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber должен быть не равен 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple должен быть не равен 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString не равен 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber не равен 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple не равен 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString должен содержать максимум 3 символа\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxStringSecond\",\n\t\t\texpected: \"MaxStringSecond должен содержать максимум 7 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber должен быть меньше или равно 1 113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple должен содержать максимум 7 элементов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultipleSecond\",\n\t\t\texpected: \"MaxMultipleSecond должен содержать максимум 2 элемента\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString должен содержать минимум 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinStringMultiple\",\n\t\t\texpected: \"MinStringMultiple должен содержать минимум 2 символа\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinStringMultipleSecond\",\n\t\t\texpected: \"MinStringMultipleSecond должен содержать минимум 7 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber должен быть больше или равно 1 113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple должен содержать минимум 7 элементов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultipleSecond\",\n\t\t\texpected: \"MinMultipleSecond должен содержать минимум 2 элемента\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString должен быть длиной в 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber должен быть равен 1 113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple должен содержать 7 элементов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultipleSecond\",\n\t\t\texpected: \"LenMultipleSecond должен содержать 2 элемента\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString обязательное поле\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber обязательное поле\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple обязательное поле\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen должен содержать минимум 10 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLenSecond\",\n\t\t\texpected: \"StrPtrMinLenSecond должен содержать минимум 2 символа\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen должен содержать максимум 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen должен быть длиной в 2 символа\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLenSecond\",\n\t\t\texpected: \"StrPtrLenSecond должен быть длиной в 7 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt должен иметь менее 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte должен содержать максимум 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLteMultiple\",\n\t\t\texpected: \"StrPtrLteMultiple должен содержать максимум 2 символа\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLteMultipleSecond\",\n\t\t\texpected: \"StrPtrLteMultipleSecond должен содержать максимум 7 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt должен быть длиннее 10 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGtSecond\",\n\t\t\texpected: \"StrPtrGtSecond должен быть длиннее 2 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte должен содержать минимум 10 символов\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGteSecond\",\n\t\t\texpected: \"StrPtrGteSecond должен содержать минимум 2 символа\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString должен быть одним из [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt должен быть одним из [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice должен содержать уникальные значения\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray должен содержать уникальные значения\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap должен содержать уникальные значения\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image должно быть допустимым изображением\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tlog.Println(fe)\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/th/th.go",
    "content": "package th\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"โปรดระบุ {0}\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_if\",\n\t\t\ttranslation: \"โปรดระบุ {0}\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} ต้องมีความยาว {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} ตัวอักษร\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} ต้องเท่ากับ {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} ต้องประกอบไปด้วย {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} รายการ\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} ต้องมีความยาวอย่างน้อย {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} ตัวอักษร\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} ต้องมีค่ามากกว่า {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} ต้องมีอย่างน้อย {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} รายการ\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} ต้องมีความยาวไม่เกิน {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} ตัวอักษร\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} ต้องมีค่าน้อยกว่าหรือเท่ากับ {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} ต้องมีไม่เกิน {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} รายการ\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0} ไม่เท่ากับ {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0} ต้องไม่เท่ากับ {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} ต้องมีความยาวน้อยกว่า {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} ตัวอักษร\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} ต้องมีค่าน้อยกว่า {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} ต้องมีน้อยกว่า {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} รายการ\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} ต้องเป็นเวลาก่อนปัจจุบัน\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} ต้องมีความยาวไม่เกิน {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} ตัวอักษร\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} ต้องมีค่าน้อยกว่าหรือเท่ากับ {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} ต้องมีไม่เกิน {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} รายการ\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} ต้องเป็นเวลาก่อนหรือเป็นเวลาปัจจุบัน\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} ต้องมีความยาวมากกว่า {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} ตัวอักษร\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} ต้องมีค่ามากกว่า {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} ต้องมีมากกว่า {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} รายการ\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} ต้องเป็นเวลาหลังจากปัจจุบัน\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} ต้องมีความยาวอย่างน้อย {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} ตัวอักษร\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} ต้องมีค่ามากกว่า {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} ต้องมีอย่างน้อย {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} รายการ\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} ต้องเป็นเวลาหลังหรือเป็นเวลาปัจจุบัน\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0} ต้องเท่ากับ {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0} ต้องเท่ากับ {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0} ต้องไม่เท่ากับ {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0} ต้องมีค่ามากกว่า {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0} ต้องมีค่ามากกว่าหรือเท่ากับ {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0} ต้องมีค่าน้อยกว่า {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0} ต้องมีค่าน้อยกว่าหรือเท่ากับ {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0} ต้องไม่เท่ากับ {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0} ต้องมีค่ามากกว่า {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0} ต้องมีค่ามากกว่าหรือเท่ากับ {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0} ต้องมีค่าน้อยกว่า {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0} ต้องมีค่าน้อยกว่าหรือเท่ากับ {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} ต้องเป็นตัวอักษรเท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} ต้องเป็นตัวอักษรหรือตัวเลขเท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} ต้องเป็นค่าตัวเลขเท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} ต้องเป็นตัวเลขเท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} ต้องเป็นค่าตัวเลขฐาน 16 เท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} ต้องเป็นเลขสีฐาน 16 เท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} ต้องเป็นเลขสี RGB เท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} ต้องเป็นเลขสี RGBA เท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} ต้องเป็นเลขสี HSL เท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} ต้องเป็นเลขสี HSLA เท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0} ต้องเป็นเบอร์โทรศัพท์รูปแบบ E.164 เท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} ต้องเป็นอีเมลเท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} ต้องเป็น URL เท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} ต้องเป็น URI เท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} ต้องเป็น Base64 เท่านั้น\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0} ต้องมี '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0} ต้องมีอย่างน้อยอักขระใน '{1}' อย่างน้อย 1 ตัว\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0} ต้องไม่มี '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0} ต้องไม่มีอักขระ '{1}' ทั้งหมด\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0} ต้องไม่มี '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} ต้องเป็นตัวเลข ISBN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} ต้องเป็นตัวเลข ISBN-10\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} ต้องเป็นตัวเลข ISBN-13\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} ต้องเป็นตัวเลข ISSN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} ต้องเป็น UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} ต้องเป็น version 3 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} ต้องเป็น version 4 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} ต้องเป็น version 5 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} must be a valid ULID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} ต้องมีแค่อักขระ ascii\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} ต้องมีแค่อักขระ ascii ที่แสดงผลได้\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} ต้องมี multibyte character\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} ต้องประกอบไปด้วย a valid Data URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} ต้องเป็นละติจูด\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} ต้องเป็นลองจิจูด\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} ต้องเป็นตัวเลข SSN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} ต้องเป็น IPv4 address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} ต้องเป็น IPv6 address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} ต้องเป็น IP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} ต้องเป็น CIDR notation\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} ต้องเป็น CIDR notation สำหรับ an IPv4 address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} ต้องเป็น CIDR notation สำหรับ an IPv6 address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} ต้องเป็น TCP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} ต้องเป็น IPv4 TCP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} ต้องเป็น IPv6 TCP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} ต้องเป็น UDP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} ต้องเป็น IPv4 UDP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} ต้องเป็น IPv6 UDP address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} ต้องเป็น IP address ที่เข้าถึงได้\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} ต้องเป็น IPv4 address ที่เข้าถึงได้\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} ต้องเป็น IPv6 address ที่เข้าถึงได้\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} ต้องเป็น UNIX address ที่เข้าถึงได้\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} ต้องเป็น MAC address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"fqdn\",\n\t\t\ttranslation: \"{0} ต้องเป็น FQDN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} ต้องมีข้อมูลไม่ซ้ำ\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} ต้องเป็นเลขสี\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cron\",\n\t\t\ttranslation: \"{0} ต้องเป็น cron expression\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0} ต้องอยู่ใน [{1}]\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0} ต้องเป็น json string\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"jwt\",\n\t\t\ttranslation: \"{0} ต้องเป็น jwt string\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0} ต้องเป็นตัวพิมพ์เล็ก\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0} ต้องเป็นตัวพิมพ์ใหญ่\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datetime\",\n\t\t\ttranslation: \"{0} ไม่ตรงกับรูปแบบ {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2\",\n\t\t\ttranslation: \"{0} does not match postcode format of {1} country\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2_field\",\n\t\t\ttranslation: \"{0} does not match postcode format of country in {1} field\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"boolean\",\n\t\t\ttranslation: \"{0} ต้องเป็น boolean\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} ต้องเป็นรูปภาพ\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cve\",\n\t\t\ttranslation: \"{0} ต้องเป็นรูปแบบ cve\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/th/th_test.go",
    "content": "package th\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tthai \"github.com/go-playground/locales/th\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tth := thai.New()\n\tuni := ut.New(th, th)\n\ttrans, _ := uni.GetTranslator(\"th\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t\tRequiredIf       string\n\t}\n\n\ttype Test struct {\n\t\tInner             Inner\n\t\tRequiredString    string            `validate:\"required\"`\n\t\tRequiredNumber    int               `validate:\"required\"`\n\t\tRequiredMultiple  []string          `validate:\"required\"`\n\t\tRequiredIf        string            `validate:\"required_if=Inner.RequiredIf abcd\"`\n\t\tLenString         string            `validate:\"len=1\"`\n\t\tLenNumber         float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple       []string          `validate:\"len=7\"`\n\t\tMinString         string            `validate:\"min=1\"`\n\t\tMinNumber         float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple       []string          `validate:\"min=7\"`\n\t\tMaxString         string            `validate:\"max=3\"`\n\t\tMaxNumber         float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple       []string          `validate:\"max=7\"`\n\t\tEqString          string            `validate:\"eq=3\"`\n\t\tEqNumber          float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple        []string          `validate:\"eq=7\"`\n\t\tNeString          string            `validate:\"ne=\"`\n\t\tNeNumber          float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple        []string          `validate:\"ne=0\"`\n\t\tLtString          string            `validate:\"lt=3\"`\n\t\tLtNumber          float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple        []string          `validate:\"lt=2\"`\n\t\tLtTime            time.Time         `validate:\"lt\"`\n\t\tLteString         string            `validate:\"lte=3\"`\n\t\tLteNumber         float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple       []string          `validate:\"lte=2\"`\n\t\tLteTime           time.Time         `validate:\"lte\"`\n\t\tGtString          string            `validate:\"gt=3\"`\n\t\tGtNumber          float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple        []string          `validate:\"gt=2\"`\n\t\tGtTime            time.Time         `validate:\"gt\"`\n\t\tGteString         string            `validate:\"gte=3\"`\n\t\tGteNumber         float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple       []string          `validate:\"gte=2\"`\n\t\tGteTime           time.Time         `validate:\"gte\"`\n\t\tEqFieldString     string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString   string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString   string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString   string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString  string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString   string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString  string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString     string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString     string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString    string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString     string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString    string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString       string            `validate:\"alpha\"`\n\t\tAlphanumString    string            `validate:\"alphanum\"`\n\t\tNumericString     string            `validate:\"numeric\"`\n\t\tNumberString      string            `validate:\"number\"`\n\t\tHexadecimalString string            `validate:\"hexadecimal\"`\n\t\tHexColorString    string            `validate:\"hexcolor\"`\n\t\tRGBColorString    string            `validate:\"rgb\"`\n\t\tRGBAColorString   string            `validate:\"rgba\"`\n\t\tHSLColorString    string            `validate:\"hsl\"`\n\t\tHSLAColorString   string            `validate:\"hsla\"`\n\t\tEmail             string            `validate:\"email\"`\n\t\tURL               string            `validate:\"url\"`\n\t\tURI               string            `validate:\"uri\"`\n\t\tBase64            string            `validate:\"base64\"`\n\t\tContains          string            `validate:\"contains=purpose\"`\n\t\tContainsAny       string            `validate:\"containsany=!@#$\"`\n\t\tExcludes          string            `validate:\"excludes=text\"`\n\t\tExcludesAll       string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune      string            `validate:\"excludesrune=☻\"`\n\t\tISBN              string            `validate:\"isbn\"`\n\t\tISBN10            string            `validate:\"isbn10\"`\n\t\tISBN13            string            `validate:\"isbn13\"`\n\t\tISSN              string            `validate:\"issn\"`\n\t\tUUID              string            `validate:\"uuid\"`\n\t\tUUID3             string            `validate:\"uuid3\"`\n\t\tUUID4             string            `validate:\"uuid4\"`\n\t\tUUID5             string            `validate:\"uuid5\"`\n\t\tULID              string            `validate:\"ulid\"`\n\t\tASCII             string            `validate:\"ascii\"`\n\t\tPrintableASCII    string            `validate:\"printascii\"`\n\t\tMultiByte         string            `validate:\"multibyte\"`\n\t\tDataURI           string            `validate:\"datauri\"`\n\t\tLatitude          string            `validate:\"latitude\"`\n\t\tLongitude         string            `validate:\"longitude\"`\n\t\tSSN               string            `validate:\"ssn\"`\n\t\tIP                string            `validate:\"ip\"`\n\t\tIPv4              string            `validate:\"ipv4\"`\n\t\tIPv6              string            `validate:\"ipv6\"`\n\t\tCIDR              string            `validate:\"cidr\"`\n\t\tCIDRv4            string            `validate:\"cidrv4\"`\n\t\tCIDRv6            string            `validate:\"cidrv6\"`\n\t\tTCPAddr           string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4         string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6         string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr           string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4         string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6         string            `validate:\"udp6_addr\"`\n\t\tIPAddr            string            `validate:\"ip_addr\"`\n\t\tIPAddrv4          string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6          string            `validate:\"ip6_addr\"`\n\t\tUinxAddr          string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC               string            `validate:\"mac\"`\n\t\tFQDN              string            `validate:\"fqdn\"`\n\t\tIsColor           string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen      *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen      *string           `validate:\"max=1\"`\n\t\tStrPtrLen         *string           `validate:\"len=2\"`\n\t\tStrPtrLt          *string           `validate:\"lt=1\"`\n\t\tStrPtrLte         *string           `validate:\"lte=1\"`\n\t\tStrPtrGt          *string           `validate:\"gt=10\"`\n\t\tStrPtrGte         *string           `validate:\"gte=10\"`\n\t\tOneOfString       string            `validate:\"oneof=red green\"`\n\t\tOneOfInt          int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice       []string          `validate:\"unique\"`\n\t\tUniqueArray       [3]string         `validate:\"unique\"`\n\t\tUniqueMap         map[string]string `validate:\"unique\"`\n\t\tJSONString        string            `validate:\"json\"`\n\t\tJWTString         string            `validate:\"jwt\"`\n\t\tLowercaseString   string            `validate:\"lowercase\"`\n\t\tUppercaseString   string            `validate:\"uppercase\"`\n\t\tDatetime          string            `validate:\"datetime=2006-01-02\"`\n\t\tPostCode          string            `validate:\"postcode_iso3166_alpha2=SG\"`\n\t\tPostCodeCountry   string\n\t\tPostCodeByField   string `validate:\"postcode_iso3166_alpha2_field=PostCodeCountry\"`\n\t\tBooleanString     string `validate:\"boolean\"`\n\t\tImage             string `validate:\"image\"`\n\t\tCveString         string `validate:\"cve\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\ttest.Datetime = \"2008-Feb-01\"\n\ttest.BooleanString = \"A\"\n\ttest.CveString = \"A\"\n\n\ttest.Inner.RequiredIf = \"abcd\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor ต้องเป็นเลขสี\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC ต้องเป็น MAC address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.FQDN\",\n\t\t\texpected: \"FQDN ต้องเป็น FQDN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr ต้องเป็น IP address ที่เข้าถึงได้\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 ต้องเป็น IPv4 address ที่เข้าถึงได้\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 ต้องเป็น IPv6 address ที่เข้าถึงได้\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr ต้องเป็น UDP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 ต้องเป็น IPv4 UDP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 ต้องเป็น IPv6 UDP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr ต้องเป็น TCP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 ต้องเป็น IPv4 TCP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 ต้องเป็น IPv6 TCP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR ต้องเป็น CIDR notation\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 ต้องเป็น CIDR notation สำหรับ an IPv4 address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 ต้องเป็น CIDR notation สำหรับ an IPv6 address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN ต้องเป็นตัวเลข SSN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP ต้องเป็น IP address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 ต้องเป็น IPv4 address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 ต้องเป็น IPv6 address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI ต้องประกอบไปด้วย a valid Data URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude ต้องเป็นละติจูด\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude ต้องเป็นลองจิจูด\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID ต้องเป็น UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 ต้องเป็น version 3 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 ต้องเป็น version 4 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 ต้องเป็น version 5 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID must be a valid ULID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN ต้องเป็นตัวเลข ISBN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 ต้องเป็นตัวเลข ISBN-10\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 ต้องเป็นตัวเลข ISBN-13\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN ต้องเป็นตัวเลข ISSN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes ต้องไม่มี 'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll ต้องไม่มีอักขระ '!@#$' ทั้งหมด\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune ต้องไม่มี '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains ต้องมี 'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 ต้องเป็น Base64 เท่านั้น\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email ต้องเป็นอีเมลเท่านั้น\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL ต้องเป็น URL เท่านั้น\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI ต้องเป็น URI เท่านั้น\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString ต้องเป็นเลขสี RGB เท่านั้น\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString ต้องเป็นเลขสี RGBA เท่านั้น\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString ต้องเป็นเลขสี HSL เท่านั้น\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString ต้องเป็นเลขสี HSLA เท่านั้น\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString ต้องเป็นค่าตัวเลขฐาน 16 เท่านั้น\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString ต้องเป็นเลขสีฐาน 16 เท่านั้น\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString ต้องเป็นตัวเลขเท่านั้น\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString ต้องเป็นค่าตัวเลขเท่านั้น\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString ต้องมีค่าน้อยกว่า MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString ต้องมีค่าน้อยกว่าหรือเท่ากับ MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString ต้องมีค่ามากกว่า MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString ต้องมีค่ามากกว่าหรือเท่ากับ MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString ต้องไม่เท่ากับ EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString ต้องมีค่าน้อยกว่า Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString ต้องมีค่าน้อยกว่าหรือเท่ากับ Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString ต้องมีค่ามากกว่า Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString ต้องมีค่ามากกว่าหรือเท่ากับ Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString ต้องไม่เท่ากับ Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString ต้องเท่ากับ Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString ต้องเท่ากับ MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber ต้องมีค่ามากกว่า 5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple ต้องมีอย่างน้อย 2 รายการ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime ต้องเป็นเวลาหลังหรือเป็นเวลาปัจจุบัน\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber ต้องมีค่ามากกว่า 5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple ต้องมีมากกว่า 2 รายการ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime ต้องเป็นเวลาหลังจากปัจจุบัน\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber ต้องมีค่าน้อยกว่าหรือเท่ากับ 5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple ต้องมีไม่เกิน 2 รายการ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime ต้องเป็นเวลาก่อนหรือเป็นเวลาปัจจุบัน\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber ต้องมีค่าน้อยกว่า 5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple ต้องมีน้อยกว่า 2 รายการ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime ต้องเป็นเวลาก่อนปัจจุบัน\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString ต้องไม่เท่ากับ \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber ต้องไม่เท่ากับ 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple ต้องไม่เท่ากับ 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString ไม่เท่ากับ 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber ไม่เท่ากับ 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple ไม่เท่ากับ 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber ต้องมีค่าน้อยกว่าหรือเท่ากับ 1,113.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple ต้องมีไม่เกิน 7 รายการ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString ต้องมีความยาวอย่างน้อย 1 ตัวอักษร\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber ต้องมีค่ามากกว่า 1,113.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple ต้องมีอย่างน้อย 7 รายการ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString ต้องมีความยาว 1 ตัวอักษร\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber ต้องเท่ากับ 1,113.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple ต้องประกอบไปด้วย 7 รายการ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"โปรดระบุ RequiredString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredIf\",\n\t\t\texpected: \"โปรดระบุ RequiredIf\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"โปรดระบุ RequiredNumber\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"โปรดระบุ RequiredMultiple\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen ต้องมีความยาวไม่เกิน 1 ตัวอักษร\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt ต้องมีความยาวน้อยกว่า 1 ตัวอักษร\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte ต้องมีความยาวไม่เกิน 1 ตัวอักษร\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString ต้องอยู่ใน [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt ต้องอยู่ใน [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice ต้องมีข้อมูลไม่ซ้ำ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray ต้องมีข้อมูลไม่ซ้ำ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap ต้องมีข้อมูลไม่ซ้ำ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JSONString\",\n\t\t\texpected: \"JSONString ต้องเป็น json string\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JWTString\",\n\t\t\texpected: \"JWTString ต้องเป็น jwt string\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"LowercaseString ต้องเป็นตัวพิมพ์เล็ก\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"UppercaseString ต้องเป็นตัวพิมพ์ใหญ่\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"Datetime ไม่ตรงกับรูปแบบ 2006-01-02\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCode\",\n\t\t\texpected: \"PostCode does not match postcode format of SG country\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCodeByField\",\n\t\t\texpected: \"PostCodeByField does not match postcode format of country in PostCodeCountry field\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.BooleanString\",\n\t\t\texpected: \"BooleanString ต้องเป็น boolean\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image ต้องเป็นรูปภาพ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CveString\",\n\t\t\texpected: \"CveString ต้องเป็นรูปแบบ cve\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen ต้องมีความยาวอย่างน้อย 10 ตัวอักษร\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen ต้องมีความยาวไม่เกิน 1 ตัวอักษร\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen ต้องมีความยาว 2 ตัวอักษร\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt ต้องมีความยาวน้อยกว่า 1 ตัวอักษร\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte ต้องมีความยาวไม่เกิน 1 ตัวอักษร\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt ต้องมีความยาวมากกว่า 10 ตัวอักษร\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte ต้องมีความยาวอย่างน้อย 10 ตัวอักษร\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/tr/tr.go",
    "content": "package tr\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} zorunlu bir alandır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} uzunluğu {1} olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0}, {1} değerine eşit olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0}, {1} içermelidir\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} öğe\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} öğe\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} en az {1} uzunluğunda olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0}, {1} veya daha büyük olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} en az {1} içermelidir\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} öğe\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} öğe\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} uzunluğu en fazla {1} olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0}, {1} veya daha az olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} maksimum {1} içermelidir\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} öğe\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} öğe\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0}, {1} değerine eşit değil\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0}, {1} değerine eşit olmamalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0}, {1} uzunluğundan daha az olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0}, {1} değerinden küçük olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0}, {1}den daha az içermelidir\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} öğe\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} öğe\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} geçerli Tarih ve Saatten daha az olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} en fazla {1} uzunluğunda olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0}, {1} veya daha az olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0}, maksimum {1} içermelidir\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} öğe\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} öğe\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} geçerli Tarih ve Saate eşit veya daha küçük olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0}, {1} uzunluğundan fazla olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0}, {1} değerinden büyük olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0}, {1}den daha fazla içermelidir\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} öğe\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} öğe\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} geçerli Tarih ve Saatten büyük olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} en az {1} uzunluğunda olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} karakter\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} karakter\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0}, {1} veya daha büyük olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} en az {1} içermelidir\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} öğe\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} öğe\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} geçerli Tarih ve Saatten büyük veya ona eşit olmalıdır\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0}, {1} değerine eşit olmalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0}, {1} değerine eşit olmalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0}, {1} değerine eşit olmamalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0}, {1} değerinden büyük olmalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0}, {1} değerinden küçük veya ona eşit olmalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0}, {1} değerinden küçük olmalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0}, {1} değerinden küçük veya ona eşit olmalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0}, {1} değerine eşit olmamalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0}, {1} değerinden büyük olmalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0}, {1} değerinden büyük veya ona eşit olmalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0}, {1} değerinden küçük olmalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0}, {1} değerinden küçük veya ona eşit olmalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} yalnızca alfabetik karakterler içerebilir\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} yalnızca alfanümerik karakterler içerebilir\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} geçerli bir sayısal değer olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} geçerli bir sayı olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} geçerli bir onaltılık olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} geçerli bir HEX rengi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} geçerli bir RGB rengi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} geçerli bir RGBA rengi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} geçerli bir HSL rengi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} geçerli bir HSLA rengi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} geçerli bir e-posta adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} geçerli bir URL olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} geçerli bir URI olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} geçerli bir Base64 karakter dizesi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0}, '{1}' metnini içermelidir\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0}, '{1}' karakterlerinden en az birini içermelidir\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0}, '{1}' metnini içeremez\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0}, '{1}' karakterlerinden hiçbirini içeremez\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0}, '{1}' ifadesini içeremez\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} geçerli bir ISBN numarası olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} geçerli bir ISBN-10 numarası olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} geçerli bir ISBN-13 numarası olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} geçerli bir ISSN numarası olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} geçerli bir UUID olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} geçerli bir sürüm 3 UUID olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} geçerli bir sürüm 4 UUID olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} geçerli bir sürüm 5 UUID olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} geçerli bir ULID olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} yalnızca ascii karakterler içermelidir\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} yalnızca yazdırılabilir ascii karakterleri içermelidir\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} çok baytlı karakterler içermelidir\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} geçerli bir Veri URI içermelidir\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} geçerli bir enlem koordinatı içermelidir\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} geçerli bir boylam koordinatı içermelidir\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} geçerli bir SSN numarası olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} geçerli bir IPv4 adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} geçerli bir IPv6 adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} geçerli bir IP adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} geçerli bir CIDR gösterimi içermelidir\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} bir IPv4 adresi için geçerli bir CIDR gösterimi içermelidir\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} bir IPv6 adresi için geçerli bir CIDR gösterimi içermelidir\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} geçerli bir TCP adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} geçerli bir IPv4 TCP adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} geçerli bir IPv6 TCP adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} geçerli bir UDP adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} geçerli bir IPv4 UDP adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} geçerli bir IPv6 UDP adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} çözülebilir bir IP adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} çözülebilir bir IPv4 adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} çözülebilir bir IPv6 adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} çözülebilir bir UNIX adresi olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} geçerli bir MAC adresi içermelidir\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} benzersiz değerler içermelidir\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} geçerli bir renk olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0}, [{1}]'dan biri olmalıdır\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} geçerli bir resim olmalıdır\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/tr/tr_test.go",
    "content": "package tr\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tturkish \"github.com/go-playground/locales/tr\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\ttr := turkish.New()\n\tuni := ut.New(tr, tr)\n\ttrans, _ := uni.GetTranslator(\"tr\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t}\n\n\ttype Test struct {\n\t\tInner             Inner\n\t\tRequiredString    string            `validate:\"required\"`\n\t\tRequiredNumber    int               `validate:\"required\"`\n\t\tRequiredMultiple  []string          `validate:\"required\"`\n\t\tLenString         string            `validate:\"len=1\"`\n\t\tLenNumber         float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple       []string          `validate:\"len=7\"`\n\t\tMinString         string            `validate:\"min=1\"`\n\t\tMinNumber         float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple       []string          `validate:\"min=7\"`\n\t\tMaxString         string            `validate:\"max=3\"`\n\t\tMaxNumber         float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple       []string          `validate:\"max=7\"`\n\t\tEqString          string            `validate:\"eq=3\"`\n\t\tEqNumber          float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple        []string          `validate:\"eq=7\"`\n\t\tNeString          string            `validate:\"ne=\"`\n\t\tNeNumber          float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple        []string          `validate:\"ne=0\"`\n\t\tLtString          string            `validate:\"lt=3\"`\n\t\tLtNumber          float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple        []string          `validate:\"lt=2\"`\n\t\tLtTime            time.Time         `validate:\"lt\"`\n\t\tLteString         string            `validate:\"lte=3\"`\n\t\tLteNumber         float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple       []string          `validate:\"lte=2\"`\n\t\tLteTime           time.Time         `validate:\"lte\"`\n\t\tGtString          string            `validate:\"gt=3\"`\n\t\tGtNumber          float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple        []string          `validate:\"gt=2\"`\n\t\tGtTime            time.Time         `validate:\"gt\"`\n\t\tGteString         string            `validate:\"gte=3\"`\n\t\tGteNumber         float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple       []string          `validate:\"gte=2\"`\n\t\tGteTime           time.Time         `validate:\"gte\"`\n\t\tEqFieldString     string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString   string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString   string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString   string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString  string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString   string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString  string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString     string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString     string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString    string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString     string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString    string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString       string            `validate:\"alpha\"`\n\t\tAlphanumString    string            `validate:\"alphanum\"`\n\t\tNumericString     string            `validate:\"numeric\"`\n\t\tNumberString      string            `validate:\"number\"`\n\t\tHexadecimalString string            `validate:\"hexadecimal\"`\n\t\tHexColorString    string            `validate:\"hexcolor\"`\n\t\tRGBColorString    string            `validate:\"rgb\"`\n\t\tRGBAColorString   string            `validate:\"rgba\"`\n\t\tHSLColorString    string            `validate:\"hsl\"`\n\t\tHSLAColorString   string            `validate:\"hsla\"`\n\t\tEmail             string            `validate:\"email\"`\n\t\tURL               string            `validate:\"url\"`\n\t\tURI               string            `validate:\"uri\"`\n\t\tBase64            string            `validate:\"base64\"`\n\t\tContains          string            `validate:\"contains=purpose\"`\n\t\tContainsAny       string            `validate:\"containsany=!@#$\"`\n\t\tExcludes          string            `validate:\"excludes=text\"`\n\t\tExcludesAll       string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune      string            `validate:\"excludesrune=☻\"`\n\t\tISBN              string            `validate:\"isbn\"`\n\t\tISBN10            string            `validate:\"isbn10\"`\n\t\tISBN13            string            `validate:\"isbn13\"`\n\t\tISSN              string            `validate:\"issn\"`\n\t\tUUID              string            `validate:\"uuid\"`\n\t\tUUID3             string            `validate:\"uuid3\"`\n\t\tUUID4             string            `validate:\"uuid4\"`\n\t\tUUID5             string            `validate:\"uuid5\"`\n\t\tULID              string            `validate:\"ulid\"`\n\t\tASCII             string            `validate:\"ascii\"`\n\t\tPrintableASCII    string            `validate:\"printascii\"`\n\t\tMultiByte         string            `validate:\"multibyte\"`\n\t\tDataURI           string            `validate:\"datauri\"`\n\t\tLatitude          string            `validate:\"latitude\"`\n\t\tLongitude         string            `validate:\"longitude\"`\n\t\tSSN               string            `validate:\"ssn\"`\n\t\tIP                string            `validate:\"ip\"`\n\t\tIPv4              string            `validate:\"ipv4\"`\n\t\tIPv6              string            `validate:\"ipv6\"`\n\t\tCIDR              string            `validate:\"cidr\"`\n\t\tCIDRv4            string            `validate:\"cidrv4\"`\n\t\tCIDRv6            string            `validate:\"cidrv6\"`\n\t\tTCPAddr           string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4         string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6         string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr           string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4         string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6         string            `validate:\"udp6_addr\"`\n\t\tIPAddr            string            `validate:\"ip_addr\"`\n\t\tIPAddrv4          string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6          string            `validate:\"ip6_addr\"`\n\t\tUinxAddr          string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC               string            `validate:\"mac\"`\n\t\tIsColor           string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen      *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen      *string           `validate:\"max=1\"`\n\t\tStrPtrLen         *string           `validate:\"len=2\"`\n\t\tStrPtrLt          *string           `validate:\"lt=1\"`\n\t\tStrPtrLte         *string           `validate:\"lte=1\"`\n\t\tStrPtrGt          *string           `validate:\"gt=10\"`\n\t\tStrPtrGte         *string           `validate:\"gte=10\"`\n\t\tOneOfString       string            `validate:\"oneof=red green\"`\n\t\tOneOfInt          int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice       []string          `validate:\"unique\"`\n\t\tUniqueArray       [3]string         `validate:\"unique\"`\n\t\tUniqueMap         map[string]string `validate:\"unique\"`\n\t\tImage             string            `validate:\"image\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor geçerli bir renk olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC geçerli bir MAC adresi içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr çözülebilir bir IP adresi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 çözülebilir bir IPv4 adresi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 çözülebilir bir IPv6 adresi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr geçerli bir UDP adresi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 geçerli bir IPv4 UDP adresi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 geçerli bir IPv6 UDP adresi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr geçerli bir TCP adresi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 geçerli bir IPv4 TCP adresi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 geçerli bir IPv6 TCP adresi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR geçerli bir CIDR gösterimi içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 bir IPv4 adresi için geçerli bir CIDR gösterimi içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 bir IPv6 adresi için geçerli bir CIDR gösterimi içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN geçerli bir SSN numarası olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP geçerli bir IP adresi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 geçerli bir IPv4 adresi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 geçerli bir IPv6 adresi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI geçerli bir Veri URI içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude geçerli bir enlem koordinatı içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude geçerli bir boylam koordinatı içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte çok baytlı karakterler içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII yalnızca ascii karakterler içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII yalnızca yazdırılabilir ascii karakterleri içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID geçerli bir UUID olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 geçerli bir sürüm 3 UUID olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 geçerli bir sürüm 4 UUID olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 geçerli bir sürüm 5 UUID olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID geçerli bir ULID olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN geçerli bir ISBN numarası olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 geçerli bir ISBN-10 numarası olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 geçerli bir ISBN-13 numarası olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN geçerli bir ISSN numarası olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes, 'text' metnini içeremez\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll, '!@#$' karakterlerinden hiçbirini içeremez\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune, '☻' ifadesini içeremez\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny, '!@#$' karakterlerinden en az birini içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains, 'purpose' metnini içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 geçerli bir Base64 karakter dizesi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email geçerli bir e-posta adresi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL geçerli bir URL olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI geçerli bir URI olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString geçerli bir RGB rengi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString geçerli bir RGBA rengi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString geçerli bir HSL rengi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString geçerli bir HSLA rengi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString geçerli bir onaltılık olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString geçerli bir HEX rengi olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString geçerli bir sayı olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString geçerli bir sayısal değer olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString yalnızca alfanümerik karakterler içerebilir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString yalnızca alfabetik karakterler içerebilir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString, MaxString değerinden küçük olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString, MaxString değerinden küçük veya ona eşit olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString, MaxString değerinden büyük olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString, MaxString değerinden büyük veya ona eşit olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString, EqFieldString değerine eşit olmamalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString, Inner.LtCSFieldString değerinden küçük olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString, Inner.LteCSFieldString değerinden küçük veya ona eşit olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString, Inner.GtCSFieldString değerinden büyük olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString, Inner.GteCSFieldString değerinden küçük veya ona eşit olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString, Inner.NeCSFieldString değerine eşit olmamalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString, Inner.EqCSFieldString değerine eşit olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString, MaxString değerine eşit olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString en az 3 karakter uzunluğunda olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber, 5,56 veya daha büyük olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple en az 2 öğe içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime geçerli Tarih ve Saatten büyük veya ona eşit olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString, 3 karakter uzunluğundan fazla olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber, 5,56 değerinden büyük olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple, 2 öğeden daha fazla içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime geçerli Tarih ve Saatten büyük olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString en fazla 3 karakter uzunluğunda olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber, 5,56 veya daha az olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple, maksimum 2 öğe içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime geçerli Tarih ve Saate eşit veya daha küçük olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString, 3 karakter uzunluğundan daha az olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber, 5,56 değerinden küçük olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple, 2 öğeden daha az içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime geçerli Tarih ve Saatten daha az olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString,  değerine eşit olmamalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber, 0.00 değerine eşit olmamalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple, 0 değerine eşit olmamalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString, 3 değerine eşit değil\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber, 2.33 değerine eşit değil\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple, 7 değerine eşit değil\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString uzunluğu en fazla 3 karakter olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber, 1.113,00 veya daha az olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple maksimum 7 öğe içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString en az 1 karakter uzunluğunda olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber, 1.113,00 veya daha büyük olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple en az 7 öğe içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString uzunluğu 1 karakter olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber, 1.113,00 değerine eşit olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple, 7 öğe içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString zorunlu bir alandır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber zorunlu bir alandır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple zorunlu bir alandır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen en az 10 karakter uzunluğunda olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen uzunluğu en fazla 1 karakter olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen uzunluğu 2 karakter olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt, 1 karakter uzunluğundan daha az olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte en fazla 1 karakter uzunluğunda olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt, 10 karakter uzunluğundan fazla olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte en az 10 karakter uzunluğunda olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString, [red green]'dan biri olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt, [5 63]'dan biri olmalıdır\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice benzersiz değerler içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray benzersiz değerler içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap benzersiz değerler içermelidir\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image geçerli bir resim olmalıdır\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/uk/uk.go",
    "content": "package uk\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} обов'язкове поле\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_if\",\n\t\t\ttranslation: \"{0} обов'язкове поле\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_unless\",\n\t\t\ttranslation: \"{0} обов'язкове поле\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with\",\n\t\t\ttranslation: \"{0} обов'язкове поле\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with_all\",\n\t\t\ttranslation: \"{0} обов'язкове поле\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without\",\n\t\t\ttranslation: \"{0} обов'язкове поле\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without_all\",\n\t\t\ttranslation: \"{0} обов'язкове поле\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_if\",\n\t\t\ttranslation: \"{0} є виключеним полем\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_unless\",\n\t\t\ttranslation: \"{0} є виключеним полем\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with\",\n\t\t\ttranslation: \"{0} є виключеним полем\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with_all\",\n\t\t\ttranslation: \"{0} є виключеним полем\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without\",\n\t\t\ttranslation: \"{0} є виключеним полем\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without_all\",\n\t\t\ttranslation: \"{0} є виключеним полем\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isdefault\",\n\t\t\ttranslation: \"{0} має бути значенням за замовчуванням\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} має бути довжиною в {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} має дорівнювати {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} має містити {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"len\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} має містити щонайменше {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} має бути більше чи дорівнювати {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} має містити щонайменше {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"min\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} має містити максимум {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} має бути менше чи дорівнювати {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} має містити максимум {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"max\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:             \"eq\",\n\t\t\ttranslation:     \"{0} не дорівнює {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ne\",\n\t\t\ttranslation:     \"{0} має не дорівнювати {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} має мати менше за {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} має бути менше {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} має містити менше ніж {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} має бути менше поточної дати й часу\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"lt\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} має містити максимум {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} має бути менше чи дорівнювати {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} має містити максимум {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} має бути менше чи дорівнювати поточній даті та часу\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"lte\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} має бути довше за {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} має бути більше {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} має містити більше ніж {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} має бути пізніше поточного моменту\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"gt\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} має містити щонайменше {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} має бути більше чи дорівнювати {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} має містити щонайменше {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} має бути пізніше чи дорівнювати теперішньому моменту\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = registerCardinals(ut, \"gte\"); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' cannot be used on a struct type\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:             \"eqfield\",\n\t\t\ttranslation:     \"{0} має дорівнювати {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"eqcsfield\",\n\t\t\ttranslation:     \"{0} має дорівнювати {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"necsfield\",\n\t\t\ttranslation:     \"{0} не має дорівнювати {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtcsfield\",\n\t\t\ttranslation:     \"{0} має бути більше {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtecsfield\",\n\t\t\ttranslation:     \"{0} має бути більше чи дорівнювати {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltcsfield\",\n\t\t\ttranslation:     \"{0} має бути менше {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltecsfield\",\n\t\t\ttranslation:     \"{0} має бути менше чи дорівнювати {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"nefield\",\n\t\t\ttranslation:     \"{0} не має дорівнювати {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtfield\",\n\t\t\ttranslation:     \"{0} має бути більше {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"gtefield\",\n\t\t\ttranslation:     \"{0} має бути більше чи дорівнювати {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltfield\",\n\t\t\ttranslation:     \"{0} має бути менше {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"ltefield\",\n\t\t\ttranslation:     \"{0} має бути менше чи дорівнювати {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} має містити тільки літери\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} має містити тільки літери та цифри\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} має бути цифровим значенням\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} має бути цифрою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} має бути шістнадцятковим рядком\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} має бути HEX кольором\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} має бути RGB кольором\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} має бути RGBA кольором\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} має бути HSL кольором\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} має бути HSLA кольором\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0} має бути номером телефону у форматі E.164\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} має бути email адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} має бути URL\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} має бути URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} має бути Base64 рядком\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"contains\",\n\t\t\ttranslation:     \"{0} має містити текст '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"containsany\",\n\t\t\ttranslation:     \"{0} має містити щонайменше один із символів '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excludes\",\n\t\t\ttranslation:     \"{0} не має містити текст '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excludesall\",\n\t\t\ttranslation:     \"{0} не має містити символи '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"excludesrune\",\n\t\t\ttranslation:     \"{0} не має містити '{1}'\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} має бути ISBN номером\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} має бути ISBN-10 номером\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} має бути ISBN-13 номером\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} має бути ISSN номером\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} має бути UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} має бути UUID 3 версії\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} має бути UUID 4 версії\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} має бути UUID 5 версії\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0} має бути ULID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} має містити тільки ascii символи\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} має містити тільки доступні для друку ascii символи\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} має містити мультібайтні символи\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} має містити Data URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} має містити координати широти\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} має містити координати довготи\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} має бути SSN номером\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} має бути IPv4 адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} має бути IPv6 адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} має бути IP адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} має містити CIDR позначення\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} має містити CIDR позначення для IPv4 адреси\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} має містити CIDR позначення для IPv6 адреси\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} має бути TCP адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} має бути IPv4 TCP адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} має бути IPv6 TCP адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} має бути UDP адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} має бути IPv4 UDP адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} має бути IPv6 UDP адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} має бути розпізнаваною IP адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} має бути розпізнаваною IPv4 адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} має бути розпізнаваною IPv6 адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} має бути розпізнаваною UNIX адресою\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} має містити MAC адресу\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"fqdn\",\n\t\t\ttranslation: \"{0} має містити FQDN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} має містити унікальні значення\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} має бути кольором\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"oneof\",\n\t\t\ttranslation:     \"{0} має бути одним з [{1}]\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0} має бути json рядком\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"jwt\",\n\t\t\ttranslation: \"{0} має бути jwt рядком\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0} має бути рядком у нижньому регістрі\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0} має бути рядком у верхньому регістрі\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:             \"datetime\",\n\t\t\ttranslation:     \"{0} не відповідає {1} формату\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"postcode_iso3166_alpha2\",\n\t\t\ttranslation:     \"{0} не відповідає формату поштового індексу країни {1}\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:             \"postcode_iso3166_alpha2_field\",\n\t\t\ttranslation:     \"{0} не відповідає формату поштового індексу країни в {1} полі\",\n\t\t\toverride:        false,\n\t\t\tcustomTransFunc: translateFuncWithParam,\n\t\t},\n\t\t{\n\t\t\ttag:         \"boolean\",\n\t\t\ttranslation: \"{0} має бути булевим значенням\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} має бути допустимим зображенням\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cve\",\n\t\t\ttranslation: \"{0} має бути cve ідентифікатором\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n\nfunc translateFuncWithParam(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\tif err != nil {\n\t\tlog.Printf(\"warning: error translating FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n\nfunc registerCardinals(ut ut.Translator, prefix string) (err error) {\n\tvar (\n\t\tstringCharacterKey = fmt.Sprintf(\"%s-string-character\", prefix)\n\t\titemsItemKey       = fmt.Sprintf(\"%s-items-item\", prefix)\n\t)\n\n\tif err = ut.AddCardinal(stringCharacterKey, \"{0} символ\", locales.PluralRuleOne, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(stringCharacterKey, \"{0} символи\", locales.PluralRuleFew, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(stringCharacterKey, \"{0} символів\", locales.PluralRuleMany, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(stringCharacterKey, \"{0} символи\", locales.PluralRuleOther, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(itemsItemKey, \"{0} елемент\", locales.PluralRuleOne, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(itemsItemKey, \"{0} елементи\", locales.PluralRuleFew, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(itemsItemKey, \"{0} елементів\", locales.PluralRuleMany, false); err != nil {\n\t\treturn\n\t}\n\n\tif err = ut.AddCardinal(itemsItemKey, \"{0} елементи\", locales.PluralRuleOther, false); err != nil {\n\t\treturn\n\t}\n\n\treturn\n}\n"
  },
  {
    "path": "translations/uk/uk_test.go",
    "content": "package uk\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tukrainian \"github.com/go-playground/locales/uk\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tuk := ukrainian.New()\n\tuni := ut.New(uk, uk)\n\ttrans, ok := uni.GetTranslator(\"uk\")\n\tif !ok {\n\t\tt.Fatalf(\"didn't found translator\")\n\t}\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString    string\n\t\tNeCSFieldString    string\n\t\tGtCSFieldString    string\n\t\tGteCSFieldString   string\n\t\tLtCSFieldString    string\n\t\tLteCSFieldString   string\n\t\tRequiredIf         string\n\t\tRequiredUnless     string\n\t\tRequiredWith       string\n\t\tRequiredWithAll    string\n\t\tRequiredWithout    string\n\t\tRequiredWithoutAll string\n\t\tExcludedIf         string\n\t\tExcludedUnless     string\n\t\tExcludedWith       string\n\t\tExcludedWithAll    string\n\t\tExcludedWithout    string\n\t\tExcludedWithoutAll string\n\t}\n\n\ttype Test struct {\n\t\tInner                   Inner\n\t\tRequiredString          string            `validate:\"required\"`\n\t\tRequiredNumber          int               `validate:\"required\"`\n\t\tRequiredMultiple        []string          `validate:\"required\"`\n\t\tRequiredIf              string            `validate:\"required_if=Inner.RequiredIf abcd\"`\n\t\tRequiredUnless          string            `validate:\"required_unless=Inner.RequiredUnless abcd\"`\n\t\tRequiredWith            string            `validate:\"required_with=Inner.RequiredWith\"`\n\t\tRequiredWithAll         string            `validate:\"required_with_all=Inner.RequiredWith Inner.RequiredWithAll\"`\n\t\tRequiredWithout         string            `validate:\"required_without=Inner.RequiredWithout\"`\n\t\tRequiredWithoutAll      string            `validate:\"required_without_all=Inner.RequiredWithout Inner.RequiredWithoutAll\"`\n\t\tExcludedIf              string            `validate:\"excluded_if=Inner.ExcludedIf abcd\"`\n\t\tExcludedUnless          string            `validate:\"excluded_unless=Inner.ExcludedUnless abcd\"`\n\t\tExcludedWith            string            `validate:\"excluded_with=Inner.ExcludedWith\"`\n\t\tExcludedWithout         string            `validate:\"excluded_with_all=Inner.ExcludedWithAll\"`\n\t\tExcludedWithAll         string            `validate:\"excluded_without=Inner.ExcludedWithout\"`\n\t\tExcludedWithoutAll      string            `validate:\"excluded_without_all=Inner.ExcludedWithoutAll\"`\n\t\tIsDefault               string            `validate:\"isdefault\"`\n\t\tLenString               string            `validate:\"len=1\"`\n\t\tLenNumber               float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple             []string          `validate:\"len=7\"`\n\t\tLenMultipleSecond       []string          `validate:\"len=2\"`\n\t\tLenMultipleThird        []string          `validate:\"len=1\"`\n\t\tMinString               string            `validate:\"min=1\"`\n\t\tMinStringMultiple       string            `validate:\"min=2\"`\n\t\tMinStringMultipleSecond string            `validate:\"min=7\"`\n\t\tMinStringMultipleThird  string            `validate:\"min=1\"`\n\t\tMinNumber               float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple             []string          `validate:\"min=7\"`\n\t\tMinMultipleSecond       []string          `validate:\"min=2\"`\n\t\tMinMultipleThird        []string          `validate:\"min=1\"`\n\t\tMaxString               string            `validate:\"max=3\"`\n\t\tMaxStringSecond         string            `validate:\"max=7\"`\n\t\tMaxStringThird          string            `validate:\"max=1\"`\n\t\tMaxNumber               float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple             []string          `validate:\"max=7\"`\n\t\tMaxMultipleSecond       []string          `validate:\"max=2\"`\n\t\tMaxMultipleThird        []string          `validate:\"max=1\"`\n\t\tEqString                string            `validate:\"eq=3\"`\n\t\tEqNumber                float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple              []string          `validate:\"eq=7\"`\n\t\tNeString                string            `validate:\"ne=\"`\n\t\tNeNumber                float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple              []string          `validate:\"ne=0\"`\n\t\tLtString                string            `validate:\"lt=3\"`\n\t\tLtStringSecond          string            `validate:\"lt=7\"`\n\t\tLtStringThird           string            `validate:\"lt=1\"`\n\t\tLtNumber                float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple              []string          `validate:\"lt=2\"`\n\t\tLtMultipleSecond        []string          `validate:\"lt=7\"`\n\t\tLtMultipleThird         []string          `validate:\"lt=1\"`\n\t\tLtTime                  time.Time         `validate:\"lt\"`\n\t\tLteString               string            `validate:\"lte=3\"`\n\t\tLteStringSecond         string            `validate:\"lte=7\"`\n\t\tLteStringThird          string            `validate:\"lte=1\"`\n\t\tLteNumber               float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple             []string          `validate:\"lte=2\"`\n\t\tLteMultipleSecond       []string          `validate:\"lte=7\"`\n\t\tLteMultipleThird        []string          `validate:\"lte=1\"`\n\t\tLteTime                 time.Time         `validate:\"lte\"`\n\t\tGtString                string            `validate:\"gt=3\"`\n\t\tGtStringSecond          string            `validate:\"gt=7\"`\n\t\tGtStringThird           string            `validate:\"gt=1\"`\n\t\tGtNumber                float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple              []string          `validate:\"gt=2\"`\n\t\tGtMultipleSecond        []string          `validate:\"gt=7\"`\n\t\tGtMultipleThird         []string          `validate:\"gt=1\"`\n\t\tGtTime                  time.Time         `validate:\"gt\"`\n\t\tGteString               string            `validate:\"gte=3\"`\n\t\tGteStringSecond         string            `validate:\"gte=7\"`\n\t\tGteStringThird          string            `validate:\"gte=1\"`\n\t\tGteNumber               float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple             []string          `validate:\"gte=2\"`\n\t\tGteMultipleSecond       []string          `validate:\"gte=7\"`\n\t\tGteMultipleThird        []string          `validate:\"gte=1\"`\n\t\tGteTime                 time.Time         `validate:\"gte\"`\n\t\tEqFieldString           string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString         string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString         string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString         string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString        string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString         string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString        string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString           string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString           string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString          string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString           string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString          string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString             string            `validate:\"alpha\"`\n\t\tAlphanumString          string            `validate:\"alphanum\"`\n\t\tNumericString           string            `validate:\"numeric\"`\n\t\tNumberString            string            `validate:\"number\"`\n\t\tHexadecimalString       string            `validate:\"hexadecimal\"`\n\t\tHexColorString          string            `validate:\"hexcolor\"`\n\t\tRGBColorString          string            `validate:\"rgb\"`\n\t\tRGBAColorString         string            `validate:\"rgba\"`\n\t\tHSLColorString          string            `validate:\"hsl\"`\n\t\tHSLAColorString         string            `validate:\"hsla\"`\n\t\tEmail                   string            `validate:\"email\"`\n\t\tURL                     string            `validate:\"url\"`\n\t\tURI                     string            `validate:\"uri\"`\n\t\tBase64                  string            `validate:\"base64\"`\n\t\tContains                string            `validate:\"contains=purpose\"`\n\t\tContainsAny             string            `validate:\"containsany=!@#$\"`\n\t\tExcludes                string            `validate:\"excludes=text\"`\n\t\tExcludesAll             string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune            string            `validate:\"excludesrune=☻\"`\n\t\tISBN                    string            `validate:\"isbn\"`\n\t\tISBN10                  string            `validate:\"isbn10\"`\n\t\tISBN13                  string            `validate:\"isbn13\"`\n\t\tISSN                    string            `validate:\"issn\"`\n\t\tUUID                    string            `validate:\"uuid\"`\n\t\tUUID3                   string            `validate:\"uuid3\"`\n\t\tUUID4                   string            `validate:\"uuid4\"`\n\t\tUUID5                   string            `validate:\"uuid5\"`\n\t\tULID                    string            `validate:\"ulid\"`\n\t\tASCII                   string            `validate:\"ascii\"`\n\t\tPrintableASCII          string            `validate:\"printascii\"`\n\t\tMultiByte               string            `validate:\"multibyte\"`\n\t\tDataURI                 string            `validate:\"datauri\"`\n\t\tLatitude                string            `validate:\"latitude\"`\n\t\tLongitude               string            `validate:\"longitude\"`\n\t\tSSN                     string            `validate:\"ssn\"`\n\t\tIP                      string            `validate:\"ip\"`\n\t\tIPv4                    string            `validate:\"ipv4\"`\n\t\tIPv6                    string            `validate:\"ipv6\"`\n\t\tCIDR                    string            `validate:\"cidr\"`\n\t\tCIDRv4                  string            `validate:\"cidrv4\"`\n\t\tCIDRv6                  string            `validate:\"cidrv6\"`\n\t\tTCPAddr                 string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4               string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6               string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr                 string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4               string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6               string            `validate:\"udp6_addr\"`\n\t\tIPAddr                  string            `validate:\"ip_addr\"`\n\t\tIPAddrv4                string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6                string            `validate:\"ip6_addr\"`\n\t\tUinxAddr                string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC                     string            `validate:\"mac\"`\n\t\tFQDN                    string            `validate:\"fqdn\"`\n\t\tIsColor                 string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen            *string           `validate:\"min=10\"`\n\t\tStrPtrMinLenSecond      *string           `validate:\"min=2\"`\n\t\tStrPtrMaxLen            *string           `validate:\"max=1\"`\n\t\tStrPtrLen               *string           `validate:\"len=2\"`\n\t\tStrPtrLenSecond         *string           `validate:\"len=7\"`\n\t\tStrPtrLt                *string           `validate:\"lt=1\"`\n\t\tStrPtrLte               *string           `validate:\"lte=1\"`\n\t\tStrPtrLteMultiple       *string           `validate:\"lte=2\"`\n\t\tStrPtrLteMultipleSecond *string           `validate:\"lte=7\"`\n\t\tStrPtrGt                *string           `validate:\"gt=10\"`\n\t\tStrPtrGte               *string           `validate:\"gte=10\"`\n\t\tStrPtrGtSecond          *string           `validate:\"gt=2\"`\n\t\tStrPtrGteSecond         *string           `validate:\"gte=2\"`\n\t\tOneOfString             string            `validate:\"oneof=red green\"`\n\t\tOneOfInt                int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice             []string          `validate:\"unique\"`\n\t\tUniqueArray             [3]string         `validate:\"unique\"`\n\t\tUniqueMap               map[string]string `validate:\"unique\"`\n\t\tJSONString              string            `validate:\"json\"`\n\t\tJWTString               string            `validate:\"jwt\"`\n\t\tLowercaseString         string            `validate:\"lowercase\"`\n\t\tUppercaseString         string            `validate:\"uppercase\"`\n\t\tDatetime                string            `validate:\"datetime=2006-01-02\"`\n\t\tPostCode                string            `validate:\"postcode_iso3166_alpha2=SG\"`\n\t\tPostCodeCountry         string\n\t\tPostCodeByField         string `validate:\"postcode_iso3166_alpha2_field=PostCodeCountry\"`\n\t\tBooleanString           string `validate:\"boolean\"`\n\t\tImage                   string `validate:\"image\"`\n\t\tCveString               string `validate:\"cve\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\ttest.Inner.RequiredUnless = \"1234\"\n\ttest.Inner.RequiredWith = \"1234\"\n\ttest.Inner.RequiredWithAll = \"1234\"\n\ttest.Inner.ExcludedIf = \"abcd\"\n\ttest.Inner.ExcludedUnless = \"1234\"\n\ttest.Inner.ExcludedWith = \"1234\"\n\ttest.Inner.ExcludedWithAll = \"1234\"\n\n\ttest.ExcludedIf = \"1234\"\n\ttest.ExcludedUnless = \"1234\"\n\ttest.ExcludedWith = \"1234\"\n\ttest.ExcludedWithAll = \"1234\"\n\ttest.ExcludedWithout = \"1234\"\n\ttest.ExcludedWithoutAll = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxStringSecond = \"12345678\"\n\ttest.MaxStringThird = \"12\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\ttest.MaxMultipleSecond = make([]string, 3)\n\ttest.MaxMultipleThird = make([]string, 2)\n\n\ttest.LtString = \"1234\"\n\ttest.LtStringSecond = \"12345678\"\n\ttest.LtStringThird = \"12\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtMultipleSecond = make([]string, 8)\n\ttest.LtMultipleThird = make([]string, 2)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteStringSecond = \"12345678\"\n\ttest.LteStringThird = \"12\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteMultipleSecond = make([]string, 8)\n\ttest.LteMultipleThird = make([]string, 2)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\ttest.Datetime = \"2008-Feb-01\"\n\ttest.BooleanString = \"A\"\n\ttest.CveString = \"A\"\n\n\ttest.Inner.RequiredIf = \"abcd\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor має бути кольором\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC має містити MAC адресу\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.FQDN\",\n\t\t\texpected: \"FQDN має містити FQDN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr має бути розпізнаваною IP адресою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 має бути розпізнаваною IPv4 адресою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 має бути розпізнаваною IPv6 адресою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr має бути UDP адресою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 має бути IPv4 UDP адресою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 має бути IPv6 UDP адресою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr має бути TCP адресою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 має бути IPv4 TCP адресою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 має бути IPv6 TCP адресою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR має містити CIDR позначення\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 має містити CIDR позначення для IPv4 адреси\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 має містити CIDR позначення для IPv6 адреси\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN має бути SSN номером\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP має бути IP адресою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 має бути IPv4 адресою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 має бути IPv6 адресою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI має містити Data URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude має містити координати широти\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude має містити координати довготи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte має містити мультібайтні символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII має містити тільки ascii символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII має містити тільки доступні для друку ascii символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID має бути UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 має бути UUID 3 версії\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 має бути UUID 4 версії\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 має бути UUID 5 версії\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID має бути ULID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN має бути ISBN номером\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 має бути ISBN-10 номером\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 має бути ISBN-13 номером\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN має бути ISSN номером\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes не має містити текст 'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll не має містити символи '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune не має містити '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny має містити щонайменше один із символів '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains має містити текст 'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 має бути Base64 рядком\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email має бути email адресою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL має бути URL\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI має бути URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString має бути RGB кольором\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString має бути RGBA кольором\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString має бути HSL кольором\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString має бути HSLA кольором\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString має бути шістнадцятковим рядком\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString має бути HEX кольором\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString має бути цифрою\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString має бути цифровим значенням\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString має містити тільки літери та цифри\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString має містити тільки літери\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString має бути менше MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString має бути менше чи дорівнювати MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString має бути більше MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString має бути більше чи дорівнювати MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString не має дорівнювати EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString має бути менше Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString має бути менше чи дорівнювати Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString має бути більше Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString має бути більше чи дорівнювати Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString не має дорівнювати Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString має дорівнювати Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString має дорівнювати MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString має містити щонайменше 3 символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteStringSecond\",\n\t\t\texpected: \"GteStringSecond має містити щонайменше 7 символів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteStringThird\",\n\t\t\texpected: \"GteStringThird має містити щонайменше 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber має бути більше чи дорівнювати 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple має містити щонайменше 2 елементи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultipleSecond\",\n\t\t\texpected: \"GteMultipleSecond має містити щонайменше 7 елементів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultipleThird\",\n\t\t\texpected: \"GteMultipleThird має містити щонайменше 1 елемент\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime має бути пізніше чи дорівнювати теперішньому моменту\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString має бути довше за 3 символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtStringSecond\",\n\t\t\texpected: \"GtStringSecond має бути довше за 7 символів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtStringThird\",\n\t\t\texpected: \"GtStringThird має бути довше за 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber має бути більше 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple має містити більше ніж 2 елементи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultipleSecond\",\n\t\t\texpected: \"GtMultipleSecond має містити більше ніж 7 елементів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultipleThird\",\n\t\t\texpected: \"GtMultipleThird має містити більше ніж 1 елемент\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime має бути пізніше поточного моменту\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString має містити максимум 3 символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteStringSecond\",\n\t\t\texpected: \"LteStringSecond має містити максимум 7 символів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteStringThird\",\n\t\t\texpected: \"LteStringThird має містити максимум 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber має бути менше чи дорівнювати 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple має містити максимум 2 елементи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultipleSecond\",\n\t\t\texpected: \"LteMultipleSecond має містити максимум 7 елементів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultipleThird\",\n\t\t\texpected: \"LteMultipleThird має містити максимум 1 елемент\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime має бути менше чи дорівнювати поточній даті та часу\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString має мати менше за 3 символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtStringSecond\",\n\t\t\texpected: \"LtStringSecond має мати менше за 7 символів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtStringThird\",\n\t\t\texpected: \"LtStringThird має мати менше за 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber має бути менше 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple має містити менше ніж 2 елементи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultipleSecond\",\n\t\t\texpected: \"LtMultipleSecond має містити менше ніж 7 елементів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultipleThird\",\n\t\t\texpected: \"LtMultipleThird має містити менше ніж 1 елемент\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime має бути менше поточної дати й часу\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString має не дорівнювати \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber має не дорівнювати 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple має не дорівнювати 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString не дорівнює 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber не дорівнює 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple не дорівнює 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString має містити максимум 3 символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxStringSecond\",\n\t\t\texpected: \"MaxStringSecond має містити максимум 7 символів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber має бути менше чи дорівнювати 1 113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple має містити максимум 7 елементів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultipleSecond\",\n\t\t\texpected: \"MaxMultipleSecond має містити максимум 2 елементи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString має містити щонайменше 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinStringMultiple\",\n\t\t\texpected: \"MinStringMultiple має містити щонайменше 2 символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinStringMultipleSecond\",\n\t\t\texpected: \"MinStringMultipleSecond має містити щонайменше 7 символів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinStringMultipleThird\",\n\t\t\texpected: \"MinStringMultipleThird має містити щонайменше 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber має бути більше чи дорівнювати 1 113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple має містити щонайменше 7 елементів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultipleSecond\",\n\t\t\texpected: \"MinMultipleSecond має містити щонайменше 2 елементи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString має бути довжиною в 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber має дорівнювати 1 113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple має містити 7 елементів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultipleSecond\",\n\t\t\texpected: \"LenMultipleSecond має містити 2 елементи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultipleThird\",\n\t\t\texpected: \"LenMultipleThird має містити 1 елемент\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString обов'язкове поле\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredIf\",\n\t\t\texpected: \"RequiredIf обов'язкове поле\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber обов'язкове поле\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple обов'язкове поле\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredUnless\",\n\t\t\texpected: \"RequiredUnless обов'язкове поле\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWith\",\n\t\t\texpected: \"RequiredWith обов'язкове поле\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithAll\",\n\t\t\texpected: \"RequiredWithAll обов'язкове поле\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithout\",\n\t\t\texpected: \"RequiredWithout обов'язкове поле\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithoutAll\",\n\t\t\texpected: \"RequiredWithoutAll обов'язкове поле\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedIf\",\n\t\t\texpected: \"ExcludedIf є виключеним полем\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedUnless\",\n\t\t\texpected: \"ExcludedUnless є виключеним полем\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWith\",\n\t\t\texpected: \"ExcludedWith є виключеним полем\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithAll\",\n\t\t\texpected: \"ExcludedWithAll є виключеним полем\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithout\",\n\t\t\texpected: \"ExcludedWithout є виключеним полем\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithoutAll\",\n\t\t\texpected: \"ExcludedWithoutAll є виключеним полем\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen має містити щонайменше 10 символів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLenSecond\",\n\t\t\texpected: \"StrPtrMinLenSecond має містити щонайменше 2 символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen має містити максимум 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen має бути довжиною в 2 символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLenSecond\",\n\t\t\texpected: \"StrPtrLenSecond має бути довжиною в 7 символів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt має мати менше за 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte має містити максимум 1 символ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLteMultiple\",\n\t\t\texpected: \"StrPtrLteMultiple має містити максимум 2 символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLteMultipleSecond\",\n\t\t\texpected: \"StrPtrLteMultipleSecond має містити максимум 7 символів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt має бути довше за 10 символів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGtSecond\",\n\t\t\texpected: \"StrPtrGtSecond має бути довше за 2 символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte має містити щонайменше 10 символів\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGteSecond\",\n\t\t\texpected: \"StrPtrGteSecond має містити щонайменше 2 символи\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString має бути одним з [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt має бути одним з [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice має містити унікальні значення\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray має містити унікальні значення\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap має містити унікальні значення\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JSONString\",\n\t\t\texpected: \"JSONString має бути json рядком\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JWTString\",\n\t\t\texpected: \"JWTString має бути jwt рядком\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"LowercaseString має бути рядком у нижньому регістрі\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"UppercaseString має бути рядком у верхньому регістрі\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"Datetime не відповідає 2006-01-02 формату\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCode\",\n\t\t\texpected: \"PostCode не відповідає формату поштового індексу країни SG\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCodeByField\",\n\t\t\texpected: \"PostCodeByField не відповідає формату поштового індексу країни в PostCodeCountry полі\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.BooleanString\",\n\t\t\texpected: \"BooleanString має бути булевим значенням\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image має бути допустимим зображенням\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CveString\",\n\t\t\texpected: \"CveString має бути cve ідентифікатором\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/vi/vi.go",
    "content": "package vi\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0} không được bỏ trống\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0} phải có độ dài là {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"len-string-character\", \"{0} ký tự\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0} ký tự\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0} phải bằng {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0} phải chứa {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// if err = ut.AddCardinal(\"len-items-item\", \"{0} phần tử\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0} phần tử\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0} phải chứa ít nhất {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"min-string-character\", \"{0} ký tự\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0} ký tự\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0} phải bằng {1} hoặc lớn hơn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0} phải chứa ít nhất {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// if err = ut.AddCardinal(\"min-items-item\", \"{0} phần tử\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0} phần tử\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0} chỉ được chứa tối đa {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"max-string-character\", \"{0} ký tự\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0} ký tự\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0} phải là {1} hoặc nhỏ hơn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0} chỉ được chứa tối đa {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// if err = ut.AddCardinal(\"max-items-item\", \"{0} phần tử\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0} phần tử\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0} không bằng {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0} không được bằng {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0} phải có độ dài nhỏ hơn {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"lt-string-character\", \"{0} ký tự\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0} ký tự\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0} phải nhỏ hơn {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0} chỉ được chứa ít hơn {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"lt-items-item\", \"{0} phần tử\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0} phần tử\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0} phải nhỏ hơn Ngày & Giờ hiện tại\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' không thể dùng trên kiểu struct\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0} chỉ được có độ dài tối đa là {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"lte-string-character\", \"{0} ký tự\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0} ký tự\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0} phải là {1} hoặc nhỏ hơn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0} chỉ được chứa nhiều nhất {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"lte-items-item\", \"{0} phần tử\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0} phần tử\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0} chỉ được nhỏ hơn hoặc bằng Ngày & Giờ hiện tại\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' không thể dùng trên kiểu struct\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0} phải có độ dài lớn hơn {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"gt-string-character\", \"{0} ký tự\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0} ký tự\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0} phải lớn hơn {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0} phải chứa nhiều hơn {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"gt-items-item\", \"{0} phần tử\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0} phần tử\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0} phải lớn hơn Ngày & Giờ hiện tại\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' không thể dùng trên kiểu struct\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0} phải có độ dài ít nhất {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"gte-string-character\", \"{0} ký tự\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0} ký tự\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0} phải là {1} hoặc lớn hơn\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0} phải chứa ít nhất {1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// if err = ut.AddCardinal(\"gte-items-item\", \"{0} phần tử\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0} phần tử\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0} phải lớn hơn hoặc bằng Ngày & Giờ hiện tại\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s' không thể dùng trên kiểu struct\", fe.Tag())\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0} phải bằng {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0} phải bằng {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0} không được phép bằng {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0} phải lớn hơn {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0} phải lớn hơn hoặc bằng {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0} chỉ được nhỏ hơn {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0} chỉ được nhỏ hơn hoặc bằng {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0} không được phép bằng {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0} phải lớn hơn {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0} phải lớn hơn hoặc bằng {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0} chỉ được nhỏ hơn {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0} chỉ được nhỏ hơn hoặc bằng {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0} chỉ được chứa ký tự dạng alphabetic\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0} chỉ được chứa ký tự dạng alphanumeric\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0} chỉ được chứa giá trị số hoặc số dưới dạng chữ\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0} chỉ được chứa giá trị số\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0} phải là giá trị hexadecimal\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0} phải là giá trị HEX color\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0} phải là giá trị RGB color\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0} phải là giá trị RGBA color\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0} phải là giá trị HSL color\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0} phải là giá trị HSLA color\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"e164\",\n\t\t\ttranslation: \"{0} phải là giá trị số điện thoại theo định dạng E.164\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0} phải là giá trị email address\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0} phải là giá trị URL\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0} phải là giá trị URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0} phải là giá trị chuỗi Base64\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0} phải chứa chuỗi '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0} phải chứa ít nhất 1 trong cách ký tự sau '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0} không được chứa chuỗi '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0} không được chứa bất kỳ ký tự nào trong nhóm ký tự '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0} không được chứa '{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0} phải là số ISBN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0} phải là số ISBN-10\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0} phải là số ISBN-13\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0} phải là số ISSN\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0} phải là giá trị UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0} phải là giá trị UUID phiên bản 3\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0} phải là giá trị UUID phiên bản 4\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0} phải là giá trị UUID phiên bản 5\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0} chỉ được chứa ký tự ASCII\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0} chỉ được chứa ký tự ASCII có thể in ấn\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0} chỉ được chứa ký tự multibyte\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0} chỉ được chứa Data URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0} chỉ được chứa latitude (vỹ độ)\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0} chỉ được chứa longitude (kinh độ)\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0} phải là SSN number\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0} phải là địa chỉ IPv4\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0} phải là địa chỉ IPv6\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0} phải là địa chỉ IP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0} chỉ được chứa CIDR notation\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0} chỉ được chứa CIDR notation của một địa chỉ IPv4\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0} chỉ được chứa CIDR notation của một địa chỉ IPv6\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0} phải là địa chỉ TCP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0} phải là địa chỉ IPv4 TCP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0} phải là địa chỉ IPv6 TCP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0} phải là địa chỉ UDP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0} phải là địa chỉ IPv4 UDP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0} phải là địa chỉ IPv6 UDP\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0} phải là địa chỉ IP có thể phân giải\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0} phải là địa chỉ IPv4 có thể phân giải\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0} phải là địa chỉ IPv6 có thể phân giải\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0} phải là địa chỉ UNIX có thể phân giải\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0} chỉ được chứa địa chỉ MAC\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unique\",\n\t\t\ttranslation: \"{0} chỉ được chứa những giá trị không trùng lặp\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0} phải là màu sắc hợp lệ\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0} phải là trong những giá trị [{1}]\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0} phải là một chuỗi json hợp lệ\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"jwt\",\n\t\t\ttranslation: \"{0} phải là một chuỗi jwt hợp lệ\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0} phải được viết thường\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0} phải được viết hoa\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datetime\",\n\t\t\ttranslation: \"{0} không trùng định dạng ngày tháng {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2\",\n\t\t\ttranslation: \"{0} sai định dạng postcode của quốc gia {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"postcode_iso3166_alpha2_field\",\n\t\t\ttranslation: \"{0} sai định dạng postcode của quốc gia tương ứng thuộc trường {1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} phải là một hình ảnh hợp lệ\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"cảnh báo: lỗi chuyển ngữ FieldError: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/vi/vi_test.go",
    "content": "package vi\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tvietnamese \"github.com/go-playground/locales/vi\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tvie := vietnamese.New()\n\tuni := ut.New(vie, vie)\n\ttrans, _ := uni.GetTranslator(\"vi\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString  string\n\t\tNeCSFieldString  string\n\t\tGtCSFieldString  string\n\t\tGteCSFieldString string\n\t\tLtCSFieldString  string\n\t\tLteCSFieldString string\n\t}\n\n\ttype Test struct {\n\t\tInner             Inner\n\t\tRequiredString    string            `validate:\"required\"`\n\t\tRequiredNumber    int               `validate:\"required\"`\n\t\tRequiredMultiple  []string          `validate:\"required\"`\n\t\tLenString         string            `validate:\"len=1\"`\n\t\tLenNumber         float64           `validate:\"len=1113.00\"`\n\t\tLenMultiple       []string          `validate:\"len=7\"`\n\t\tMinString         string            `validate:\"min=1\"`\n\t\tMinNumber         float64           `validate:\"min=1113.00\"`\n\t\tMinMultiple       []string          `validate:\"min=7\"`\n\t\tMaxString         string            `validate:\"max=3\"`\n\t\tMaxNumber         float64           `validate:\"max=1113.00\"`\n\t\tMaxMultiple       []string          `validate:\"max=7\"`\n\t\tEqString          string            `validate:\"eq=3\"`\n\t\tEqNumber          float64           `validate:\"eq=2.33\"`\n\t\tEqMultiple        []string          `validate:\"eq=7\"`\n\t\tNeString          string            `validate:\"ne=\"`\n\t\tNeNumber          float64           `validate:\"ne=0.00\"`\n\t\tNeMultiple        []string          `validate:\"ne=0\"`\n\t\tLtString          string            `validate:\"lt=3\"`\n\t\tLtNumber          float64           `validate:\"lt=5.56\"`\n\t\tLtMultiple        []string          `validate:\"lt=2\"`\n\t\tLtTime            time.Time         `validate:\"lt\"`\n\t\tLteString         string            `validate:\"lte=3\"`\n\t\tLteNumber         float64           `validate:\"lte=5.56\"`\n\t\tLteMultiple       []string          `validate:\"lte=2\"`\n\t\tLteTime           time.Time         `validate:\"lte\"`\n\t\tGtString          string            `validate:\"gt=3\"`\n\t\tGtNumber          float64           `validate:\"gt=5.56\"`\n\t\tGtMultiple        []string          `validate:\"gt=2\"`\n\t\tGtTime            time.Time         `validate:\"gt\"`\n\t\tGteString         string            `validate:\"gte=3\"`\n\t\tGteNumber         float64           `validate:\"gte=5.56\"`\n\t\tGteMultiple       []string          `validate:\"gte=2\"`\n\t\tGteTime           time.Time         `validate:\"gte\"`\n\t\tEqFieldString     string            `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString   string            `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString   string            `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString   string            `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString  string            `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString   string            `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString  string            `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString     string            `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString     string            `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString    string            `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString     string            `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString    string            `validate:\"ltefield=MaxString\"`\n\t\tAlphaString       string            `validate:\"alpha\"`\n\t\tAlphanumString    string            `validate:\"alphanum\"`\n\t\tNumericString     string            `validate:\"numeric\"`\n\t\tNumberString      string            `validate:\"number\"`\n\t\tHexadecimalString string            `validate:\"hexadecimal\"`\n\t\tHexColorString    string            `validate:\"hexcolor\"`\n\t\tRGBColorString    string            `validate:\"rgb\"`\n\t\tRGBAColorString   string            `validate:\"rgba\"`\n\t\tHSLColorString    string            `validate:\"hsl\"`\n\t\tHSLAColorString   string            `validate:\"hsla\"`\n\t\tEmail             string            `validate:\"email\"`\n\t\tURL               string            `validate:\"url\"`\n\t\tURI               string            `validate:\"uri\"`\n\t\tBase64            string            `validate:\"base64\"`\n\t\tContains          string            `validate:\"contains=purpose\"`\n\t\tContainsAny       string            `validate:\"containsany=!@#$\"`\n\t\tExcludes          string            `validate:\"excludes=text\"`\n\t\tExcludesAll       string            `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune      string            `validate:\"excludesrune=☻\"`\n\t\tISBN              string            `validate:\"isbn\"`\n\t\tISBN10            string            `validate:\"isbn10\"`\n\t\tISBN13            string            `validate:\"isbn13\"`\n\t\tISSN              string            `validate:\"issn\"`\n\t\tUUID              string            `validate:\"uuid\"`\n\t\tUUID3             string            `validate:\"uuid3\"`\n\t\tUUID4             string            `validate:\"uuid4\"`\n\t\tUUID5             string            `validate:\"uuid5\"`\n\t\tASCII             string            `validate:\"ascii\"`\n\t\tPrintableASCII    string            `validate:\"printascii\"`\n\t\tMultiByte         string            `validate:\"multibyte\"`\n\t\tDataURI           string            `validate:\"datauri\"`\n\t\tLatitude          string            `validate:\"latitude\"`\n\t\tLongitude         string            `validate:\"longitude\"`\n\t\tSSN               string            `validate:\"ssn\"`\n\t\tIP                string            `validate:\"ip\"`\n\t\tIPv4              string            `validate:\"ipv4\"`\n\t\tIPv6              string            `validate:\"ipv6\"`\n\t\tCIDR              string            `validate:\"cidr\"`\n\t\tCIDRv4            string            `validate:\"cidrv4\"`\n\t\tCIDRv6            string            `validate:\"cidrv6\"`\n\t\tTCPAddr           string            `validate:\"tcp_addr\"`\n\t\tTCPAddrv4         string            `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6         string            `validate:\"tcp6_addr\"`\n\t\tUDPAddr           string            `validate:\"udp_addr\"`\n\t\tUDPAddrv4         string            `validate:\"udp4_addr\"`\n\t\tUDPAddrv6         string            `validate:\"udp6_addr\"`\n\t\tIPAddr            string            `validate:\"ip_addr\"`\n\t\tIPAddrv4          string            `validate:\"ip4_addr\"`\n\t\tIPAddrv6          string            `validate:\"ip6_addr\"`\n\t\tUinxAddr          string            `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC               string            `validate:\"mac\"`\n\t\tIsColor           string            `validate:\"iscolor\"`\n\t\tStrPtrMinLen      *string           `validate:\"min=10\"`\n\t\tStrPtrMaxLen      *string           `validate:\"max=1\"`\n\t\tStrPtrLen         *string           `validate:\"len=2\"`\n\t\tStrPtrLt          *string           `validate:\"lt=1\"`\n\t\tStrPtrLte         *string           `validate:\"lte=1\"`\n\t\tStrPtrGt          *string           `validate:\"gt=10\"`\n\t\tStrPtrGte         *string           `validate:\"gte=10\"`\n\t\tOneOfString       string            `validate:\"oneof=red green\"`\n\t\tOneOfInt          int               `validate:\"oneof=5 63\"`\n\t\tUniqueSlice       []string          `validate:\"unique\"`\n\t\tUniqueArray       [3]string         `validate:\"unique\"`\n\t\tUniqueMap         map[string]string `validate:\"unique\"`\n\t\tJSONString        string            `validate:\"json\"`\n\t\tJWTString         string            `validate:\"jwt\"`\n\t\tLowercaseString   string            `validate:\"lowercase\"`\n\t\tUppercaseString   string            `validate:\"uppercase\"`\n\t\tDatetime          string            `validate:\"datetime=2006-01-02\"`\n\t\tPostCode          string            `validate:\"postcode_iso3166_alpha2=SG\"`\n\t\tPostCodeCountry   string\n\t\tPostCodeByField   string `validate:\"postcode_iso3166_alpha2_field=PostCodeCountry\"`\n\t\tImage             string `validate:\"image\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.UniqueSlice = []string{\"1234\", \"1234\"}\n\ttest.UniqueMap = map[string]string{\"key1\": \"1234\", \"key2\": \"1234\"}\n\ttest.Datetime = \"2008-Feb-01\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor phải là màu sắc hợp lệ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC chỉ được chứa địa chỉ MAC\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr phải là địa chỉ IP có thể phân giải\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4 phải là địa chỉ IPv4 có thể phân giải\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6 phải là địa chỉ IPv6 có thể phân giải\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr phải là địa chỉ UDP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4 phải là địa chỉ IPv4 UDP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6 phải là địa chỉ IPv6 UDP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr phải là địa chỉ TCP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4 phải là địa chỉ IPv4 TCP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6 phải là địa chỉ IPv6 TCP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR chỉ được chứa CIDR notation\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4 chỉ được chứa CIDR notation của một địa chỉ IPv4\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6 chỉ được chứa CIDR notation của một địa chỉ IPv6\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN phải là SSN number\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP phải là địa chỉ IP\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4 phải là địa chỉ IPv4\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6 phải là địa chỉ IPv6\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI chỉ được chứa Data URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude chỉ được chứa latitude (vỹ độ)\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude chỉ được chứa longitude (kinh độ)\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte chỉ được chứa ký tự multibyte\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII chỉ được chứa ký tự ASCII\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII chỉ được chứa ký tự ASCII có thể in ấn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID phải là giá trị UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3 phải là giá trị UUID phiên bản 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4 phải là giá trị UUID phiên bản 4\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5 phải là giá trị UUID phiên bản 5\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN phải là số ISBN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10 phải là số ISBN-10\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13 phải là số ISBN-13\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN phải là số ISSN\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes không được chứa chuỗi 'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll không được chứa bất kỳ ký tự nào trong nhóm ký tự '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune không được chứa '☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny phải chứa ít nhất 1 trong cách ký tự sau '!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains phải chứa chuỗi 'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64 phải là giá trị chuỗi Base64\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email phải là giá trị email address\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL phải là giá trị URL\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI phải là giá trị URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString phải là giá trị RGB color\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString phải là giá trị RGBA color\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString phải là giá trị HSL color\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString phải là giá trị HSLA color\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString phải là giá trị hexadecimal\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString phải là giá trị HEX color\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString chỉ được chứa giá trị số\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString chỉ được chứa giá trị số hoặc số dưới dạng chữ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString chỉ được chứa ký tự dạng alphanumeric\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString chỉ được chứa ký tự dạng alphabetic\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString chỉ được nhỏ hơn MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString chỉ được nhỏ hơn hoặc bằng MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString phải lớn hơn MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString phải lớn hơn hoặc bằng MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString không được phép bằng EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString chỉ được nhỏ hơn Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString chỉ được nhỏ hơn hoặc bằng Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString phải lớn hơn Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString phải lớn hơn hoặc bằng Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString không được phép bằng Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString phải bằng Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString phải bằng MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString phải có độ dài ít nhất 3 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber phải là 5,56 hoặc lớn hơn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple phải chứa ít nhất 2 phần tử\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime phải lớn hơn hoặc bằng Ngày & Giờ hiện tại\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString phải có độ dài lớn hơn 3 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber phải lớn hơn 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple phải chứa nhiều hơn 2 phần tử\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime phải lớn hơn Ngày & Giờ hiện tại\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString chỉ được có độ dài tối đa là 3 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber phải là 5,56 hoặc nhỏ hơn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple chỉ được chứa nhiều nhất 2 phần tử\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime chỉ được nhỏ hơn hoặc bằng Ngày & Giờ hiện tại\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString phải có độ dài nhỏ hơn 3 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber phải nhỏ hơn 5,56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple chỉ được chứa ít hơn 2 phần tử\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime phải nhỏ hơn Ngày & Giờ hiện tại\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString không được bằng \",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber không được bằng 0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple không được bằng 0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString không bằng 3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber không bằng 2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple không bằng 7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString chỉ được chứa tối đa 3 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber phải là 1.113,00 hoặc nhỏ hơn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple chỉ được chứa tối đa 7 phần tử\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString phải chứa ít nhất 1 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber phải bằng 1.113,00 hoặc lớn hơn\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple phải chứa ít nhất 7 phần tử\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString phải có độ dài là 1 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber phải bằng 1.113,00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple phải chứa 7 phần tử\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString không được bỏ trống\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber không được bỏ trống\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple không được bỏ trống\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen phải chứa ít nhất 10 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen chỉ được chứa tối đa 1 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen phải có độ dài là 2 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt phải có độ dài nhỏ hơn 1 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte chỉ được có độ dài tối đa là 1 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt phải có độ dài lớn hơn 10 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte phải có độ dài ít nhất 10 ký tự\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString phải là trong những giá trị [red green]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt phải là trong những giá trị [5 63]\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueSlice\",\n\t\t\texpected: \"UniqueSlice chỉ được chứa những giá trị không trùng lặp\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueArray\",\n\t\t\texpected: \"UniqueArray chỉ được chứa những giá trị không trùng lặp\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UniqueMap\",\n\t\t\texpected: \"UniqueMap chỉ được chứa những giá trị không trùng lặp\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JSONString\",\n\t\t\texpected: \"JSONString phải là một chuỗi json hợp lệ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JWTString\",\n\t\t\texpected: \"JWTString phải là một chuỗi jwt hợp lệ\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"LowercaseString phải được viết thường\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"UppercaseString phải được viết hoa\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"Datetime không trùng định dạng ngày tháng 2006-01-02\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCode\",\n\t\t\texpected: \"PostCode sai định dạng postcode của quốc gia SG\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PostCodeByField\",\n\t\t\texpected: \"PostCodeByField sai định dạng postcode của quốc gia tương ứng thuộc trường PostCodeCountry\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image phải là một hình ảnh hợp lệ\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/zh/zh.go",
    "content": "package zh\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0}为必填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_if\",\n\t\t\ttranslation: \"{0}为必填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_unless\",\n\t\t\ttranslation: \"{0}为必填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with\",\n\t\t\ttranslation: \"{0}为必填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with_all\",\n\t\t\ttranslation: \"{0}为必填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without\",\n\t\t\ttranslation: \"{0}为必填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without_all\",\n\t\t\ttranslation: \"{0}为必填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_if\",\n\t\t\ttranslation: \"{0}为禁填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_unless\",\n\t\t\ttranslation: \"{0}为禁填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with\",\n\t\t\ttranslation: \"{0}为禁填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with_all\",\n\t\t\ttranslation: \"{0}为禁填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without\",\n\t\t\ttranslation: \"{0}为禁填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without_all\",\n\t\t\ttranslation: \"{0}为禁填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isdefault\",\n\t\t\ttranslation: \"{0}为禁填字段\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0}长度必须是{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"len-string-character\", \"{0}字符\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0}个字符\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0}必须等于{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0}必须包含{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t//if err = ut.AddCardinal(\"len-items-item\", \"{0}项\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0}项\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻译字段错误: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0}长度必须至少为{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"min-string-character\", \"{0}个字符\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0}个字符\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0}最小只能为{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0}必须至少包含{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t//if err = ut.AddCardinal(\"min-items-item\", \"{0}项\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0}项\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻译字段错误: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0}长度不能超过{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"max-string-character\", \"{0}个字符\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0}个字符\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0}必须小于或等于{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0}最多只能包含{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t//if err = ut.AddCardinal(\"max-items-item\", \"{0}项\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0}项\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻译字段错误: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0}不等于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0}不能等于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0}长度必须小于{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"lt-string-character\", \"{0}个字符\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0}个字符\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0}必须小于{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0}必须包含少于{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"lt-items-item\", \"{0}项\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0}项\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0}必须小于当前日期和时间\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s'不能用于struct类型.\", fe.Tag())\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻译字段错误: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0}长度不能超过{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"lte-string-character\", \"{0} character\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0}个字符\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0}必须小于或等于{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0}最多只能包含{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"lte-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0}项\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0}必须小于或等于当前日期和时间\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s'不能用于struct类型.\", fe.Tag())\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻译字段错误: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0}长度必须大于{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"gt-string-character\", \"{0}个字符\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0}个字符\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0}必须大于{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0}必须大于{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"gt-items-item\", \"{0}项\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0}项\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0}必须大于当前日期和时间\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s'不能用于struct类型.\", fe.Tag())\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻译字段错误: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0}长度必须至少为{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"gte-string-character\", \"{0}个字符\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0}个字符\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0}必须大于或等于{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0}必须至少包含{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"gte-items-item\", \"{0}项\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0}项\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0}必须大于或等于当前日期和时间\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s'不能用于struct类型.\", fe.Tag())\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻译字段错误: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0}必须等于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0}必须等于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0}不能等于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0}必须大于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0}必须大于或等于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0}必须小于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0}必须小于或等于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0}不能等于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0}必须大于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0}必须大于或等于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0}必须小于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0}必须小于或等于{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0}只能包含字母\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0}只能包含字母和数字\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanumunicode\",\n\t\t\ttranslation: \"{0}只能包含字母数字和Unicode字符\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphaunicode\",\n\t\t\ttranslation: \"{0}只能包含字母和Unicode字符\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0}必须是一个有效的数值\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0}必须是一个有效的数字\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0}必须是一个有效的十六进制\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0}必须是一个有效的十六进制颜色\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0}必须是一个有效的RGB颜色\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0}必须是一个有效的RGBA颜色\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0}必须是一个有效的HSL颜色\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0}必须是一个有效的HSLA颜色\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0}必须是一个有效的邮箱\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0}必须是一个有效的URL\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0}必须是一个有效的URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0}必须是一个有效的Base64字符串\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0}必须包含文本'{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0}必须包含至少一个以下字符'{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsrune\",\n\t\t\ttranslation: \"{0}必须包含字符'{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0}不能包含文本'{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0}不能包含以下任何字符'{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0}不能包含'{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"endswith\",\n\t\t\ttranslation: \"{0}必须以文本'{1}'结尾\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"startswith\",\n\t\t\ttranslation: \"{0}必须以文本'{1}'开头\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0}必须是一个有效的ISBN编号\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0}必须是一个有效的ISBN-10编号\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0}必须是一个有效的ISBN-13编号\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0}必须是一个有效的ISSN编号\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0}必须是一个有效的UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0}必须是一个有效的V3 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0}必须是一个有效的V4 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0}必须是一个有效的V5 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0}必须是一个有效的ULID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0}必须只包含ascii字符\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0}必须只包含可打印的ascii字符\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0}必须包含多字节字符\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0}必须包含有效的数据URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0}必须包含有效的纬度坐标\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0}必须包含有效的经度坐标\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0}必须是一个有效的社会安全号码(SSN)\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0}必须是一个有效的IPv4地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0}必须是一个有效的IPv6地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0}必须是一个有效的IP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0}必须是一个有效的无类别域间路由(CIDR)\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0}必须是一个包含IPv4地址的有效无类别域间路由(CIDR)\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0}必须是一个包含IPv6地址的有效无类别域间路由(CIDR)\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0}必须是一个有效的TCP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0}必须是一个有效的IPv4 TCP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0}必须是一个有效的IPv6 TCP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0}必须是一个有效的UDP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0}必须是一个有效的IPv4 UDP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0}必须是一个有效的IPv6 UDP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0}必须是一个有效的IP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0}必须是一个有效的IPv4地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0}必须是一个有效的IPv6地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0}必须是一个有效的UNIX地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0}必须是一个有效的MAC地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0}必须是一个有效的颜色\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0}必须是[{1}]中的一个\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"json\",\n\t\t\ttranslation: \"{0}必须是一个JSON字符串\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"lowercase\",\n\t\t\ttranslation: \"{0}必须是小写字母\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uppercase\",\n\t\t\ttranslation: \"{0}必须是大写字母\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datetime\",\n\t\t\ttranslation: \"{0}的格式必须是{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} 必须是有效图像\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"警告: 翻译字段错误: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/zh/zh_test.go",
    "content": "package zh\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tzhongwen \"github.com/go-playground/locales/zh\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tzh := zhongwen.New()\n\tuni := ut.New(zh, zh)\n\ttrans, _ := uni.GetTranslator(\"zh\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString    string\n\t\tNeCSFieldString    string\n\t\tGtCSFieldString    string\n\t\tGteCSFieldString   string\n\t\tLtCSFieldString    string\n\t\tLteCSFieldString   string\n\t\tRequiredIf         string\n\t\tRequiredUnless     string\n\t\tRequiredWith       string\n\t\tRequiredWithAll    string\n\t\tRequiredWithout    string\n\t\tRequiredWithoutAll string\n\t\tExcludedIf         string\n\t\tExcludedUnless     string\n\t\tExcludedWith       string\n\t\tExcludedWithAll    string\n\t\tExcludedWithout    string\n\t\tExcludedWithoutAll string\n\t}\n\n\ttype Test struct {\n\t\tInner                 Inner\n\t\tRequiredString        string    `validate:\"required\"`\n\t\tRequiredNumber        int       `validate:\"required\"`\n\t\tRequiredMultiple      []string  `validate:\"required\"`\n\t\tRequiredIf            string    `validate:\"required_if=Inner.RequiredIf abcd\"`\n\t\tRequiredUnless        string    `validate:\"required_unless=Inner.RequiredUnless abcd\"`\n\t\tRequiredWith          string    `validate:\"required_with=Inner.RequiredWith\"`\n\t\tRequiredWithAll       string    `validate:\"required_with_all=Inner.RequiredWith Inner.RequiredWithAll\"`\n\t\tRequiredWithout       string    `validate:\"required_without=Inner.RequiredWithout\"`\n\t\tRequiredWithoutAll    string    `validate:\"required_without_all=Inner.RequiredWithout Inner.RequiredWithoutAll\"`\n\t\tExcludedIf            string    `validate:\"excluded_if=Inner.ExcludedIf abcd\"`\n\t\tExcludedUnless        string    `validate:\"excluded_unless=Inner.ExcludedUnless abcd\"`\n\t\tExcludedWith          string    `validate:\"excluded_with=Inner.ExcludedWith\"`\n\t\tExcludedWithout       string    `validate:\"excluded_with_all=Inner.ExcludedWithAll\"`\n\t\tExcludedWithAll       string    `validate:\"excluded_without=Inner.ExcludedWithout\"`\n\t\tExcludedWithoutAll    string    `validate:\"excluded_without_all=Inner.ExcludedWithoutAll\"`\n\t\tIsDefault             string    `validate:\"isdefault\"`\n\t\tLenString             string    `validate:\"len=1\"`\n\t\tLenNumber             float64   `validate:\"len=1113.00\"`\n\t\tLenMultiple           []string  `validate:\"len=7\"`\n\t\tMinString             string    `validate:\"min=1\"`\n\t\tMinNumber             float64   `validate:\"min=1113.00\"`\n\t\tMinMultiple           []string  `validate:\"min=7\"`\n\t\tMaxString             string    `validate:\"max=3\"`\n\t\tMaxNumber             float64   `validate:\"max=1113.00\"`\n\t\tMaxMultiple           []string  `validate:\"max=7\"`\n\t\tEqString              string    `validate:\"eq=3\"`\n\t\tEqNumber              float64   `validate:\"eq=2.33\"`\n\t\tEqMultiple            []string  `validate:\"eq=7\"`\n\t\tNeString              string    `validate:\"ne=\"`\n\t\tNeNumber              float64   `validate:\"ne=0.00\"`\n\t\tNeMultiple            []string  `validate:\"ne=0\"`\n\t\tLtString              string    `validate:\"lt=3\"`\n\t\tLtNumber              float64   `validate:\"lt=5.56\"`\n\t\tLtMultiple            []string  `validate:\"lt=2\"`\n\t\tLtTime                time.Time `validate:\"lt\"`\n\t\tLteString             string    `validate:\"lte=3\"`\n\t\tLteNumber             float64   `validate:\"lte=5.56\"`\n\t\tLteMultiple           []string  `validate:\"lte=2\"`\n\t\tLteTime               time.Time `validate:\"lte\"`\n\t\tGtString              string    `validate:\"gt=3\"`\n\t\tGtNumber              float64   `validate:\"gt=5.56\"`\n\t\tGtMultiple            []string  `validate:\"gt=2\"`\n\t\tGtTime                time.Time `validate:\"gt\"`\n\t\tGteString             string    `validate:\"gte=3\"`\n\t\tGteNumber             float64   `validate:\"gte=5.56\"`\n\t\tGteMultiple           []string  `validate:\"gte=2\"`\n\t\tGteTime               time.Time `validate:\"gte\"`\n\t\tEqFieldString         string    `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString       string    `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString       string    `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString       string    `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString      string    `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString       string    `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString      string    `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString         string    `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString         string    `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString        string    `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString         string    `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString        string    `validate:\"ltefield=MaxString\"`\n\t\tAlphaString           string    `validate:\"alpha\"`\n\t\tAlphanumString        string    `validate:\"alphanum\"`\n\t\tAlphanumUnicodeString string    `validate:\"alphanumunicode\"`\n\t\tAlphaUnicodeString    string    `validate:\"alphaunicode\"`\n\t\tNumericString         string    `validate:\"numeric\"`\n\t\tNumberString          string    `validate:\"number\"`\n\t\tHexadecimalString     string    `validate:\"hexadecimal\"`\n\t\tHexColorString        string    `validate:\"hexcolor\"`\n\t\tRGBColorString        string    `validate:\"rgb\"`\n\t\tRGBAColorString       string    `validate:\"rgba\"`\n\t\tHSLColorString        string    `validate:\"hsl\"`\n\t\tHSLAColorString       string    `validate:\"hsla\"`\n\t\tEmail                 string    `validate:\"email\"`\n\t\tURL                   string    `validate:\"url\"`\n\t\tURI                   string    `validate:\"uri\"`\n\t\tBase64                string    `validate:\"base64\"`\n\t\tContains              string    `validate:\"contains=purpose\"`\n\t\tContainsAny           string    `validate:\"containsany=!@#$\"`\n\t\tContainsRune          string    `validate:\"containsrune=☻\"`\n\t\tExcludes              string    `validate:\"excludes=text\"`\n\t\tExcludesAll           string    `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune          string    `validate:\"excludesrune=☻\"`\n\t\tEndsWith              string    `validate:\"endswith=end\"`\n\t\tStartsWith            string    `validate:\"startswith=start\"`\n\t\tISBN                  string    `validate:\"isbn\"`\n\t\tISBN10                string    `validate:\"isbn10\"`\n\t\tISBN13                string    `validate:\"isbn13\"`\n\t\tISSN                  string    `validate:\"issn\"`\n\t\tUUID                  string    `validate:\"uuid\"`\n\t\tUUID3                 string    `validate:\"uuid3\"`\n\t\tUUID4                 string    `validate:\"uuid4\"`\n\t\tUUID5                 string    `validate:\"uuid5\"`\n\t\tULID                  string    `validate:\"ulid\"`\n\t\tASCII                 string    `validate:\"ascii\"`\n\t\tPrintableASCII        string    `validate:\"printascii\"`\n\t\tMultiByte             string    `validate:\"multibyte\"`\n\t\tDataURI               string    `validate:\"datauri\"`\n\t\tLatitude              string    `validate:\"latitude\"`\n\t\tLongitude             string    `validate:\"longitude\"`\n\t\tSSN                   string    `validate:\"ssn\"`\n\t\tIP                    string    `validate:\"ip\"`\n\t\tIPv4                  string    `validate:\"ipv4\"`\n\t\tIPv6                  string    `validate:\"ipv6\"`\n\t\tCIDR                  string    `validate:\"cidr\"`\n\t\tCIDRv4                string    `validate:\"cidrv4\"`\n\t\tCIDRv6                string    `validate:\"cidrv6\"`\n\t\tTCPAddr               string    `validate:\"tcp_addr\"`\n\t\tTCPAddrv4             string    `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6             string    `validate:\"tcp6_addr\"`\n\t\tUDPAddr               string    `validate:\"udp_addr\"`\n\t\tUDPAddrv4             string    `validate:\"udp4_addr\"`\n\t\tUDPAddrv6             string    `validate:\"udp6_addr\"`\n\t\tIPAddr                string    `validate:\"ip_addr\"`\n\t\tIPAddrv4              string    `validate:\"ip4_addr\"`\n\t\tIPAddrv6              string    `validate:\"ip6_addr\"`\n\t\tUinxAddr              string    `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC                   string    `validate:\"mac\"`\n\t\tIsColor               string    `validate:\"iscolor\"`\n\t\tStrPtrMinLen          *string   `validate:\"min=10\"`\n\t\tStrPtrMaxLen          *string   `validate:\"max=1\"`\n\t\tStrPtrLen             *string   `validate:\"len=2\"`\n\t\tStrPtrLt              *string   `validate:\"lt=1\"`\n\t\tStrPtrLte             *string   `validate:\"lte=1\"`\n\t\tStrPtrGt              *string   `validate:\"gt=10\"`\n\t\tStrPtrGte             *string   `validate:\"gte=10\"`\n\t\tOneOfString           string    `validate:\"oneof=red green\"`\n\t\tOneOfInt              int       `validate:\"oneof=5 63\"`\n\t\tJsonString            string    `validate:\"json\"`\n\t\tLowercaseString       string    `validate:\"lowercase\"`\n\t\tUppercaseString       string    `validate:\"uppercase\"`\n\t\tDatetime              string    `validate:\"datetime=2006-01-02\"`\n\t\tImage                 string    `validate:\"image\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\ttest.Inner.RequiredIf = \"abcd\"\n\ttest.Inner.RequiredUnless = \"1234\"\n\ttest.Inner.RequiredWith = \"1234\"\n\ttest.Inner.RequiredWithAll = \"1234\"\n\ttest.Inner.ExcludedIf = \"abcd\"\n\ttest.Inner.ExcludedUnless = \"1234\"\n\ttest.Inner.ExcludedWith = \"1234\"\n\ttest.Inner.ExcludedWithAll = \"1234\"\n\n\ttest.ExcludedIf = \"1234\"\n\ttest.ExcludedUnless = \"1234\"\n\ttest.ExcludedWith = \"1234\"\n\ttest.ExcludedWithAll = \"1234\"\n\ttest.ExcludedWithout = \"1234\"\n\ttest.ExcludedWithoutAll = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.AlphanumUnicodeString = \"abc3啊!\"\n\ttest.AlphaUnicodeString = \"abc3啊\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.EndsWith = \"this is some test text\"\n\ttest.StartsWith = \"this is some test text\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.JsonString = \"{\\\"foo\\\":\\\"bar\\\",}\"\n\n\ttest.LowercaseString = \"ABCDEFG\"\n\ttest.UppercaseString = \"abcdefg\"\n\n\ttest.Datetime = \"20060102\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor必须是一个有效的颜色\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC必须是一个有效的MAC地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr必须是一个有效的IP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4必须是一个有效的IPv4地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6必须是一个有效的IPv6地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr必须是一个有效的UDP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4必须是一个有效的IPv4 UDP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6必须是一个有效的IPv6 UDP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr必须是一个有效的TCP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4必须是一个有效的IPv4 TCP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6必须是一个有效的IPv6 TCP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR必须是一个有效的无类别域间路由(CIDR)\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4必须是一个包含IPv4地址的有效无类别域间路由(CIDR)\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6必须是一个包含IPv6地址的有效无类别域间路由(CIDR)\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN必须是一个有效的社会安全号码(SSN)\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP必须是一个有效的IP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4必须是一个有效的IPv4地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6必须是一个有效的IPv6地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI必须包含有效的数据URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude必须包含有效的纬度坐标\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude必须包含有效的经度坐标\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte必须包含多字节字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII必须只包含ascii字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII必须只包含可打印的ascii字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID必须是一个有效的UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3必须是一个有效的V3 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4必须是一个有效的V4 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5必须是一个有效的V5 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID必须是一个有效的ULID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN必须是一个有效的ISBN编号\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10必须是一个有效的ISBN-10编号\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13必须是一个有效的ISBN-13编号\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN必须是一个有效的ISSN编号\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EndsWith\",\n\t\t\texpected: \"EndsWith必须以文本'end'结尾\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StartsWith\",\n\t\t\texpected: \"StartsWith必须以文本'start'开头\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes不能包含文本'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll不能包含以下任何字符'!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune不能包含'☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsRune\",\n\t\t\texpected: \"ContainsRune必须包含字符'☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny必须包含至少一个以下字符'!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains必须包含文本'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64必须是一个有效的Base64字符串\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email必须是一个有效的邮箱\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL必须是一个有效的URL\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI必须是一个有效的URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString必须是一个有效的RGB颜色\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString必须是一个有效的RGBA颜色\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString必须是一个有效的HSL颜色\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString必须是一个有效的HSLA颜色\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString必须是一个有效的十六进制\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString必须是一个有效的十六进制颜色\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString必须是一个有效的数字\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString必须是一个有效的数值\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaUnicodeString\",\n\t\t\texpected: \"AlphaUnicodeString只能包含字母和Unicode字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumUnicodeString\",\n\t\t\texpected: \"AlphanumUnicodeString只能包含字母数字和Unicode字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString只能包含字母和数字\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString只能包含字母\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString必须小于MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString必须小于或等于MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString必须大于MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString必须大于或等于MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString不能等于EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString必须小于Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString必须小于或等于Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString必须大于Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString必须大于或等于Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString不能等于Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString必须等于Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString必须等于MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString长度必须至少为3个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber必须大于或等于5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple必须至少包含2项\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime必须大于或等于当前日期和时间\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString长度必须大于3个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber必须大于5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple必须大于2项\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime必须大于当前日期和时间\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString长度不能超过3个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber必须小于或等于5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple最多只能包含2项\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime必须小于或等于当前日期和时间\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString长度必须小于3个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber必须小于5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple必须包含少于2项\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime必须小于当前日期和时间\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString不能等于\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber不能等于0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple不能等于0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString不等于3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber不等于2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple不等于7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString长度不能超过3个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber必须小于或等于1,113.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple最多只能包含7项\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString长度必须至少为1个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber最小只能为1,113.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple必须至少包含7项\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString长度必须是1个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber必须等于1,113.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple必须包含7项\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString为必填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber为必填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple为必填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredUnless\",\n\t\t\texpected: \"RequiredUnless为必填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWith\",\n\t\t\texpected: \"RequiredWith为必填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithAll\",\n\t\t\texpected: \"RequiredWithAll为必填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithout\",\n\t\t\texpected: \"RequiredWithout为必填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithoutAll\",\n\t\t\texpected: \"RequiredWithoutAll为必填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedIf\",\n\t\t\texpected: \"ExcludedIf为禁填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedUnless\",\n\t\t\texpected: \"ExcludedUnless为禁填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWith\",\n\t\t\texpected: \"ExcludedWith为禁填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithAll\",\n\t\t\texpected: \"ExcludedWithAll为禁填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithout\",\n\t\t\texpected: \"ExcludedWithout为禁填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithoutAll\",\n\t\t\texpected: \"ExcludedWithoutAll为禁填字段\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen长度必须至少为10个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen长度不能超过1个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen长度必须是2个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt长度必须小于1个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte长度不能超过1个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt长度必须大于10个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte长度必须至少为10个字符\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString必须是[red green]中的一个\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt必须是[5 63]中的一个\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.JsonString\",\n\t\t\texpected: \"JsonString必须是一个JSON字符串\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LowercaseString\",\n\t\t\texpected: \"LowercaseString必须是小写字母\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UppercaseString\",\n\t\t\texpected: \"UppercaseString必须是大写字母\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"Datetime的格式必须是2006-01-02\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image 必须是有效图像\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations/zh_tw/zh_tw.go",
    "content": "package zh_tw\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-playground/locales\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\n// RegisterDefaultTranslations registers a set of default translations\n// for all built in tag's in validator; you may add your own as desired.\nfunc RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (err error) {\n\ttranslations := []struct {\n\t\ttag             string\n\t\ttranslation     string\n\t\toverride        bool\n\t\tcustomRegisFunc validator.RegisterTranslationsFunc\n\t\tcustomTransFunc validator.TranslationFunc\n\t}{\n\t\t{\n\t\t\ttag:         \"required\",\n\t\t\ttranslation: \"{0}為必填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_if\",\n\t\t\ttranslation: \"{0}為必填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_unless\",\n\t\t\ttranslation: \"{0}為必填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with\",\n\t\t\ttranslation: \"{0}為必填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_with_all\",\n\t\t\ttranslation: \"{0}為必填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without\",\n\t\t\ttranslation: \"{0}為必填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"required_without_all\",\n\t\t\ttranslation: \"{0}為必填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_if\",\n\t\t\ttranslation: \"{0}為禁填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_unless\",\n\t\t\ttranslation: \"{0}為禁填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with\",\n\t\t\ttranslation: \"{0}為禁填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_with_all\",\n\t\t\ttranslation: \"{0}為禁填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without\",\n\t\t\ttranslation: \"{0}為禁填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"excluded_without_all\",\n\t\t\ttranslation: \"{0}為禁填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isdefault\",\n\t\t\ttranslation: \"{0}為禁填欄位\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag: \"len\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"len-string\", \"{0}長度必須為{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"len-string-character\", \"{0}字元\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-string-character\", \"{0}個字元\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-number\", \"{0}必須等於{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"len-items\", \"{0}必須包含{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t//if err = ut.AddCardinal(\"len-items-item\", \"{0}項\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"len-items-item\", \"{0}項\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"len-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"len-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"len-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻譯欄位錯誤: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"min\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"min-string\", \"{0}長度必須至少為{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"min-string-character\", \"{0}個字元\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-string-character\", \"{0}個字元\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-number\", \"{0}最小只能為{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"min-items\", \"{0}必須至少包含{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t//if err = ut.AddCardinal(\"min-items-item\", \"{0}項\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"min-items-item\", \"{0}項\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"min-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"min-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"min-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻譯欄位錯誤: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"max\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"max-string\", \"{0}長度不能超過{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"max-string-character\", \"{0}個字元\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-string-character\", \"{0}個字元\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-number\", \"{0}必須小於或等於{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"max-items\", \"{0}最多只能包含{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t//if err = ut.AddCardinal(\"max-items-item\", \"{0}項\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"max-items-item\", \"{0}項\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t}\n\n\t\t\t\tf64, err := strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tgoto END\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\tc, err = ut.C(\"max-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"max-items\", fe.Field(), c)\n\n\t\t\t\tdefault:\n\t\t\t\t\tt, err = ut.T(\"max-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻譯欄位錯誤: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eq\",\n\t\t\ttranslation: \"{0}不等於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ne\",\n\t\t\ttranslation: \"{0}不能等於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lt-string\", \"{0}長度必須小於{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"lt-string-character\", \"{0}個字元\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-string-character\", \"{0}個字元\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-number\", \"{0}必須小於{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-items\", \"{0}必須包含少於{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"lt-items-item\", \"{0}項\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"lt-items-item\", \"{0}項\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lt-datetime\", \"{0}必須小於目前日期和時間\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s'不能用於struct類型.\", fe.Tag())\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt, err = ut.T(\"lt-datetime\", fe.Field())\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻譯欄位錯誤: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"lte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"lte-string\", \"{0}長度不能超過{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"lte-string-character\", \"{0} character\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-string-character\", \"{0}個字元\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-number\", \"{0}必須小於或等於{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-items\", \"{0}最多只能包含{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"lte-items-item\", \"{0} item\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"lte-items-item\", \"{0}項\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"lte-datetime\", \"{0}必須小於或等於目前日期和時間\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"lte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s'不能用於struct類型.\", fe.Tag())\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt, err = ut.T(\"lte-datetime\", fe.Field())\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"lte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻譯欄位錯誤: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gt\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gt-string\", \"{0}長度必須大於{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"gt-string-character\", \"{0}個字元\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-string-character\", \"{0}個字元\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-number\", \"{0}必須大於{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-items\", \"{0}必須大於{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"gt-items-item\", \"{0}項\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"gt-items-item\", \"{0}項\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gt-datetime\", \"{0}必須大於目前日期和時間\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gt-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s'不能用於struct類型.\", fe.Tag())\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt, err = ut.T(\"gt-datetime\", fe.Field())\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gt-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻譯欄位錯誤: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag: \"gte\",\n\t\t\tcustomRegisFunc: func(ut ut.Translator) (err error) {\n\t\t\t\tif err = ut.Add(\"gte-string\", \"{0}長度必須至少為{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"gte-string-character\", \"{0}個字元\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-string-character\", \"{0}個字元\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-number\", \"{0}必須大於或等於{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-items\", \"{0}必須至少包含{1}\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t//if err = ut.AddCardinal(\"gte-items-item\", \"{0}項\", locales.PluralRuleOne, false); err != nil {\n\t\t\t\t//\treturn\n\t\t\t\t//}\n\n\t\t\t\tif err = ut.AddCardinal(\"gte-items-item\", \"{0}項\", locales.PluralRuleOther, false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif err = ut.Add(\"gte-datetime\", \"{0}必須大於或等於目前日期和時間\", false); err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\treturn\n\t\t\t},\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tvar err error\n\t\t\t\tvar t string\n\t\t\t\tvar f64 float64\n\t\t\t\tvar digits uint64\n\t\t\t\tvar kind reflect.Kind\n\n\t\t\t\tfn := func() (err error) {\n\t\t\t\t\tif idx := strings.Index(fe.Param(), \".\"); idx != -1 {\n\t\t\t\t\t\tdigits = uint64(len(fe.Param()[idx+1:]))\n\t\t\t\t\t}\n\n\t\t\t\t\tf64, err = strconv.ParseFloat(fe.Param(), 64)\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tkind = fe.Kind()\n\t\t\t\tif kind == reflect.Ptr {\n\t\t\t\t\tkind = fe.Type().Elem().Kind()\n\t\t\t\t}\n\n\t\t\t\tswitch kind {\n\t\t\t\tcase reflect.String:\n\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-string-character\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-string\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Slice, reflect.Map, reflect.Array:\n\t\t\t\t\tvar c string\n\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tc, err = ut.C(\"gte-items-item\", f64, digits, ut.FmtNumber(f64, digits))\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-items\", fe.Field(), c)\n\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\tif fe.Type() != reflect.TypeOf(time.Time{}) {\n\t\t\t\t\t\terr = fmt.Errorf(\"tag '%s'不能用於struct類型.\", fe.Tag())\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt, err = ut.T(\"gte-datetime\", fe.Field())\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terr = fn()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tgoto END\n\t\t\t\t\t}\n\n\t\t\t\t\tt, err = ut.T(\"gte-number\", fe.Field(), ut.FmtNumber(f64, digits))\n\t\t\t\t}\n\n\t\t\tEND:\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"警告: 翻譯欄位錯誤: %s\", err)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqfield\",\n\t\t\ttranslation: \"{0}必須等於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"eqcsfield\",\n\t\t\ttranslation: \"{0}必須等於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"necsfield\",\n\t\t\ttranslation: \"{0}不能等於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtcsfield\",\n\t\t\ttranslation: \"{0}必須大於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtecsfield\",\n\t\t\ttranslation: \"{0}必須大於或等於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltcsfield\",\n\t\t\ttranslation: \"{0}必須小於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltecsfield\",\n\t\t\ttranslation: \"{0}必須小於或等於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"nefield\",\n\t\t\ttranslation: \"{0}不能等於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtfield\",\n\t\t\ttranslation: \"{0}必須大於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"gtefield\",\n\t\t\ttranslation: \"{0}必須大於或等於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltfield\",\n\t\t\ttranslation: \"{0}必須小於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"ltefield\",\n\t\t\ttranslation: \"{0}必須小於或等於{1}\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"alpha\",\n\t\t\ttranslation: \"{0}只能包含字母\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"alphanum\",\n\t\t\ttranslation: \"{0}只能包含字母和數字\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"numeric\",\n\t\t\ttranslation: \"{0}必須是一個有效的數值\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"number\",\n\t\t\ttranslation: \"{0}必須是一個有效的數字\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexadecimal\",\n\t\t\ttranslation: \"{0}必須是一個有效的十六進制\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hexcolor\",\n\t\t\ttranslation: \"{0}必須是一個有效的十六進制顏色\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgb\",\n\t\t\ttranslation: \"{0}必須是一個有效的RGB顏色\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"rgba\",\n\t\t\ttranslation: \"{0}必須是一個有效的RGBA顏色\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsl\",\n\t\t\ttranslation: \"{0}必須是一個有效的HSL顏色\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"hsla\",\n\t\t\ttranslation: \"{0}必須是一個有效的HSLA顏色\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"email\",\n\t\t\ttranslation: \"{0}必須是一個有效的信箱\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"url\",\n\t\t\ttranslation: \"{0}必須是一個有效的URL\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uri\",\n\t\t\ttranslation: \"{0}必須是一個有效的URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"base64\",\n\t\t\ttranslation: \"{0}必須是一個有效的Base64字元串\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"contains\",\n\t\t\ttranslation: \"{0}必須包含文字'{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"containsany\",\n\t\t\ttranslation: \"{0}必須包含至少一個以下字元'{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludes\",\n\t\t\ttranslation: \"{0}不能包含文字'{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesall\",\n\t\t\ttranslation: \"{0}不能包含以下任何字元'{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"excludesrune\",\n\t\t\ttranslation: \"{0}不能包含'{1}'\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn\",\n\t\t\ttranslation: \"{0}必須是一個有效的ISBN編號\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn10\",\n\t\t\ttranslation: \"{0}必須是一個有效的ISBN-10編號\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"isbn13\",\n\t\t\ttranslation: \"{0}必須是一個有效的ISBN-13編號\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"issn\",\n\t\t\ttranslation: \"{0}必須是一個有效的ISSN編號\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid\",\n\t\t\ttranslation: \"{0}必須是一個有效的UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid3\",\n\t\t\ttranslation: \"{0}必須是一個有效的V3 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid4\",\n\t\t\ttranslation: \"{0}必須是一個有效的V4 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"uuid5\",\n\t\t\ttranslation: \"{0}必須是一個有效的V5 UUID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ulid\",\n\t\t\ttranslation: \"{0}必須是一個有效的ULID\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ascii\",\n\t\t\ttranslation: \"{0}必須只包含ascii字元\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"printascii\",\n\t\t\ttranslation: \"{0}必須只包含可輸出的ascii字元\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"multibyte\",\n\t\t\ttranslation: \"{0}必須包含多個字元\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"datauri\",\n\t\t\ttranslation: \"{0}必須包含有效的數據URI\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"latitude\",\n\t\t\ttranslation: \"{0}必須包含有效的緯度座標\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"longitude\",\n\t\t\ttranslation: \"{0}必須包含有效的經度座標\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ssn\",\n\t\t\ttranslation: \"{0}必須是一個有效的社會安全編號(SSN)\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv4\",\n\t\t\ttranslation: \"{0}必須是一個有效的IPv4地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ipv6\",\n\t\t\ttranslation: \"{0}必須是一個有效的IPv6地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip\",\n\t\t\ttranslation: \"{0}必須是一個有效的IP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidr\",\n\t\t\ttranslation: \"{0}必須是一個有效的無類別域間路由(CIDR)\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv4\",\n\t\t\ttranslation: \"{0}必須是一个包含IPv4地址的有效無類別域間路由(CIDR)\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"cidrv6\",\n\t\t\ttranslation: \"{0}必須是一个包含IPv6地址的有效無類別域間路由(CIDR)\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp_addr\",\n\t\t\ttranslation: \"{0}必須是一個有效的TCP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp4_addr\",\n\t\t\ttranslation: \"{0}必須是一個有效的IPv4 TCP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"tcp6_addr\",\n\t\t\ttranslation: \"{0}必須是一個有效的IPv6 TCP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp_addr\",\n\t\t\ttranslation: \"{0}必須是一個有效的UDP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp4_addr\",\n\t\t\ttranslation: \"{0}必須是一個有效的IPv4 UDP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"udp6_addr\",\n\t\t\ttranslation: \"{0}必須是一個有效的IPv6 UDP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip_addr\",\n\t\t\ttranslation: \"{0}必須是一個有效的IP地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip4_addr\",\n\t\t\ttranslation: \"{0}必須是一個有效的IPv4地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"ip6_addr\",\n\t\t\ttranslation: \"{0}必須是一個有效的IPv6地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"unix_addr\",\n\t\t\ttranslation: \"{0}必須是一個有效的UNIX地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"mac\",\n\t\t\ttranslation: \"{0}必須是一個有效的MAC地址\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"iscolor\",\n\t\t\ttranslation: \"{0}必須是一個有效的顏色\",\n\t\t\toverride:    false,\n\t\t},\n\t\t{\n\t\t\ttag:         \"oneof\",\n\t\t\ttranslation: \"{0}必須是[{1}]中的一個\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\ts, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\t\t\t\treturn s\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"datetime\",\n\t\t\ttranslation: \"{0}與{1}格式不匹配\",\n\t\t\toverride:    false,\n\t\t\tcustomTransFunc: func(ut ut.Translator, fe validator.FieldError) string {\n\t\t\t\tt, err := ut.T(fe.Tag(), fe.Field(), fe.Param())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\t\t\t\treturn fe.(error).Error()\n\t\t\t\t}\n\n\t\t\t\treturn t\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttag:         \"image\",\n\t\t\ttranslation: \"{0} 必須是有效圖像\",\n\t\t\toverride:    false,\n\t\t},\n\t}\n\n\tfor _, t := range translations {\n\t\tif t.customTransFunc != nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, t.customTransFunc)\n\t\t} else if t.customTransFunc != nil && t.customRegisFunc == nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), t.customTransFunc)\n\t\t} else if t.customTransFunc == nil && t.customRegisFunc != nil {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, t.customRegisFunc, translateFunc)\n\t\t} else {\n\t\t\terr = v.RegisterTranslation(t.tag, trans, registrationFunc(t.tag, t.translation, t.override), translateFunc)\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc registrationFunc(tag string, translation string, override bool) validator.RegisterTranslationsFunc {\n\treturn func(ut ut.Translator) (err error) {\n\t\tif err = ut.Add(tag, translation, override); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc translateFunc(ut ut.Translator, fe validator.FieldError) string {\n\tt, err := ut.T(fe.Tag(), fe.Field())\n\tif err != nil {\n\t\tlog.Printf(\"警告: 翻譯欄位錯誤: %#v\", fe)\n\t\treturn fe.(error).Error()\n\t}\n\n\treturn t\n}\n"
  },
  {
    "path": "translations/zh_tw/zh_tw_test.go",
    "content": "package zh_tw\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\tzhongwen \"github.com/go-playground/locales/zh_Hant_TW\"\n\tut \"github.com/go-playground/universal-translator\"\n\t\"github.com/go-playground/validator/v10\"\n)\n\nfunc TestTranslations(t *testing.T) {\n\tzh := zhongwen.New()\n\tuni := ut.New(zh, zh)\n\ttrans, _ := uni.GetTranslator(\"zh\")\n\n\tvalidate := validator.New()\n\n\terr := RegisterDefaultTranslations(validate, trans)\n\tEqual(t, err, nil)\n\n\ttype Inner struct {\n\t\tEqCSFieldString    string\n\t\tNeCSFieldString    string\n\t\tGtCSFieldString    string\n\t\tGteCSFieldString   string\n\t\tLtCSFieldString    string\n\t\tLteCSFieldString   string\n\t\tRequiredIf         string\n\t\tRequiredUnless     string\n\t\tRequiredWith       string\n\t\tRequiredWithAll    string\n\t\tRequiredWithout    string\n\t\tRequiredWithoutAll string\n\t\tExcludedIf         string\n\t\tExcludedUnless     string\n\t\tExcludedWith       string\n\t\tExcludedWithAll    string\n\t\tExcludedWithout    string\n\t\tExcludedWithoutAll string\n\t}\n\n\ttype Test struct {\n\t\tInner              Inner\n\t\tRequiredString     string    `validate:\"required\"`\n\t\tRequiredNumber     int       `validate:\"required\"`\n\t\tRequiredMultiple   []string  `validate:\"required\"`\n\t\tRequiredIf         string    `validate:\"required_if=Inner.RequiredIf abcd\"`\n\t\tRequiredUnless     string    `validate:\"required_unless=Inner.RequiredUnless abcd\"`\n\t\tRequiredWith       string    `validate:\"required_with=Inner.RequiredWith\"`\n\t\tRequiredWithAll    string    `validate:\"required_with_all=Inner.RequiredWith Inner.RequiredWithAll\"`\n\t\tRequiredWithout    string    `validate:\"required_without=Inner.RequiredWithout\"`\n\t\tRequiredWithoutAll string    `validate:\"required_without_all=Inner.RequiredWithout Inner.RequiredWithoutAll\"`\n\t\tExcludedIf         string    `validate:\"excluded_if=Inner.ExcludedIf abcd\"`\n\t\tExcludedUnless     string    `validate:\"excluded_unless=Inner.ExcludedUnless abcd\"`\n\t\tExcludedWith       string    `validate:\"excluded_with=Inner.ExcludedWith\"`\n\t\tExcludedWithout    string    `validate:\"excluded_with_all=Inner.ExcludedWithAll\"`\n\t\tExcludedWithAll    string    `validate:\"excluded_without=Inner.ExcludedWithout\"`\n\t\tExcludedWithoutAll string    `validate:\"excluded_without_all=Inner.ExcludedWithoutAll\"`\n\t\tIsDefault          string    `validate:\"isdefault\"`\n\t\tLenString          string    `validate:\"len=1\"`\n\t\tLenNumber          float64   `validate:\"len=1113.00\"`\n\t\tLenMultiple        []string  `validate:\"len=7\"`\n\t\tMinString          string    `validate:\"min=1\"`\n\t\tMinNumber          float64   `validate:\"min=1113.00\"`\n\t\tMinMultiple        []string  `validate:\"min=7\"`\n\t\tMaxString          string    `validate:\"max=3\"`\n\t\tMaxNumber          float64   `validate:\"max=1113.00\"`\n\t\tMaxMultiple        []string  `validate:\"max=7\"`\n\t\tEqString           string    `validate:\"eq=3\"`\n\t\tEqNumber           float64   `validate:\"eq=2.33\"`\n\t\tEqMultiple         []string  `validate:\"eq=7\"`\n\t\tNeString           string    `validate:\"ne=\"`\n\t\tNeNumber           float64   `validate:\"ne=0.00\"`\n\t\tNeMultiple         []string  `validate:\"ne=0\"`\n\t\tLtString           string    `validate:\"lt=3\"`\n\t\tLtNumber           float64   `validate:\"lt=5.56\"`\n\t\tLtMultiple         []string  `validate:\"lt=2\"`\n\t\tLtTime             time.Time `validate:\"lt\"`\n\t\tLteString          string    `validate:\"lte=3\"`\n\t\tLteNumber          float64   `validate:\"lte=5.56\"`\n\t\tLteMultiple        []string  `validate:\"lte=2\"`\n\t\tLteTime            time.Time `validate:\"lte\"`\n\t\tGtString           string    `validate:\"gt=3\"`\n\t\tGtNumber           float64   `validate:\"gt=5.56\"`\n\t\tGtMultiple         []string  `validate:\"gt=2\"`\n\t\tGtTime             time.Time `validate:\"gt\"`\n\t\tGteString          string    `validate:\"gte=3\"`\n\t\tGteNumber          float64   `validate:\"gte=5.56\"`\n\t\tGteMultiple        []string  `validate:\"gte=2\"`\n\t\tGteTime            time.Time `validate:\"gte\"`\n\t\tEqFieldString      string    `validate:\"eqfield=MaxString\"`\n\t\tEqCSFieldString    string    `validate:\"eqcsfield=Inner.EqCSFieldString\"`\n\t\tNeCSFieldString    string    `validate:\"necsfield=Inner.NeCSFieldString\"`\n\t\tGtCSFieldString    string    `validate:\"gtcsfield=Inner.GtCSFieldString\"`\n\t\tGteCSFieldString   string    `validate:\"gtecsfield=Inner.GteCSFieldString\"`\n\t\tLtCSFieldString    string    `validate:\"ltcsfield=Inner.LtCSFieldString\"`\n\t\tLteCSFieldString   string    `validate:\"ltecsfield=Inner.LteCSFieldString\"`\n\t\tNeFieldString      string    `validate:\"nefield=EqFieldString\"`\n\t\tGtFieldString      string    `validate:\"gtfield=MaxString\"`\n\t\tGteFieldString     string    `validate:\"gtefield=MaxString\"`\n\t\tLtFieldString      string    `validate:\"ltfield=MaxString\"`\n\t\tLteFieldString     string    `validate:\"ltefield=MaxString\"`\n\t\tAlphaString        string    `validate:\"alpha\"`\n\t\tAlphanumString     string    `validate:\"alphanum\"`\n\t\tNumericString      string    `validate:\"numeric\"`\n\t\tNumberString       string    `validate:\"number\"`\n\t\tHexadecimalString  string    `validate:\"hexadecimal\"`\n\t\tHexColorString     string    `validate:\"hexcolor\"`\n\t\tRGBColorString     string    `validate:\"rgb\"`\n\t\tRGBAColorString    string    `validate:\"rgba\"`\n\t\tHSLColorString     string    `validate:\"hsl\"`\n\t\tHSLAColorString    string    `validate:\"hsla\"`\n\t\tEmail              string    `validate:\"email\"`\n\t\tURL                string    `validate:\"url\"`\n\t\tURI                string    `validate:\"uri\"`\n\t\tBase64             string    `validate:\"base64\"`\n\t\tContains           string    `validate:\"contains=purpose\"`\n\t\tContainsAny        string    `validate:\"containsany=!@#$\"`\n\t\tExcludes           string    `validate:\"excludes=text\"`\n\t\tExcludesAll        string    `validate:\"excludesall=!@#$\"`\n\t\tExcludesRune       string    `validate:\"excludesrune=☻\"`\n\t\tISBN               string    `validate:\"isbn\"`\n\t\tISBN10             string    `validate:\"isbn10\"`\n\t\tISBN13             string    `validate:\"isbn13\"`\n\t\tISSN               string    `validate:\"issn\"`\n\t\tUUID               string    `validate:\"uuid\"`\n\t\tUUID3              string    `validate:\"uuid3\"`\n\t\tUUID4              string    `validate:\"uuid4\"`\n\t\tUUID5              string    `validate:\"uuid5\"`\n\t\tULID               string    `validate:\"ulid\"`\n\t\tASCII              string    `validate:\"ascii\"`\n\t\tPrintableASCII     string    `validate:\"printascii\"`\n\t\tMultiByte          string    `validate:\"multibyte\"`\n\t\tDataURI            string    `validate:\"datauri\"`\n\t\tLatitude           string    `validate:\"latitude\"`\n\t\tLongitude          string    `validate:\"longitude\"`\n\t\tSSN                string    `validate:\"ssn\"`\n\t\tIP                 string    `validate:\"ip\"`\n\t\tIPv4               string    `validate:\"ipv4\"`\n\t\tIPv6               string    `validate:\"ipv6\"`\n\t\tCIDR               string    `validate:\"cidr\"`\n\t\tCIDRv4             string    `validate:\"cidrv4\"`\n\t\tCIDRv6             string    `validate:\"cidrv6\"`\n\t\tTCPAddr            string    `validate:\"tcp_addr\"`\n\t\tTCPAddrv4          string    `validate:\"tcp4_addr\"`\n\t\tTCPAddrv6          string    `validate:\"tcp6_addr\"`\n\t\tUDPAddr            string    `validate:\"udp_addr\"`\n\t\tUDPAddrv4          string    `validate:\"udp4_addr\"`\n\t\tUDPAddrv6          string    `validate:\"udp6_addr\"`\n\t\tIPAddr             string    `validate:\"ip_addr\"`\n\t\tIPAddrv4           string    `validate:\"ip4_addr\"`\n\t\tIPAddrv6           string    `validate:\"ip6_addr\"`\n\t\tUinxAddr           string    `validate:\"unix_addr\"` // can't fail from within Go's net package currently, but maybe in the future\n\t\tMAC                string    `validate:\"mac\"`\n\t\tIsColor            string    `validate:\"iscolor\"`\n\t\tStrPtrMinLen       *string   `validate:\"min=10\"`\n\t\tStrPtrMaxLen       *string   `validate:\"max=1\"`\n\t\tStrPtrLen          *string   `validate:\"len=2\"`\n\t\tStrPtrLt           *string   `validate:\"lt=1\"`\n\t\tStrPtrLte          *string   `validate:\"lte=1\"`\n\t\tStrPtrGt           *string   `validate:\"gt=10\"`\n\t\tStrPtrGte          *string   `validate:\"gte=10\"`\n\t\tOneOfString        string    `validate:\"oneof=red green\"`\n\t\tOneOfInt           int       `validate:\"oneof=5 63\"`\n\t\tDatetime           string    `validate:\"datetime=2006-01-02\"`\n\t\tImage              string    `validate:\"image\"`\n\t}\n\n\tvar test Test\n\n\ttest.Inner.EqCSFieldString = \"1234\"\n\ttest.Inner.GtCSFieldString = \"1234\"\n\ttest.Inner.GteCSFieldString = \"1234\"\n\ttest.Inner.RequiredIf = \"abcd\"\n\ttest.Inner.RequiredUnless = \"1234\"\n\ttest.Inner.RequiredWith = \"1234\"\n\ttest.Inner.RequiredWithAll = \"1234\"\n\ttest.Inner.ExcludedIf = \"abcd\"\n\ttest.Inner.ExcludedUnless = \"1234\"\n\ttest.Inner.ExcludedWith = \"1234\"\n\ttest.Inner.ExcludedWithAll = \"1234\"\n\n\ttest.ExcludedIf = \"1234\"\n\ttest.ExcludedUnless = \"1234\"\n\ttest.ExcludedWith = \"1234\"\n\ttest.ExcludedWithAll = \"1234\"\n\ttest.ExcludedWithout = \"1234\"\n\ttest.ExcludedWithoutAll = \"1234\"\n\n\ttest.MaxString = \"1234\"\n\ttest.MaxNumber = 2000\n\ttest.MaxMultiple = make([]string, 9)\n\n\ttest.LtString = \"1234\"\n\ttest.LtNumber = 6\n\ttest.LtMultiple = make([]string, 3)\n\ttest.LtTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LteString = \"1234\"\n\ttest.LteNumber = 6\n\ttest.LteMultiple = make([]string, 3)\n\ttest.LteTime = time.Now().Add(time.Hour * 24)\n\n\ttest.LtFieldString = \"12345\"\n\ttest.LteFieldString = \"12345\"\n\n\ttest.LtCSFieldString = \"1234\"\n\ttest.LteCSFieldString = \"1234\"\n\n\ttest.AlphaString = \"abc3\"\n\ttest.AlphanumString = \"abc3!\"\n\ttest.NumericString = \"12E.00\"\n\ttest.NumberString = \"12E\"\n\n\ttest.Excludes = \"this is some test text\"\n\ttest.ExcludesAll = \"This is Great!\"\n\ttest.ExcludesRune = \"Love it ☻\"\n\n\ttest.ASCII = \"ｶﾀｶﾅ\"\n\ttest.PrintableASCII = \"ｶﾀｶﾅ\"\n\n\ttest.MultiByte = \"1234feerf\"\n\n\ts := \"toolong\"\n\ttest.StrPtrMaxLen = &s\n\ttest.StrPtrLen = &s\n\n\ttest.Datetime = \"2008-Feb-01\"\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(validator.ValidationErrors)\n\tEqual(t, ok, true)\n\n\ttests := []struct {\n\t\tns       string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tns:       \"Test.IsColor\",\n\t\t\texpected: \"IsColor必須是一個有效的顏色\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MAC\",\n\t\t\texpected: \"MAC必須是一個有效的MAC地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddr\",\n\t\t\texpected: \"IPAddr必須是一個有效的IP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv4\",\n\t\t\texpected: \"IPAddrv4必須是一個有效的IPv4地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPAddrv6\",\n\t\t\texpected: \"IPAddrv6必須是一個有效的IPv6地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddr\",\n\t\t\texpected: \"UDPAddr必須是一個有效的UDP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv4\",\n\t\t\texpected: \"UDPAddrv4必須是一個有效的IPv4 UDP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UDPAddrv6\",\n\t\t\texpected: \"UDPAddrv6必須是一個有效的IPv6 UDP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddr\",\n\t\t\texpected: \"TCPAddr必須是一個有效的TCP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv4\",\n\t\t\texpected: \"TCPAddrv4必須是一個有效的IPv4 TCP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.TCPAddrv6\",\n\t\t\texpected: \"TCPAddrv6必須是一個有效的IPv6 TCP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDR\",\n\t\t\texpected: \"CIDR必須是一個有效的無類別域間路由(CIDR)\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv4\",\n\t\t\texpected: \"CIDRv4必須是一个包含IPv4地址的有效無類別域間路由(CIDR)\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.CIDRv6\",\n\t\t\texpected: \"CIDRv6必須是一个包含IPv6地址的有效無類別域間路由(CIDR)\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.SSN\",\n\t\t\texpected: \"SSN必須是一個有效的社會安全編號(SSN)\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IP\",\n\t\t\texpected: \"IP必須是一個有效的IP地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv4\",\n\t\t\texpected: \"IPv4必須是一個有效的IPv4地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.IPv6\",\n\t\t\texpected: \"IPv6必須是一個有效的IPv6地址\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.DataURI\",\n\t\t\texpected: \"DataURI必須包含有效的數據URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Latitude\",\n\t\t\texpected: \"Latitude必須包含有效的緯度座標\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Longitude\",\n\t\t\texpected: \"Longitude必須包含有效的經度座標\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MultiByte\",\n\t\t\texpected: \"MultiByte必須包含多個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ASCII\",\n\t\t\texpected: \"ASCII必須只包含ascii字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.PrintableASCII\",\n\t\t\texpected: \"PrintableASCII必須只包含可輸出的ascii字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID\",\n\t\t\texpected: \"UUID必須是一個有效的UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID3\",\n\t\t\texpected: \"UUID3必須是一個有效的V3 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID4\",\n\t\t\texpected: \"UUID4必須是一個有效的V4 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.UUID5\",\n\t\t\texpected: \"UUID5必須是一個有效的V5 UUID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ULID\",\n\t\t\texpected: \"ULID必須是一個有效的ULID\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN\",\n\t\t\texpected: \"ISBN必須是一個有效的ISBN編號\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN10\",\n\t\t\texpected: \"ISBN10必須是一個有效的ISBN-10編號\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISBN13\",\n\t\t\texpected: \"ISBN13必須是一個有效的ISBN-13編號\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ISSN\",\n\t\t\texpected: \"ISSN必須是一個有效的ISSN編號\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Excludes\",\n\t\t\texpected: \"Excludes不能包含文字'text'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesAll\",\n\t\t\texpected: \"ExcludesAll不能包含以下任何字元'!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludesRune\",\n\t\t\texpected: \"ExcludesRune不能包含'☻'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ContainsAny\",\n\t\t\texpected: \"ContainsAny必須包含至少一個以下字元'!@#$'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Contains\",\n\t\t\texpected: \"Contains必須包含文字'purpose'\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Base64\",\n\t\t\texpected: \"Base64必須是一個有效的Base64字元串\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Email\",\n\t\t\texpected: \"Email必須是一個有效的信箱\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URL\",\n\t\t\texpected: \"URL必須是一個有效的URL\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.URI\",\n\t\t\texpected: \"URI必須是一個有效的URI\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBColorString\",\n\t\t\texpected: \"RGBColorString必須是一個有效的RGB顏色\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RGBAColorString\",\n\t\t\texpected: \"RGBAColorString必須是一個有效的RGBA顏色\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLColorString\",\n\t\t\texpected: \"HSLColorString必須是一個有效的HSL顏色\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HSLAColorString\",\n\t\t\texpected: \"HSLAColorString必須是一個有效的HSLA顏色\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexadecimalString\",\n\t\t\texpected: \"HexadecimalString必須是一個有效的十六進制\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.HexColorString\",\n\t\t\texpected: \"HexColorString必須是一個有效的十六進制顏色\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumberString\",\n\t\t\texpected: \"NumberString必須是一個有效的數字\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NumericString\",\n\t\t\texpected: \"NumericString必須是一個有效的數值\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphanumString\",\n\t\t\texpected: \"AlphanumString只能包含字母和數字\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.AlphaString\",\n\t\t\texpected: \"AlphaString只能包含字母\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtFieldString\",\n\t\t\texpected: \"LtFieldString必須小於MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteFieldString\",\n\t\t\texpected: \"LteFieldString必須小於或等於MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtFieldString\",\n\t\t\texpected: \"GtFieldString必須大於MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteFieldString\",\n\t\t\texpected: \"GteFieldString必須大於或等於MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeFieldString\",\n\t\t\texpected: \"NeFieldString不能等於EqFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtCSFieldString\",\n\t\t\texpected: \"LtCSFieldString必須小於Inner.LtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteCSFieldString\",\n\t\t\texpected: \"LteCSFieldString必須小於或等於Inner.LteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtCSFieldString\",\n\t\t\texpected: \"GtCSFieldString必須大於Inner.GtCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteCSFieldString\",\n\t\t\texpected: \"GteCSFieldString必須大於或等於Inner.GteCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeCSFieldString\",\n\t\t\texpected: \"NeCSFieldString不能等於Inner.NeCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqCSFieldString\",\n\t\t\texpected: \"EqCSFieldString必須等於Inner.EqCSFieldString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqFieldString\",\n\t\t\texpected: \"EqFieldString必須等於MaxString\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteString\",\n\t\t\texpected: \"GteString長度必須至少為3個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteNumber\",\n\t\t\texpected: \"GteNumber必須大於或等於5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteMultiple\",\n\t\t\texpected: \"GteMultiple必須至少包含2項\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GteTime\",\n\t\t\texpected: \"GteTime必須大於或等於目前日期和時間\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtString\",\n\t\t\texpected: \"GtString長度必須大於3個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtNumber\",\n\t\t\texpected: \"GtNumber必須大於5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtMultiple\",\n\t\t\texpected: \"GtMultiple必須大於2項\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.GtTime\",\n\t\t\texpected: \"GtTime必須大於目前日期和時間\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteString\",\n\t\t\texpected: \"LteString長度不能超過3個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteNumber\",\n\t\t\texpected: \"LteNumber必須小於或等於5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteMultiple\",\n\t\t\texpected: \"LteMultiple最多只能包含2項\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LteTime\",\n\t\t\texpected: \"LteTime必須小於或等於目前日期和時間\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtString\",\n\t\t\texpected: \"LtString長度必須小於3個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtNumber\",\n\t\t\texpected: \"LtNumber必須小於5.56\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtMultiple\",\n\t\t\texpected: \"LtMultiple必須包含少於2項\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LtTime\",\n\t\t\texpected: \"LtTime必須小於目前日期和時間\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeString\",\n\t\t\texpected: \"NeString不能等於\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeNumber\",\n\t\t\texpected: \"NeNumber不能等於0.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.NeMultiple\",\n\t\t\texpected: \"NeMultiple不能等於0\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqString\",\n\t\t\texpected: \"EqString不等於3\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqNumber\",\n\t\t\texpected: \"EqNumber不等於2.33\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.EqMultiple\",\n\t\t\texpected: \"EqMultiple不等於7\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxString\",\n\t\t\texpected: \"MaxString長度不能超過3個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxNumber\",\n\t\t\texpected: \"MaxNumber必須小於或等於1,113.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MaxMultiple\",\n\t\t\texpected: \"MaxMultiple最多只能包含7項\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinString\",\n\t\t\texpected: \"MinString長度必須至少為1個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinNumber\",\n\t\t\texpected: \"MinNumber最小只能為1,113.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.MinMultiple\",\n\t\t\texpected: \"MinMultiple必須至少包含7項\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenString\",\n\t\t\texpected: \"LenString長度必須為1個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenNumber\",\n\t\t\texpected: \"LenNumber必須等於1,113.00\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.LenMultiple\",\n\t\t\texpected: \"LenMultiple必須包含7項\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredString\",\n\t\t\texpected: \"RequiredString為必填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredNumber\",\n\t\t\texpected: \"RequiredNumber為必填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredMultiple\",\n\t\t\texpected: \"RequiredMultiple為必填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredUnless\",\n\t\t\texpected: \"RequiredUnless為必填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWith\",\n\t\t\texpected: \"RequiredWith為必填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithAll\",\n\t\t\texpected: \"RequiredWithAll為必填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithout\",\n\t\t\texpected: \"RequiredWithout為必填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.RequiredWithoutAll\",\n\t\t\texpected: \"RequiredWithoutAll為必填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedIf\",\n\t\t\texpected: \"ExcludedIf為禁填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedUnless\",\n\t\t\texpected: \"ExcludedUnless為禁填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWith\",\n\t\t\texpected: \"ExcludedWith為禁填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithAll\",\n\t\t\texpected: \"ExcludedWithAll為禁填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithout\",\n\t\t\texpected: \"ExcludedWithout為禁填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.ExcludedWithoutAll\",\n\t\t\texpected: \"ExcludedWithoutAll為禁填欄位\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMinLen\",\n\t\t\texpected: \"StrPtrMinLen長度必須至少為10個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrMaxLen\",\n\t\t\texpected: \"StrPtrMaxLen長度不能超過1個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLen\",\n\t\t\texpected: \"StrPtrLen長度必須為2個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLt\",\n\t\t\texpected: \"StrPtrLt長度必須小於1個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrLte\",\n\t\t\texpected: \"StrPtrLte長度不能超過1個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGt\",\n\t\t\texpected: \"StrPtrGt長度必須大於10個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.StrPtrGte\",\n\t\t\texpected: \"StrPtrGte長度必須至少為10個字元\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfString\",\n\t\t\texpected: \"OneOfString必須是[red green]中的一個\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.OneOfInt\",\n\t\t\texpected: \"OneOfInt必須是[5 63]中的一個\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Datetime\",\n\t\t\texpected: \"Datetime與2006-01-02格式不匹配\",\n\t\t},\n\t\t{\n\t\t\tns:       \"Test.Image\",\n\t\t\texpected: \"Image 必須是有效圖像\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tvar fe validator.FieldError\n\n\t\tfor _, e := range errs {\n\t\t\tif tt.ns == e.Namespace() {\n\t\t\t\tfe = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tNotEqual(t, fe, nil)\n\t\tEqual(t, tt.expected, fe.Translate(trans))\n\t}\n}\n"
  },
  {
    "path": "translations.go",
    "content": "package validator\n\nimport ut \"github.com/go-playground/universal-translator\"\n\n// TranslationFunc is the function type used to register or override\n// custom translations\ntype TranslationFunc func(ut ut.Translator, fe FieldError) string\n\n// RegisterTranslationsFunc allows for registering of translations\n// for a 'ut.Translator' for use within the 'TranslationFunc'\ntype RegisterTranslationsFunc func(ut ut.Translator) error\n"
  },
  {
    "path": "util.go",
    "content": "package validator\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// Valuer is an interface that allows you to expose a method on a type\n// (including generic types) that returns a value that is supposed to be validated.\ntype Valuer interface {\n\t// ValidatorValue returns the value that is supposed to be validated.\n\tValidatorValue() any\n}\n\n// extractTypeInternal gets the actual underlying type of field value.\n// It will dive into pointers, customTypes and return you the\n// underlying value and it's kind.\nfunc (v *validate) extractTypeInternal(current reflect.Value, nullable bool) (reflect.Value, reflect.Kind, bool) {\nBEGIN:\n\tswitch current.Kind() {\n\tcase reflect.Ptr:\n\n\t\tnullable = true\n\n\t\tif current.IsNil() {\n\t\t\treturn current, reflect.Ptr, nullable\n\t\t}\n\n\t\tif current.CanInterface() {\n\t\t\tif v, ok := current.Interface().(Valuer); ok {\n\t\t\t\tcurrent = reflect.ValueOf(v.ValidatorValue())\n\t\t\t\tgoto BEGIN\n\t\t\t}\n\t\t}\n\n\t\tcurrent = current.Elem()\n\t\tgoto BEGIN\n\n\tcase reflect.Interface:\n\n\t\tnullable = true\n\n\t\tif current.IsNil() {\n\t\t\treturn current, reflect.Interface, nullable\n\t\t}\n\n\t\tif current.CanInterface() {\n\t\t\tif v, ok := current.Interface().(Valuer); ok {\n\t\t\t\tcurrent = reflect.ValueOf(v.ValidatorValue())\n\t\t\t\tgoto BEGIN\n\t\t\t}\n\t\t}\n\n\t\tcurrent = current.Elem()\n\t\tgoto BEGIN\n\n\tcase reflect.Invalid:\n\t\treturn current, reflect.Invalid, nullable\n\n\tdefault:\n\n\t\tif current.CanInterface() {\n\t\t\tif v, ok := current.Interface().(Valuer); ok {\n\t\t\t\tcurrent = reflect.ValueOf(v.ValidatorValue())\n\t\t\t\tgoto BEGIN\n\t\t\t}\n\t\t}\n\n\t\tif v.v.hasCustomFuncs {\n\t\t\tif fn, ok := v.v.customFuncs[current.Type()]; ok {\n\t\t\t\tcurrent = reflect.ValueOf(fn(current))\n\t\t\t\tgoto BEGIN\n\t\t\t}\n\t\t}\n\n\t\treturn current, current.Kind(), nullable\n\t}\n}\n\n// getStructFieldOKInternal traverses a struct to retrieve a specific field denoted by the provided namespace and\n// returns the field, field kind and whether is was successful in retrieving the field at all.\n//\n// NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field\n// could not be retrieved because it didn't exist.\nfunc (v *validate) getStructFieldOKInternal(val reflect.Value, namespace string) (current reflect.Value, kind reflect.Kind, nullable bool, found bool) {\nBEGIN:\n\tcurrent, kind, nullable = v.ExtractType(val)\n\tif kind == reflect.Invalid {\n\t\treturn\n\t}\n\n\tif namespace == \"\" {\n\t\tfound = true\n\t\treturn\n\t}\n\n\tswitch kind {\n\tcase reflect.Ptr, reflect.Interface:\n\t\treturn\n\n\tcase reflect.Struct:\n\n\t\ttyp := current.Type()\n\t\tfld := namespace\n\t\tvar ns string\n\n\t\tif !typ.ConvertibleTo(timeType) {\n\t\t\tidx := strings.Index(namespace, namespaceSeparator)\n\n\t\t\tif idx != -1 {\n\t\t\t\tfld = namespace[:idx]\n\t\t\t\tns = namespace[idx+1:]\n\t\t\t} else {\n\t\t\t\tns = \"\"\n\t\t\t}\n\n\t\t\tbracketIdx := strings.Index(fld, leftBracket)\n\t\t\tif bracketIdx != -1 {\n\t\t\t\tfld = fld[:bracketIdx]\n\n\t\t\t\tns = namespace[bracketIdx:]\n\t\t\t}\n\n\t\t\tval = current.FieldByName(fld)\n\t\t\tnamespace = ns\n\t\t\tgoto BEGIN\n\t\t}\n\n\tcase reflect.Array, reflect.Slice:\n\t\tidx := strings.Index(namespace, leftBracket)\n\t\tidx2 := strings.Index(namespace, rightBracket)\n\n\t\tarrIdx, _ := strconv.Atoi(namespace[idx+1 : idx2])\n\n\t\tif arrIdx >= current.Len() {\n\t\t\treturn\n\t\t}\n\n\t\tstartIdx := idx2 + 1\n\n\t\tif startIdx < len(namespace) {\n\t\t\tif namespace[startIdx:startIdx+1] == namespaceSeparator {\n\t\t\t\tstartIdx++\n\t\t\t}\n\t\t}\n\n\t\tval = current.Index(arrIdx)\n\t\tnamespace = namespace[startIdx:]\n\t\tgoto BEGIN\n\n\tcase reflect.Map:\n\t\tidx := strings.Index(namespace, leftBracket) + 1\n\t\tidx2 := strings.Index(namespace, rightBracket)\n\n\t\tendIdx := idx2\n\n\t\tif endIdx+1 < len(namespace) {\n\t\t\tif namespace[endIdx+1:endIdx+2] == namespaceSeparator {\n\t\t\t\tendIdx++\n\t\t\t}\n\t\t}\n\n\t\tkey := namespace[idx:idx2]\n\n\t\tswitch current.Type().Key().Kind() {\n\t\tcase reflect.Int:\n\t\t\ti, _ := strconv.Atoi(key)\n\t\t\tval = current.MapIndex(reflect.ValueOf(i))\n\t\t\tnamespace = namespace[endIdx+1:]\n\n\t\tcase reflect.Int8:\n\t\t\ti, _ := strconv.ParseInt(key, 10, 8)\n\t\t\tval = current.MapIndex(reflect.ValueOf(int8(i)))\n\t\t\tnamespace = namespace[endIdx+1:]\n\n\t\tcase reflect.Int16:\n\t\t\ti, _ := strconv.ParseInt(key, 10, 16)\n\t\t\tval = current.MapIndex(reflect.ValueOf(int16(i)))\n\t\t\tnamespace = namespace[endIdx+1:]\n\n\t\tcase reflect.Int32:\n\t\t\ti, _ := strconv.ParseInt(key, 10, 32)\n\t\t\tval = current.MapIndex(reflect.ValueOf(int32(i)))\n\t\t\tnamespace = namespace[endIdx+1:]\n\n\t\tcase reflect.Int64:\n\t\t\ti, _ := strconv.ParseInt(key, 10, 64)\n\t\t\tval = current.MapIndex(reflect.ValueOf(i))\n\t\t\tnamespace = namespace[endIdx+1:]\n\n\t\tcase reflect.Uint:\n\t\t\ti, _ := strconv.ParseUint(key, 10, 0)\n\t\t\tval = current.MapIndex(reflect.ValueOf(uint(i)))\n\t\t\tnamespace = namespace[endIdx+1:]\n\n\t\tcase reflect.Uint8:\n\t\t\ti, _ := strconv.ParseUint(key, 10, 8)\n\t\t\tval = current.MapIndex(reflect.ValueOf(uint8(i)))\n\t\t\tnamespace = namespace[endIdx+1:]\n\n\t\tcase reflect.Uint16:\n\t\t\ti, _ := strconv.ParseUint(key, 10, 16)\n\t\t\tval = current.MapIndex(reflect.ValueOf(uint16(i)))\n\t\t\tnamespace = namespace[endIdx+1:]\n\n\t\tcase reflect.Uint32:\n\t\t\ti, _ := strconv.ParseUint(key, 10, 32)\n\t\t\tval = current.MapIndex(reflect.ValueOf(uint32(i)))\n\t\t\tnamespace = namespace[endIdx+1:]\n\n\t\tcase reflect.Uint64:\n\t\t\ti, _ := strconv.ParseUint(key, 10, 64)\n\t\t\tval = current.MapIndex(reflect.ValueOf(i))\n\t\t\tnamespace = namespace[endIdx+1:]\n\n\t\tcase reflect.Float32:\n\t\t\tf, _ := strconv.ParseFloat(key, 32)\n\t\t\tval = current.MapIndex(reflect.ValueOf(float32(f)))\n\t\t\tnamespace = namespace[endIdx+1:]\n\n\t\tcase reflect.Float64:\n\t\t\tf, _ := strconv.ParseFloat(key, 64)\n\t\t\tval = current.MapIndex(reflect.ValueOf(f))\n\t\t\tnamespace = namespace[endIdx+1:]\n\n\t\tcase reflect.Bool:\n\t\t\tb, _ := strconv.ParseBool(key)\n\t\t\tval = current.MapIndex(reflect.ValueOf(b))\n\t\t\tnamespace = namespace[endIdx+1:]\n\n\t\t// reflect.Type = string\n\t\tdefault:\n\t\t\tval = current.MapIndex(reflect.ValueOf(key))\n\t\t\tnamespace = namespace[endIdx+1:]\n\t\t}\n\n\t\tgoto BEGIN\n\t}\n\n\t// if got here there was more namespace, cannot go any deeper\n\t// return found=false instead of panicking to handle cases like ValidateMap\n\t// where cross-field validators (required_if, etc.) can't navigate non-struct parents\n\treturn\n}\n\n// asInt returns the parameter as an int64\n// or panics if it can't convert\nfunc asInt(param string) int64 {\n\ti, err := strconv.ParseInt(param, 0, 64)\n\tpanicIf(err)\n\n\treturn i\n}\n\n// asIntFromTimeDuration parses param as time.Duration and returns it as int64\n// or panics on error.\nfunc asIntFromTimeDuration(param string) int64 {\n\td, err := time.ParseDuration(param)\n\tif err != nil {\n\t\t// attempt parsing as an integer assuming nanosecond precision\n\t\treturn asInt(param)\n\t}\n\treturn int64(d)\n}\n\n// asIntFromType calls the proper function to parse param as int64,\n// given a field's Type t.\nfunc asIntFromType(t reflect.Type, param string) int64 {\n\tswitch t {\n\tcase timeDurationType:\n\t\treturn asIntFromTimeDuration(param)\n\tdefault:\n\t\treturn asInt(param)\n\t}\n}\n\n// asUint returns the parameter as a uint64\n// or panics if it can't convert\nfunc asUint(param string) uint64 {\n\ti, err := strconv.ParseUint(param, 0, 64)\n\tpanicIf(err)\n\n\treturn i\n}\n\n// asFloat64 returns the parameter as a float64\n// or panics if it can't convert\nfunc asFloat64(param string) float64 {\n\ti, err := strconv.ParseFloat(param, 64)\n\tpanicIf(err)\n\treturn i\n}\n\n// asFloat32 returns the parameter as a float32\n// or panics if it can't convert\nfunc asFloat32(param string) float64 {\n\ti, err := strconv.ParseFloat(param, 32)\n\tpanicIf(err)\n\treturn i\n}\n\n// asBool returns the parameter as a bool\n// or panics if it can't convert\nfunc asBool(param string) bool {\n\ti, err := strconv.ParseBool(param)\n\tpanicIf(err)\n\n\treturn i\n}\n\nfunc panicIf(err error) {\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// Checks if field value matches regex. If fl.Field can be cast to Stringer, it uses the Stringer interfaces\n// String() return value. Otherwise, it uses fl.Field's String() value.\nfunc fieldMatchesRegexByStringerValOrString(regexFn func() *regexp.Regexp, fl FieldLevel) bool {\n\tregex := regexFn()\n\tswitch fl.Field().Kind() {\n\tcase reflect.String:\n\t\treturn regex.MatchString(fl.Field().String())\n\tdefault:\n\t\tif stringer, ok := getValue(fl.Field()).(fmt.Stringer); ok {\n\t\t\treturn regex.MatchString(stringer.String())\n\t\t} else {\n\t\t\treturn regex.MatchString(fl.Field().String())\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "validator.go",
    "content": "package validator\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"unsafe\"\n)\n\n// per validate construct\ntype validate struct {\n\tv              *Validate\n\ttop            reflect.Value\n\tns             []byte\n\tactualNs       []byte\n\terrs           ValidationErrors\n\tincludeExclude map[string]struct{} // reset only if StructPartial or StructExcept are called, no need otherwise\n\tffn            FilterFunc\n\tslflParent     reflect.Value // StructLevel & FieldLevel\n\tslCurrent      reflect.Value // StructLevel & FieldLevel\n\tflField        reflect.Value // StructLevel & FieldLevel\n\tcf             *cField       // StructLevel & FieldLevel\n\tct             *cTag         // StructLevel & FieldLevel\n\tmisc           []byte        // misc reusable\n\tstr1           string        // misc reusable\n\tstr2           string        // misc reusable\n\tfldIsPointer   bool          // StructLevel & FieldLevel\n\tisPartial      bool\n\thasExcludes    bool\n}\n\n// parent and current will be the same the first run of validateStruct\nfunc (v *validate) validateStruct(ctx context.Context, parent reflect.Value, current reflect.Value, typ reflect.Type, ns []byte, structNs []byte, ct *cTag) {\n\tcs, ok := v.v.structCache.Get(typ)\n\tif !ok {\n\t\tcs = v.v.extractStructCache(current, typ.Name())\n\t}\n\n\tif len(ns) == 0 && len(cs.name) != 0 {\n\t\tns = append(ns, cs.name...)\n\t\tns = append(ns, '.')\n\n\t\tstructNs = append(structNs, cs.name...)\n\t\tstructNs = append(structNs, '.')\n\t}\n\n\t// ct is nil on top level struct, and structs as fields that have no tag info\n\t// so if nil or if not nil and the structonly tag isn't present\n\tif ct == nil || ct.typeof != typeStructOnly {\n\t\tvar f *cField\n\n\t\tfor i := 0; i < len(cs.fields); i++ {\n\t\t\tf = cs.fields[i]\n\n\t\t\tif v.isPartial {\n\t\t\t\tif v.ffn != nil {\n\t\t\t\t\t// used with StructFiltered\n\t\t\t\t\tif v.ffn(append(structNs, f.name...)) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// used with StructPartial & StructExcept\n\t\t\t\t\t_, ok = v.includeExclude[string(append(structNs, f.name...))]\n\n\t\t\t\t\tif (ok && v.hasExcludes) || (!ok && !v.hasExcludes) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tv.traverseField(ctx, current, current.Field(f.idx), ns, structNs, f, f.cTags)\n\t\t}\n\t}\n\n\t// check if any struct level validations, after all field validations already checked.\n\t// first iteration will have no info about nostructlevel tag, and is checked prior to\n\t// calling the next iteration of validateStruct called from traverseField.\n\tif cs.fn != nil {\n\t\tv.slflParent = parent\n\t\tv.slCurrent = current\n\t\tv.ns = ns\n\t\tv.actualNs = structNs\n\n\t\tcs.fn(ctx, v)\n\t}\n}\n\n// 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\nfunc (v *validate) traverseField(ctx context.Context, parent reflect.Value, current reflect.Value, ns []byte, structNs []byte, cf *cField, ct *cTag) {\n\tvar typ reflect.Type\n\tvar kind reflect.Kind\n\n\tcurrent, kind, v.fldIsPointer = v.extractTypeInternal(current, false)\n\n\tvar isNestedStruct bool\n\n\tswitch kind {\n\tcase reflect.Ptr, reflect.Interface, reflect.Invalid:\n\n\t\tif ct == nil {\n\t\t\treturn\n\t\t}\n\n\t\tif ct.typeof == typeOmitEmpty || ct.typeof == typeIsDefault {\n\t\t\treturn\n\t\t}\n\n\t\tif ct.typeof == typeOmitNil && (kind != reflect.Invalid && current.IsNil()) {\n\t\t\treturn\n\t\t}\n\n\t\tif ct.typeof == typeOmitZero {\n\t\t\treturn\n\t\t}\n\n\t\tif ct.hasTag {\n\t\t\tif kind == reflect.Invalid {\n\t\t\t\tv.str1 = string(append(ns, cf.altName...))\n\t\t\t\tif v.v.hasTagNameFunc {\n\t\t\t\t\tv.str2 = string(append(structNs, cf.name...))\n\t\t\t\t} else {\n\t\t\t\t\tv.str2 = v.str1\n\t\t\t\t}\n\t\t\t\tv.errs = append(v.errs,\n\t\t\t\t\t&fieldError{\n\t\t\t\t\t\tv:              v.v,\n\t\t\t\t\t\ttag:            ct.aliasTag,\n\t\t\t\t\t\tactualTag:      ct.tag,\n\t\t\t\t\t\tns:             v.str1,\n\t\t\t\t\t\tstructNs:       v.str2,\n\t\t\t\t\t\tfieldLen:       uint8(len(cf.altName)),\n\t\t\t\t\t\tstructfieldLen: uint8(len(cf.name)),\n\t\t\t\t\t\tparam:          ct.param,\n\t\t\t\t\t\tkind:           kind,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tv.str1 = string(append(ns, cf.altName...))\n\t\t\tif v.v.hasTagNameFunc {\n\t\t\t\tv.str2 = string(append(structNs, cf.name...))\n\t\t\t} else {\n\t\t\t\tv.str2 = v.str1\n\t\t\t}\n\t\t\tif !ct.runValidationWhenNil {\n\t\t\t\tv.errs = append(v.errs,\n\t\t\t\t\t&fieldError{\n\t\t\t\t\t\tv:              v.v,\n\t\t\t\t\t\ttag:            ct.aliasTag,\n\t\t\t\t\t\tactualTag:      ct.tag,\n\t\t\t\t\t\tns:             v.str1,\n\t\t\t\t\t\tstructNs:       v.str2,\n\t\t\t\t\t\tfieldLen:       uint8(len(cf.altName)),\n\t\t\t\t\t\tstructfieldLen: uint8(len(cf.name)),\n\t\t\t\t\t\tvalue:          getValue(current),\n\t\t\t\t\t\tparam:          ct.param,\n\t\t\t\t\t\tkind:           kind,\n\t\t\t\t\t\ttyp:            current.Type(),\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif kind == reflect.Invalid {\n\t\t\treturn\n\t\t}\n\n\tcase reflect.Struct:\n\t\tisNestedStruct = !current.Type().ConvertibleTo(timeType)\n\t\t// For backward compatibility before struct level validation tags were supported\n\t\t// as there were a number of projects relying on `required` not failing on non-pointer\n\t\t// structs. Since it's basically nonsensical to use `required` with a non-pointer struct\n\t\t// are explicitly skipping the required validation for it. This WILL be removed in the\n\t\t// next major version.\n\t\tif isNestedStruct && !v.v.requiredStructEnabled && ct != nil && ct.tag == requiredTag {\n\t\t\tct = ct.next\n\t\t}\n\t}\n\n\ttyp = current.Type()\n\nOUTER:\n\tfor {\n\t\tif ct == nil || !ct.hasTag || (isNestedStruct && len(cf.name) == 0) {\n\t\t\t// isNestedStruct check here\n\t\t\tif isNestedStruct {\n\t\t\t\t// if len == 0 then validating using 'Var' or 'VarWithValue'\n\t\t\t\t// Var - doesn't make much sense to do it that way, should call 'Struct', but no harm...\n\t\t\t\t// VarWithField - this allows for validating against each field within the struct against a specific value\n\t\t\t\t//                pretty handy in certain situations\n\t\t\t\tif len(cf.name) > 0 {\n\t\t\t\t\tns = append(append(ns, cf.altName...), '.')\n\t\t\t\t\tstructNs = append(append(structNs, cf.name...), '.')\n\t\t\t\t}\n\n\t\t\t\tv.validateStruct(ctx, parent, current, typ, ns, structNs, ct)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tswitch ct.typeof {\n\t\tcase typeNoStructLevel:\n\t\t\treturn\n\n\t\tcase typeStructOnly:\n\t\t\tif isNestedStruct {\n\t\t\t\t// if len == 0 then validating using 'Var' or 'VarWithValue'\n\t\t\t\t// Var - doesn't make much sense to do it that way, should call 'Struct', but no harm...\n\t\t\t\t// VarWithField - this allows for validating against each field within the struct against a specific value\n\t\t\t\t//                pretty handy in certain situations\n\t\t\t\tif len(cf.name) > 0 {\n\t\t\t\t\tns = append(append(ns, cf.altName...), '.')\n\t\t\t\t\tstructNs = append(append(structNs, cf.name...), '.')\n\t\t\t\t}\n\n\t\t\t\tv.validateStruct(ctx, parent, current, typ, ns, structNs, ct)\n\t\t\t}\n\t\t\treturn\n\n\t\tcase typeOmitEmpty:\n\n\t\t\t// set Field Level fields\n\t\t\tv.slflParent = parent\n\t\t\tv.flField = current\n\t\t\tv.cf = cf\n\t\t\tv.ct = ct\n\n\t\t\tif !hasValue(v) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tct = ct.next\n\t\t\tcontinue\n\n\t\tcase typeOmitZero:\n\t\t\tv.slflParent = parent\n\t\t\tv.flField = current\n\t\t\tv.cf = cf\n\t\t\tv.ct = ct\n\n\t\t\tif !hasNotZeroValue(v) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tct = ct.next\n\t\t\tcontinue\n\n\t\tcase typeOmitNil:\n\t\t\tv.slflParent = parent\n\t\t\tv.flField = current\n\t\t\tv.cf = cf\n\t\t\tv.ct = ct\n\n\t\t\tswitch field := v.Field(); field.Kind() {\n\t\t\tcase reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func:\n\t\t\t\tif field.IsNil() {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tif v.fldIsPointer && getValue(field) == nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tct = ct.next\n\t\t\tcontinue\n\n\t\tcase typeEndKeys:\n\t\t\treturn\n\n\t\tcase typeDive:\n\n\t\t\tct = ct.next\n\n\t\t\t// traverse slice or map here\n\t\t\t// or panic ;)\n\t\t\tswitch kind {\n\t\t\tcase reflect.Slice, reflect.Array:\n\n\t\t\t\tvar i64 int64\n\t\t\t\treusableCF := &cField{}\n\n\t\t\t\tfor i := 0; i < current.Len(); i++ {\n\t\t\t\t\ti64 = int64(i)\n\n\t\t\t\t\tv.misc = append(v.misc[0:0], cf.name...)\n\t\t\t\t\tv.misc = append(v.misc, '[')\n\t\t\t\t\tv.misc = strconv.AppendInt(v.misc, i64, 10)\n\t\t\t\t\tv.misc = append(v.misc, ']')\n\n\t\t\t\t\treusableCF.name = string(v.misc)\n\n\t\t\t\t\tif cf.namesEqual {\n\t\t\t\t\t\treusableCF.altName = reusableCF.name\n\t\t\t\t\t} else {\n\t\t\t\t\t\tv.misc = append(v.misc[0:0], cf.altName...)\n\t\t\t\t\t\tv.misc = append(v.misc, '[')\n\t\t\t\t\t\tv.misc = strconv.AppendInt(v.misc, i64, 10)\n\t\t\t\t\t\tv.misc = append(v.misc, ']')\n\n\t\t\t\t\t\treusableCF.altName = string(v.misc)\n\t\t\t\t\t}\n\t\t\t\t\tv.traverseField(ctx, parent, current.Index(i), ns, structNs, reusableCF, ct)\n\t\t\t\t}\n\n\t\t\tcase reflect.Map:\n\n\t\t\t\tvar pv string\n\t\t\t\treusableCF := &cField{}\n\n\t\t\t\tfor _, key := range current.MapKeys() {\n\t\t\t\t\tpv = fmt.Sprintf(\"%v\", key)\n\n\t\t\t\t\tv.misc = append(v.misc[0:0], cf.name...)\n\t\t\t\t\tv.misc = append(v.misc, '[')\n\t\t\t\t\tv.misc = append(v.misc, pv...)\n\t\t\t\t\tv.misc = append(v.misc, ']')\n\n\t\t\t\t\treusableCF.name = string(v.misc)\n\n\t\t\t\t\tif cf.namesEqual {\n\t\t\t\t\t\treusableCF.altName = reusableCF.name\n\t\t\t\t\t} else {\n\t\t\t\t\t\tv.misc = append(v.misc[0:0], cf.altName...)\n\t\t\t\t\t\tv.misc = append(v.misc, '[')\n\t\t\t\t\t\tv.misc = append(v.misc, pv...)\n\t\t\t\t\t\tv.misc = append(v.misc, ']')\n\n\t\t\t\t\t\treusableCF.altName = string(v.misc)\n\t\t\t\t\t}\n\n\t\t\t\t\tif ct != nil && ct.typeof == typeKeys && ct.keys != nil {\n\t\t\t\t\t\tv.traverseField(ctx, parent, key, ns, structNs, reusableCF, ct.keys)\n\t\t\t\t\t\t// can be nil when just keys being validated\n\t\t\t\t\t\tif ct.next != nil {\n\t\t\t\t\t\t\tv.traverseField(ctx, parent, current.MapIndex(key), ns, structNs, reusableCF, ct.next)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Struct fallback when map values are structs\n\t\t\t\t\t\t\tval := current.MapIndex(key)\n\t\t\t\t\t\t\tswitch val.Kind() {\n\t\t\t\t\t\t\tcase reflect.Ptr:\n\t\t\t\t\t\t\t\tif val.Elem().Kind() == reflect.Struct {\n\t\t\t\t\t\t\t\t\t// Dive into the struct so its own tags run\n\t\t\t\t\t\t\t\t\tv.traverseField(ctx, parent, val, ns, structNs, reusableCF, nil)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase reflect.Struct:\n\t\t\t\t\t\t\t\tv.traverseField(ctx, parent, val, ns, structNs, reusableCF, nil)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tv.traverseField(ctx, parent, current.MapIndex(key), ns, structNs, reusableCF, ct)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\t// throw error, if not a slice or map then should not have gotten here\n\t\t\t\t// bad dive tag\n\t\t\t\tpanic(\"dive error! can't dive on a non slice or map\")\n\t\t\t}\n\n\t\t\treturn\n\n\t\tcase typeOr:\n\n\t\t\tv.misc = v.misc[0:0]\n\n\t\t\tfor {\n\t\t\t\t// set Field Level fields\n\t\t\t\tv.slflParent = parent\n\t\t\t\tv.flField = current\n\t\t\t\tv.cf = cf\n\t\t\t\tv.ct = ct\n\n\t\t\t\tif ct.fn(ctx, v) {\n\t\t\t\t\tif ct.isBlockEnd {\n\t\t\t\t\t\tct = ct.next\n\t\t\t\t\t\tcontinue OUTER\n\t\t\t\t\t}\n\n\t\t\t\t\t// drain rest of the 'or' values, then continue or leave\n\t\t\t\t\tfor {\n\t\t\t\t\t\tct = ct.next\n\n\t\t\t\t\t\tif ct == nil {\n\t\t\t\t\t\t\tcontinue OUTER\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ct.typeof != typeOr {\n\t\t\t\t\t\t\tcontinue OUTER\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ct.isBlockEnd {\n\t\t\t\t\t\t\tct = ct.next\n\t\t\t\t\t\t\tcontinue OUTER\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tv.misc = append(v.misc, '|')\n\t\t\t\tv.misc = append(v.misc, ct.tag...)\n\n\t\t\t\tif ct.hasParam {\n\t\t\t\t\tv.misc = append(v.misc, '=')\n\t\t\t\t\tv.misc = append(v.misc, ct.param...)\n\t\t\t\t}\n\n\t\t\t\tif ct.isBlockEnd || ct.next == nil {\n\t\t\t\t\t// if we get here, no valid 'or' value and no more tags\n\t\t\t\t\tv.str1 = string(append(ns, cf.altName...))\n\n\t\t\t\t\tif v.v.hasTagNameFunc {\n\t\t\t\t\t\tv.str2 = string(append(structNs, cf.name...))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tv.str2 = v.str1\n\t\t\t\t\t}\n\n\t\t\t\t\tif ct.hasAlias {\n\t\t\t\t\t\tv.errs = append(v.errs,\n\t\t\t\t\t\t\t&fieldError{\n\t\t\t\t\t\t\t\tv:              v.v,\n\t\t\t\t\t\t\t\ttag:            ct.aliasTag,\n\t\t\t\t\t\t\t\tactualTag:      ct.actualAliasTag,\n\t\t\t\t\t\t\t\tns:             v.str1,\n\t\t\t\t\t\t\t\tstructNs:       v.str2,\n\t\t\t\t\t\t\t\tfieldLen:       uint8(len(cf.altName)),\n\t\t\t\t\t\t\t\tstructfieldLen: uint8(len(cf.name)),\n\t\t\t\t\t\t\t\tvalue:          getValue(current),\n\t\t\t\t\t\t\t\tparam:          ct.param,\n\t\t\t\t\t\t\t\tkind:           kind,\n\t\t\t\t\t\t\t\ttyp:            typ,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttVal := string(v.misc)[1:]\n\n\t\t\t\t\t\tv.errs = append(v.errs,\n\t\t\t\t\t\t\t&fieldError{\n\t\t\t\t\t\t\t\tv:              v.v,\n\t\t\t\t\t\t\t\ttag:            tVal,\n\t\t\t\t\t\t\t\tactualTag:      tVal,\n\t\t\t\t\t\t\t\tns:             v.str1,\n\t\t\t\t\t\t\t\tstructNs:       v.str2,\n\t\t\t\t\t\t\t\tfieldLen:       uint8(len(cf.altName)),\n\t\t\t\t\t\t\t\tstructfieldLen: uint8(len(cf.name)),\n\t\t\t\t\t\t\t\tvalue:          getValue(current),\n\t\t\t\t\t\t\t\tparam:          ct.param,\n\t\t\t\t\t\t\t\tkind:           kind,\n\t\t\t\t\t\t\t\ttyp:            typ,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tct = ct.next\n\t\t\t}\n\n\t\tdefault:\n\n\t\t\t// set Field Level fields\n\t\t\tv.slflParent = parent\n\t\t\tv.flField = current\n\t\t\tv.cf = cf\n\t\t\tv.ct = ct\n\n\t\t\tif !ct.fn(ctx, v) {\n\t\t\t\tv.str1 = string(append(ns, cf.altName...))\n\n\t\t\t\tif v.v.hasTagNameFunc {\n\t\t\t\t\tv.str2 = string(append(structNs, cf.name...))\n\t\t\t\t} else {\n\t\t\t\t\tv.str2 = v.str1\n\t\t\t\t}\n\n\t\t\t\tv.errs = append(v.errs,\n\t\t\t\t\t&fieldError{\n\t\t\t\t\t\tv:              v.v,\n\t\t\t\t\t\ttag:            ct.aliasTag,\n\t\t\t\t\t\tactualTag:      ct.tag,\n\t\t\t\t\t\tns:             v.str1,\n\t\t\t\t\t\tstructNs:       v.str2,\n\t\t\t\t\t\tfieldLen:       uint8(len(cf.altName)),\n\t\t\t\t\t\tstructfieldLen: uint8(len(cf.name)),\n\t\t\t\t\t\tvalue:          getValue(current),\n\t\t\t\t\t\tparam:          ct.param,\n\t\t\t\t\t\tkind:           kind,\n\t\t\t\t\t\ttyp:            typ,\n\t\t\t\t\t},\n\t\t\t\t)\n\n\t\t\t\treturn\n\t\t\t}\n\t\t\tct = ct.next\n\t\t}\n\t}\n}\n\nfunc getValue(val reflect.Value) interface{} {\n\tif val.CanInterface() {\n\t\treturn val.Interface()\n\t}\n\n\tif val.CanAddr() {\n\t\treturn reflect.NewAt(val.Type(), unsafe.Pointer(val.UnsafeAddr())).Elem().Interface()\n\t}\n\n\tswitch val.Kind() {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn val.Int()\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\treturn val.Uint()\n\tcase reflect.Complex64, reflect.Complex128:\n\t\treturn val.Complex()\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn val.Float()\n\tdefault:\n\t\treturn val.String()\n\t}\n}\n"
  },
  {
    "path": "validator_instance.go",
    "content": "package validator\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\tut \"github.com/go-playground/universal-translator\"\n)\n\nconst (\n\tdefaultTagName        = \"validate\"\n\tutf8HexComma          = \"0x2C\"\n\tutf8Pipe              = \"0x7C\"\n\ttagSeparator          = \",\"\n\torSeparator           = \"|\"\n\ttagKeySeparator       = \"=\"\n\tstructOnlyTag         = \"structonly\"\n\tnoStructLevelTag      = \"nostructlevel\"\n\tomitzero              = \"omitzero\"\n\tomitempty             = \"omitempty\"\n\tomitnil               = \"omitnil\"\n\tisdefault             = \"isdefault\"\n\trequiredWithoutAllTag = \"required_without_all\"\n\trequiredWithoutTag    = \"required_without\"\n\trequiredWithTag       = \"required_with\"\n\trequiredWithAllTag    = \"required_with_all\"\n\trequiredIfTag         = \"required_if\"\n\trequiredUnlessTag     = \"required_unless\"\n\tskipUnlessTag         = \"skip_unless\"\n\texcludedWithoutAllTag = \"excluded_without_all\"\n\texcludedWithoutTag    = \"excluded_without\"\n\texcludedWithTag       = \"excluded_with\"\n\texcludedWithAllTag    = \"excluded_with_all\"\n\texcludedIfTag         = \"excluded_if\"\n\texcludedUnlessTag     = \"excluded_unless\"\n\tskipValidationTag     = \"-\"\n\tdiveTag               = \"dive\"\n\tkeysTag               = \"keys\"\n\tendKeysTag            = \"endkeys\"\n\trequiredTag           = \"required\"\n\tnamespaceSeparator    = \".\"\n\tleftBracket           = \"[\"\n\trightBracket          = \"]\"\n\trestrictedTagChars    = \".[],|=+()`~!@#$%^&*\\\\\\\"/?<>{}\"\n\trestrictedAliasErr    = \"Alias '%s' either contains restricted characters or is the same as a restricted tag needed for normal operation\"\n\trestrictedTagErr      = \"Tag '%s' either contains restricted characters or is the same as a restricted tag needed for normal operation\"\n)\n\nvar (\n\ttimeDurationType = reflect.TypeOf(time.Duration(0))\n\ttimeType         = reflect.TypeOf(time.Time{})\n\n\tbyteSliceType = reflect.TypeOf([]byte{})\n\n\tdefaultCField = &cField{namesEqual: true}\n)\n\n// FilterFunc is the type used to filter fields using\n// StructFiltered(...) function.\n// returning true results in the field being filtered/skipped from\n// validation\ntype FilterFunc func(ns []byte) bool\n\n// CustomTypeFunc allows for overriding or adding custom field type handler functions\n// field = field value of the type to return a value to be validated\n// example Valuer from sql drive see https://golang.org/src/database/sql/driver/types.go?s=1210:1293#L29\ntype CustomTypeFunc func(field reflect.Value) interface{}\n\n// TagNameFunc allows for adding of a custom tag name parser\ntype TagNameFunc func(field reflect.StructField) string\n\ntype internalValidationFuncWrapper struct {\n\tfn                 FuncCtx\n\trunValidationOnNil bool\n}\n\n// Validate contains the validator settings and cache\ntype Validate struct {\n\ttagName                string\n\tpool                   *sync.Pool\n\ttagNameFunc            TagNameFunc\n\tstructLevelFuncs       map[reflect.Type]StructLevelFuncCtx\n\tcustomFuncs            map[reflect.Type]CustomTypeFunc\n\taliases                map[string]string\n\tvalidations            map[string]internalValidationFuncWrapper\n\ttransTagFunc           map[ut.Translator]map[string]TranslationFunc // map[<locale>]map[<tag>]TranslationFunc\n\trules                  map[reflect.Type]map[string]string\n\ttagCache               *tagCache\n\tstructCache            *structCache\n\thasCustomFuncs         bool\n\thasTagNameFunc         bool\n\trequiredStructEnabled  bool\n\tprivateFieldValidation bool\n}\n\n// New returns a new instance of 'validate' with sane defaults.\n// Validate is designed to be thread-safe and used as a singleton instance.\n// It caches information about your struct and validations,\n// in essence only parsing your validation tags once per struct type.\n// Using multiple instances neglects the benefit of caching.\nfunc New(options ...Option) *Validate {\n\ttc := new(tagCache)\n\ttc.m.Store(make(map[string]*cTag))\n\n\tsc := new(structCache)\n\tsc.m.Store(make(map[reflect.Type]*cStruct))\n\n\tv := &Validate{\n\t\ttagName:     defaultTagName,\n\t\taliases:     make(map[string]string, len(bakedInAliases)),\n\t\tvalidations: make(map[string]internalValidationFuncWrapper, len(bakedInValidators)),\n\t\ttagCache:    tc,\n\t\tstructCache: sc,\n\t}\n\n\t// must copy alias validators for separate validations to be used in each validator instance\n\tfor k, val := range bakedInAliases {\n\t\tv.RegisterAlias(k, val)\n\t}\n\n\t// must copy validators for separate validations to be used in each instance\n\tfor k, val := range bakedInValidators {\n\t\tswitch k {\n\t\t// these require that even if the value is nil that the validation should run, omitempty still overrides this behaviour\n\t\tcase requiredIfTag, requiredUnlessTag, requiredWithTag, requiredWithAllTag, requiredWithoutTag, requiredWithoutAllTag,\n\t\t\texcludedIfTag, excludedUnlessTag, excludedWithTag, excludedWithAllTag, excludedWithoutTag, excludedWithoutAllTag,\n\t\t\tskipUnlessTag:\n\t\t\t_ = v.registerValidation(k, wrapFunc(val), true, true)\n\t\tdefault:\n\t\t\t// no need to error check here, baked in will always be valid\n\t\t\t_ = v.registerValidation(k, wrapFunc(val), true, false)\n\t\t}\n\t}\n\n\tv.pool = &sync.Pool{\n\t\tNew: func() interface{} {\n\t\t\treturn &validate{\n\t\t\t\tv:        v,\n\t\t\t\tns:       make([]byte, 0, 64),\n\t\t\t\tactualNs: make([]byte, 0, 64),\n\t\t\t\tmisc:     make([]byte, 32),\n\t\t\t}\n\t\t},\n\t}\n\n\tfor _, o := range options {\n\t\to(v)\n\t}\n\treturn v\n}\n\n// SetTagName allows for changing of the default tag name of 'validate'\nfunc (v *Validate) SetTagName(name string) {\n\tv.tagName = name\n}\n\n// ValidateMapCtx validates a map using a map of validation rules and allows passing of contextual\n// validation information via context.Context.\nfunc (v Validate) ValidateMapCtx(ctx context.Context, data map[string]interface{}, rules map[string]interface{}) map[string]interface{} {\n\terrs := make(map[string]interface{})\n\tfor field, rule := range rules {\n\t\tif ruleObj, ok := rule.(map[string]interface{}); ok {\n\t\t\tif dataObj, ok := data[field].(map[string]interface{}); ok {\n\t\t\t\terr := v.ValidateMapCtx(ctx, dataObj, ruleObj)\n\t\t\t\tif len(err) > 0 {\n\t\t\t\t\terrs[field] = err\n\t\t\t\t}\n\t\t\t} else if dataObjs, ok := data[field].([]map[string]interface{}); ok {\n\t\t\t\tfor _, obj := range dataObjs {\n\t\t\t\t\terr := v.ValidateMapCtx(ctx, obj, ruleObj)\n\t\t\t\t\tif len(err) > 0 {\n\t\t\t\t\t\terrs[field] = err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrs[field] = errors.New(\"The field: '\" + field + \"' is not a map to dive\")\n\t\t\t}\n\t\t} else if ruleStr, ok := rule.(string); ok {\n\t\t\terr := v.VarWithKeyCtx(ctx, field, data[field], ruleStr)\n\t\t\tif err != nil {\n\t\t\t\terrs[field] = err\n\t\t\t}\n\t\t}\n\t}\n\treturn errs\n}\n\n// ValidateMap validates map data from a map of tags\nfunc (v *Validate) ValidateMap(data map[string]interface{}, rules map[string]interface{}) map[string]interface{} {\n\treturn v.ValidateMapCtx(context.Background(), data, rules)\n}\n\n// RegisterTagNameFunc registers a function to get alternate names for StructFields.\n//\n// eg. to use the names which have been specified for JSON representations of structs, rather than normal Go field names:\n//\n//\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n//\t    name := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n//\t    // skip if tag key says it should be ignored\n//\t    if name == \"-\" {\n//\t        return \"\"\n//\t    }\n//\t    return name\n//\t})\nfunc (v *Validate) RegisterTagNameFunc(fn TagNameFunc) {\n\tv.tagNameFunc = fn\n\tv.hasTagNameFunc = true\n}\n\n// RegisterValidation adds a validation with the given tag\n//\n// NOTES:\n// - if the key already exists, the previous validation function will be replaced.\n// - this method is not thread-safe it is intended that these all be registered prior to any validation\nfunc (v *Validate) RegisterValidation(tag string, fn Func, callValidationEvenIfNull ...bool) error {\n\treturn v.RegisterValidationCtx(tag, wrapFunc(fn), callValidationEvenIfNull...)\n}\n\n// RegisterValidationCtx does the same as RegisterValidation on accepts a FuncCtx validation\n// allowing context.Context validation support.\nfunc (v *Validate) RegisterValidationCtx(tag string, fn FuncCtx, callValidationEvenIfNull ...bool) error {\n\tvar nilCheckable bool\n\tif len(callValidationEvenIfNull) > 0 {\n\t\tnilCheckable = callValidationEvenIfNull[0]\n\t}\n\treturn v.registerValidation(tag, fn, false, nilCheckable)\n}\n\n// RegisterAlias registers a mapping of a single validation tag that\n// defines a common or complex set of validation(s) to simplify adding validation\n// to structs.\n//\n// NOTE: this function is not thread-safe it is intended that these all be registered prior to any validation\nfunc (v *Validate) RegisterAlias(alias, tags string) {\n\t_, ok := restrictedTags[alias]\n\n\tif ok || strings.ContainsAny(alias, restrictedTagChars) {\n\t\tpanic(fmt.Sprintf(restrictedAliasErr, alias))\n\t}\n\n\tv.aliases[alias] = tags\n}\n\n// RegisterStructValidation registers a StructLevelFunc against a number of types.\n//\n// NOTE:\n// - this method is not thread-safe it is intended that these all be registered prior to any validation\nfunc (v *Validate) RegisterStructValidation(fn StructLevelFunc, types ...interface{}) {\n\tv.RegisterStructValidationCtx(wrapStructLevelFunc(fn), types...)\n}\n\n// RegisterStructValidationCtx registers a StructLevelFuncCtx against a number of types and allows passing\n// of contextual validation information via context.Context.\n//\n// NOTE:\n// - this method is not thread-safe it is intended that these all be registered prior to any validation\nfunc (v *Validate) RegisterStructValidationCtx(fn StructLevelFuncCtx, types ...interface{}) {\n\tif v.structLevelFuncs == nil {\n\t\tv.structLevelFuncs = make(map[reflect.Type]StructLevelFuncCtx)\n\t}\n\n\tfor _, t := range types {\n\t\ttv := reflect.ValueOf(t)\n\t\tif tv.Kind() == reflect.Ptr {\n\t\t\tt = reflect.Indirect(tv).Interface()\n\t\t}\n\n\t\tv.structLevelFuncs[reflect.TypeOf(t)] = fn\n\t}\n}\n\n// RegisterStructValidationMapRules registers validate map rules.\n// Be aware that map validation rules supersede those defined on a/the struct if present.\n//\n// NOTE: this method is not thread-safe it is intended that these all be registered prior to any validation\nfunc (v *Validate) RegisterStructValidationMapRules(rules map[string]string, types ...interface{}) {\n\tif v.rules == nil {\n\t\tv.rules = make(map[reflect.Type]map[string]string)\n\t}\n\n\tdeepCopyRules := make(map[string]string)\n\tfor i, rule := range rules {\n\t\tdeepCopyRules[i] = rule\n\t}\n\n\tfor _, t := range types {\n\t\ttyp := reflect.TypeOf(t)\n\n\t\tif typ.Kind() == reflect.Ptr {\n\t\t\ttyp = typ.Elem()\n\t\t}\n\n\t\tif typ.Kind() != reflect.Struct {\n\t\t\tcontinue\n\t\t}\n\t\tv.rules[typ] = deepCopyRules\n\t}\n}\n\n// RegisterCustomTypeFunc registers a CustomTypeFunc against a number of types\n//\n// NOTE: this method is not thread-safe it is intended that these all be registered prior to any validation\nfunc (v *Validate) RegisterCustomTypeFunc(fn CustomTypeFunc, types ...interface{}) {\n\tif v.customFuncs == nil {\n\t\tv.customFuncs = make(map[reflect.Type]CustomTypeFunc)\n\t}\n\n\tfor _, t := range types {\n\t\tv.customFuncs[reflect.TypeOf(t)] = fn\n\t}\n\n\tv.hasCustomFuncs = true\n}\n\n// RegisterTranslation registers translations against the provided tag.\nfunc (v *Validate) RegisterTranslation(tag string, trans ut.Translator, registerFn RegisterTranslationsFunc, translationFn TranslationFunc) (err error) {\n\tif v.transTagFunc == nil {\n\t\tv.transTagFunc = make(map[ut.Translator]map[string]TranslationFunc)\n\t}\n\n\tif err = registerFn(trans); err != nil {\n\t\treturn\n\t}\n\n\tm, ok := v.transTagFunc[trans]\n\tif !ok {\n\t\tm = make(map[string]TranslationFunc)\n\t\tv.transTagFunc[trans] = m\n\t}\n\n\tm[tag] = translationFn\n\n\treturn\n}\n\n// Struct validates a structs exposed fields, and automatically validates nested structs, unless otherwise specified.\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\nfunc (v *Validate) Struct(s interface{}) error {\n\treturn v.StructCtx(context.Background(), s)\n}\n\n// StructCtx validates a structs exposed fields, and automatically validates nested structs, unless otherwise specified\n// and also allows passing of context.Context for contextual validation information.\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\nfunc (v *Validate) StructCtx(ctx context.Context, s interface{}) (err error) {\n\tval := reflect.ValueOf(s)\n\ttop := val\n\n\tif val.Kind() == reflect.Ptr && !val.IsNil() {\n\t\tval = val.Elem()\n\t}\n\n\tif val.Kind() != reflect.Struct || val.Type().ConvertibleTo(timeType) {\n\t\treturn &InvalidValidationError{Type: reflect.TypeOf(s)}\n\t}\n\n\t// good to validate\n\tvd := v.pool.Get().(*validate)\n\tvd.top = top\n\tvd.isPartial = false\n\t// vd.hasExcludes = false // only need to reset in StructPartial and StructExcept\n\n\tvd.validateStruct(ctx, top, val, val.Type(), vd.ns[0:0], vd.actualNs[0:0], nil)\n\n\tif len(vd.errs) > 0 {\n\t\terr = vd.errs\n\t\tvd.errs = nil\n\t}\n\n\tv.pool.Put(vd)\n\n\treturn\n}\n\n// StructFiltered validates a structs exposed fields, that pass the FilterFunc check and automatically validates\n// nested structs, unless otherwise specified.\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\nfunc (v *Validate) StructFiltered(s interface{}, fn FilterFunc) error {\n\treturn v.StructFilteredCtx(context.Background(), s, fn)\n}\n\n// StructFilteredCtx validates a structs exposed fields, that pass the FilterFunc check and automatically validates\n// nested structs, unless otherwise specified and also allows passing of contextual validation information via\n// context.Context\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\nfunc (v *Validate) StructFilteredCtx(ctx context.Context, s interface{}, fn FilterFunc) (err error) {\n\tval := reflect.ValueOf(s)\n\ttop := val\n\n\tif val.Kind() == reflect.Ptr && !val.IsNil() {\n\t\tval = val.Elem()\n\t}\n\n\tif val.Kind() != reflect.Struct || val.Type().ConvertibleTo(timeType) {\n\t\treturn &InvalidValidationError{Type: reflect.TypeOf(s)}\n\t}\n\n\t// good to validate\n\tvd := v.pool.Get().(*validate)\n\tvd.top = top\n\tvd.isPartial = true\n\tvd.ffn = fn\n\t// vd.hasExcludes = false // only need to reset in StructPartial and StructExcept\n\n\tvd.validateStruct(ctx, top, val, val.Type(), vd.ns[0:0], vd.actualNs[0:0], nil)\n\n\tif len(vd.errs) > 0 {\n\t\terr = vd.errs\n\t\tvd.errs = nil\n\t}\n\n\tv.pool.Put(vd)\n\n\treturn\n}\n\n// StructPartial validates the fields passed in only, ignoring all others.\n// Fields may be provided in a namespaced fashion relative to the  struct provided\n// eg. NestedStruct.Field or NestedArrayField[0].Struct.Name\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\nfunc (v *Validate) StructPartial(s interface{}, fields ...string) error {\n\treturn v.StructPartialCtx(context.Background(), s, fields...)\n}\n\n// StructPartialCtx validates the fields passed in only, ignoring all others and allows passing of contextual\n// validation information via context.Context\n// Fields may be provided in a namespaced fashion relative to the  struct provided\n// eg. NestedStruct.Field or NestedArrayField[0].Struct.Name\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\nfunc (v *Validate) StructPartialCtx(ctx context.Context, s interface{}, fields ...string) (err error) {\n\tval := reflect.ValueOf(s)\n\ttop := val\n\n\tif val.Kind() == reflect.Ptr && !val.IsNil() {\n\t\tval = val.Elem()\n\t}\n\n\tif val.Kind() != reflect.Struct || val.Type().ConvertibleTo(timeType) {\n\t\treturn &InvalidValidationError{Type: reflect.TypeOf(s)}\n\t}\n\n\t// good to validate\n\tvd := v.pool.Get().(*validate)\n\tvd.top = top\n\tvd.isPartial = true\n\tvd.ffn = nil\n\tvd.hasExcludes = false\n\tvd.includeExclude = make(map[string]struct{})\n\n\ttyp := val.Type()\n\tname := typ.Name()\n\n\tfor _, k := range fields {\n\t\tflds := strings.Split(k, namespaceSeparator)\n\t\tif len(flds) > 0 {\n\t\t\tvd.misc = append(vd.misc[0:0], name...)\n\t\t\t// Don't append empty name for unnamed structs\n\t\t\tif len(vd.misc) != 0 {\n\t\t\t\tvd.misc = append(vd.misc, '.')\n\t\t\t}\n\n\t\t\tfor _, s := range flds {\n\t\t\t\tidx := strings.Index(s, leftBracket)\n\n\t\t\t\tif idx != -1 {\n\t\t\t\t\tfor idx != -1 {\n\t\t\t\t\t\tvd.misc = append(vd.misc, s[:idx]...)\n\t\t\t\t\t\tvd.includeExclude[string(vd.misc)] = struct{}{}\n\n\t\t\t\t\t\tidx2 := strings.Index(s, rightBracket)\n\t\t\t\t\t\tidx2++\n\t\t\t\t\t\tvd.misc = append(vd.misc, s[idx:idx2]...)\n\t\t\t\t\t\tvd.includeExclude[string(vd.misc)] = struct{}{}\n\t\t\t\t\t\ts = s[idx2:]\n\t\t\t\t\t\tidx = strings.Index(s, leftBracket)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvd.misc = append(vd.misc, s...)\n\t\t\t\t\tvd.includeExclude[string(vd.misc)] = struct{}{}\n\t\t\t\t}\n\n\t\t\t\tvd.misc = append(vd.misc, '.')\n\t\t\t}\n\t\t}\n\t}\n\n\tvd.validateStruct(ctx, top, val, typ, vd.ns[0:0], vd.actualNs[0:0], nil)\n\n\tif len(vd.errs) > 0 {\n\t\terr = vd.errs\n\t\tvd.errs = nil\n\t}\n\n\tv.pool.Put(vd)\n\n\treturn\n}\n\n// StructExcept validates all fields except the ones passed in.\n// Fields may be provided in a namespaced fashion relative to the  struct provided\n// i.e. NestedStruct.Field or NestedArrayField[0].Struct.Name\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\nfunc (v *Validate) StructExcept(s interface{}, fields ...string) error {\n\treturn v.StructExceptCtx(context.Background(), s, fields...)\n}\n\n// StructExceptCtx validates all fields except the ones passed in and allows passing of contextual\n// validation information via context.Context\n// Fields may be provided in a namespaced fashion relative to the  struct provided\n// i.e. NestedStruct.Field or NestedArrayField[0].Struct.Name\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\nfunc (v *Validate) StructExceptCtx(ctx context.Context, s interface{}, fields ...string) (err error) {\n\tval := reflect.ValueOf(s)\n\ttop := val\n\n\tif val.Kind() == reflect.Ptr && !val.IsNil() {\n\t\tval = val.Elem()\n\t}\n\n\tif val.Kind() != reflect.Struct || val.Type().ConvertibleTo(timeType) {\n\t\treturn &InvalidValidationError{Type: reflect.TypeOf(s)}\n\t}\n\n\t// good to validate\n\tvd := v.pool.Get().(*validate)\n\tvd.top = top\n\tvd.isPartial = true\n\tvd.ffn = nil\n\tvd.hasExcludes = true\n\tvd.includeExclude = make(map[string]struct{})\n\n\ttyp := val.Type()\n\tname := typ.Name()\n\n\tfor _, key := range fields {\n\t\tvd.misc = vd.misc[0:0]\n\n\t\tif len(name) > 0 {\n\t\t\tvd.misc = append(vd.misc, name...)\n\t\t\tvd.misc = append(vd.misc, '.')\n\t\t}\n\n\t\tvd.misc = append(vd.misc, key...)\n\t\tvd.includeExclude[string(vd.misc)] = struct{}{}\n\t}\n\n\tvd.validateStruct(ctx, top, val, typ, vd.ns[0:0], vd.actualNs[0:0], nil)\n\n\tif len(vd.errs) > 0 {\n\t\terr = vd.errs\n\t\tvd.errs = nil\n\t}\n\n\tv.pool.Put(vd)\n\n\treturn\n}\n\n// Var validates a single variable using tag style validation.\n// eg.\n// var i int\n// validate.Var(i, \"gt=1,lt=10\")\n//\n// WARNING: a struct can be passed for validation eg. time.Time is a struct or\n// if you have a custom type and have registered a custom type handler, so must\n// allow it; however unforeseen validations will occur if trying to validate a\n// struct that is meant to be passed to 'validate.Struct'\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\n// validate Array, Slice and maps fields which may contain more than one error\nfunc (v *Validate) Var(field interface{}, tag string) error {\n\treturn v.VarCtx(context.Background(), field, tag)\n}\n\n// VarCtx validates a single variable using tag style validation and allows passing of contextual\n// validation information via context.Context.\n// eg.\n// var i int\n// validate.Var(i, \"gt=1,lt=10\")\n//\n// WARNING: a struct can be passed for validation eg. time.Time is a struct or\n// if you have a custom type and have registered a custom type handler, so must\n// allow it; however unforeseen validations will occur if trying to validate a\n// struct that is meant to be passed to 'validate.Struct'\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\n// validate Array, Slice and maps fields which may contain more than one error\nfunc (v *Validate) VarCtx(ctx context.Context, field interface{}, tag string) (err error) {\n\tif len(tag) == 0 || tag == skipValidationTag {\n\t\treturn nil\n\t}\n\n\tctag := v.fetchCacheTag(tag)\n\n\tval := reflect.ValueOf(field)\n\tvd := v.pool.Get().(*validate)\n\tvd.top = val\n\tvd.isPartial = false\n\tvd.traverseField(ctx, val, val, vd.ns[0:0], vd.actualNs[0:0], defaultCField, ctag)\n\n\tif len(vd.errs) > 0 {\n\t\terr = vd.errs\n\t\tvd.errs = nil\n\t}\n\tv.pool.Put(vd)\n\treturn\n}\n\n// VarWithValue validates a single variable, against another variable/field's value using tag style validation\n// eg.\n// s1 := \"abcd\"\n// s2 := \"abcd\"\n// validate.VarWithValue(s1, s2, \"eqcsfield\") // returns true\n//\n// WARNING: a struct can be passed for validation eg. time.Time is a struct or\n// if you have a custom type and have registered a custom type handler, so must\n// allow it; however unforeseen validations will occur if trying to validate a\n// struct that is meant to be passed to 'validate.Struct'\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\n// validate Array, Slice and maps fields which may contain more than one error\nfunc (v *Validate) VarWithValue(field interface{}, other interface{}, tag string) error {\n\treturn v.VarWithValueCtx(context.Background(), field, other, tag)\n}\n\n// VarWithValueCtx validates a single variable, against another variable/field's value using tag style validation and\n// allows passing of contextual validation information via context.Context.\n// eg.\n// s1 := \"abcd\"\n// s2 := \"abcd\"\n// validate.VarWithValue(s1, s2, \"eqcsfield\") // returns true\n//\n// WARNING: a struct can be passed for validation eg. time.Time is a struct or\n// if you have a custom type and have registered a custom type handler, so must\n// allow it; however unforeseen validations will occur if trying to validate a\n// struct that is meant to be passed to 'validate.Struct'\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\n// validate Array, Slice and maps fields which may contain more than one error\nfunc (v *Validate) VarWithValueCtx(ctx context.Context, field interface{}, other interface{}, tag string) (err error) {\n\tif len(tag) == 0 || tag == skipValidationTag {\n\t\treturn nil\n\t}\n\tctag := v.fetchCacheTag(tag)\n\totherVal := reflect.ValueOf(other)\n\tvd := v.pool.Get().(*validate)\n\tvd.top = otherVal\n\tvd.isPartial = false\n\tvd.traverseField(ctx, otherVal, reflect.ValueOf(field), vd.ns[0:0], vd.actualNs[0:0], defaultCField, ctag)\n\n\tif len(vd.errs) > 0 {\n\t\terr = vd.errs\n\t\tvd.errs = nil\n\t}\n\tv.pool.Put(vd)\n\treturn\n}\n\n// VarWithKey validates a single variable with a key to be included in the returned error using tag style validation\n// eg.\n// var s string\n// validate.VarWithKey(\"email_address\", s, \"required,email\")\n//\n// WARNING: a struct can be passed for validation eg. time.Time is a struct or\n// if you have a custom type and have registered a custom type handler, so must\n// allow it; however unforeseen validations will occur if trying to validate a\n// struct that is meant to be passed to 'validate.Struct'\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\n// validate Array, Slice and maps fields which may contain more than one error\nfunc (v *Validate) VarWithKey(key string, field interface{}, tag string) error {\n\treturn v.VarWithKeyCtx(context.Background(), key, field, tag)\n}\n\n// VarWithKeyCtx validates a single variable with a key to be included in the returned error using tag style validation\n// and allows passing of contextual validation information via context.Context.\n// eg.\n// var s string\n// validate.VarWithKeyCtx(\"email_address\", s, \"required,email\")\n//\n// WARNING: a struct can be passed for validation eg. time.Time is a struct or\n// if you have a custom type and have registered a custom type handler, so must\n// allow it; however unforeseen validations will occur if trying to validate a\n// struct that is meant to be passed to 'validate.Struct'\n//\n// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise.\n// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors.\n// validate Array, Slice and maps fields which may contain more than one error\nfunc (v *Validate) VarWithKeyCtx(ctx context.Context, key string, field interface{}, tag string) (err error) {\n\tif len(tag) == 0 || tag == skipValidationTag {\n\t\treturn nil\n\t}\n\n\tctag := v.fetchCacheTag(tag)\n\n\tcField := &cField{\n\t\tname:       key,\n\t\taltName:    key,\n\t\tnamesEqual: true,\n\t}\n\n\tval := reflect.ValueOf(field)\n\tvd := v.pool.Get().(*validate)\n\tvd.top = val\n\tvd.isPartial = false\n\tvd.traverseField(ctx, val, val, vd.ns[0:0], vd.actualNs[0:0], cField, ctag)\n\n\tif len(vd.errs) > 0 {\n\t\terr = vd.errs\n\t\tvd.errs = nil\n\t}\n\tv.pool.Put(vd)\n\treturn\n}\n\nfunc (v *Validate) registerValidation(tag string, fn FuncCtx, bakedIn bool, nilCheckable bool) error {\n\tif len(tag) == 0 {\n\t\treturn errors.New(\"function Key cannot be empty\")\n\t}\n\n\tif fn == nil {\n\t\treturn errors.New(\"function cannot be empty\")\n\t}\n\n\t_, ok := restrictedTags[tag]\n\tif !bakedIn && (ok || strings.ContainsAny(tag, restrictedTagChars)) {\n\t\tpanic(fmt.Sprintf(restrictedTagErr, tag))\n\t}\n\tv.validations[tag] = internalValidationFuncWrapper{fn: fn, runValidationOnNil: nilCheckable}\n\treturn nil\n}\n"
  },
  {
    "path": "validator_test.go",
    "content": "package validator\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"database/sql\"\n\t\"database/sql/driver\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"image\"\n\t\"image/jpeg\"\n\t\"image/png\"\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t. \"github.com/go-playground/assert/v2\"\n\t\"github.com/go-playground/locales/en\"\n\t\"github.com/go-playground/locales/fr\"\n\t\"github.com/go-playground/locales/nl\"\n\tut \"github.com/go-playground/universal-translator\"\n)\n\n// NOTES:\n// - Run \"go test\" to run tests\n// - Run \"gocov test | gocov report\" to report on test coverage by file\n// - Run \"gocov test | gocov annotate -\" to report on all code and functions, those, marked with \"MISS\" were never called\n//\n// or\n//\n// -- may be a good idea to change to output path to somewherelike /tmp\n// go test -coverprofile cover.out && go tool cover -html=cover.out -o cover.html\n//\n//\n// go test -cpuprofile cpu.out\n// ./validator.test -test.bench=. -test.cpuprofile=cpu.prof\n// go tool pprof validator.test cpu.prof\n//\n//\n// go test -memprofile mem.out\n\ntype I interface {\n\tFoo() string\n}\n\ntype Impl struct {\n\tF string `validate:\"len=3\"`\n}\n\nfunc (i *Impl) Foo() string {\n\treturn i.F\n}\n\ntype SubTest struct {\n\tTest string `validate:\"required\"`\n}\n\ntype TestInterface struct {\n\tIface I\n}\n\ntype TestString struct {\n\tBlankTag  string `validate:\"\"`\n\tRequired  string `validate:\"required\"`\n\tLen       string `validate:\"len=10\"`\n\tMin       string `validate:\"min=1\"`\n\tMax       string `validate:\"max=10\"`\n\tMinMax    string `validate:\"min=1,max=10\"`\n\tLt        string `validate:\"lt=10\"`\n\tLte       string `validate:\"lte=10\"`\n\tGt        string `validate:\"gt=10\"`\n\tGte       string `validate:\"gte=10\"`\n\tOmitEmpty string `validate:\"omitempty,min=1,max=10\"`\n\tBoolean   string `validate:\"boolean\"`\n\tSub       *SubTest\n\tSubIgnore *SubTest `validate:\"-\"`\n\tAnonymous struct {\n\t\tA string `validate:\"required\"`\n\t}\n\tIface I\n}\n\ntype TestUint64 struct {\n\tRequired  uint64 `validate:\"required\"`\n\tLen       uint64 `validate:\"len=10\"`\n\tMin       uint64 `validate:\"min=1\"`\n\tMax       uint64 `validate:\"max=10\"`\n\tMinMax    uint64 `validate:\"min=1,max=10\"`\n\tOmitEmpty uint64 `validate:\"omitempty,min=1,max=10\"`\n}\n\ntype TestFloat64 struct {\n\tRequired  float64 `validate:\"required\"`\n\tLen       float64 `validate:\"len=10\"`\n\tMin       float64 `validate:\"min=1\"`\n\tMax       float64 `validate:\"max=10\"`\n\tMinMax    float64 `validate:\"min=1,max=10\"`\n\tLte       float64 `validate:\"lte=10\"`\n\tOmitEmpty float64 `validate:\"omitempty,min=1,max=10\"`\n}\n\ntype TestSlice struct {\n\tRequired  []int `validate:\"required\"`\n\tLen       []int `validate:\"len=10\"`\n\tMin       []int `validate:\"min=1\"`\n\tMax       []int `validate:\"max=10\"`\n\tMinMax    []int `validate:\"min=1,max=10\"`\n\tOmitEmpty []int `validate:\"omitempty,min=1,max=10\"`\n}\n\nfunc AssertError(t *testing.T, err error, nsKey, structNsKey, field, structField, expectedTag string) {\n\terrs := err.(ValidationErrors)\n\n\tfound := false\n\tvar fe FieldError\n\n\tfor i := 0; i < len(errs); i++ {\n\t\tif errs[i].Namespace() == nsKey && errs[i].StructNamespace() == structNsKey {\n\t\t\tfound = true\n\t\t\tfe = errs[i]\n\t\t\tbreak\n\t\t}\n\t}\n\n\tEqualSkip(t, 2, found, true)\n\tNotEqualSkip(t, 2, fe, nil)\n\tEqualSkip(t, 2, fe.Field(), field)\n\tEqualSkip(t, 2, fe.StructField(), structField)\n\tEqualSkip(t, 2, fe.Tag(), expectedTag)\n}\n\nfunc AssertDeepError(t *testing.T, err error, nsKey, structNsKey, field, structField, expectedTag, actualTag string) {\n\terrs := err.(ValidationErrors)\n\n\tfound := false\n\tvar fe FieldError\n\n\tfor i := 0; i < len(errs); i++ {\n\t\tif errs[i].Namespace() == nsKey && errs[i].StructNamespace() == structNsKey && errs[i].Tag() == expectedTag && errs[i].ActualTag() == actualTag {\n\t\t\tfound = true\n\t\t\tfe = errs[i]\n\t\t\tbreak\n\t\t}\n\t}\n\n\tEqualSkip(t, 2, found, true)\n\tNotEqualSkip(t, 2, fe, nil)\n\tEqualSkip(t, 2, fe.Field(), field)\n\tEqualSkip(t, 2, fe.StructField(), structField)\n}\n\nfunc getError(err error, nsKey, structNsKey string) FieldError {\n\terrs := err.(ValidationErrors)\n\n\tvar fe FieldError\n\n\tfor i := 0; i < len(errs); i++ {\n\t\tif errs[i].Namespace() == nsKey && errs[i].StructNamespace() == structNsKey {\n\t\t\tfe = errs[i]\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn fe\n}\n\ntype valuer struct {\n\tName string\n}\n\nfunc (v valuer) Value() (driver.Value, error) {\n\tif v.Name == \"errorme\" {\n\t\tpanic(\"SQL Driver Valuer error: some kind of error\")\n\t\t// return nil, errors.New(\"some kind of error\")\n\t}\n\n\tif len(v.Name) == 0 {\n\t\treturn nil, nil\n\t}\n\n\treturn v.Name, nil\n}\n\ntype MadeUpCustomType struct {\n\tFirstName string\n\tLastName  string\n}\n\nfunc ValidateCustomType(field reflect.Value) interface{} {\n\tif cust, ok := field.Interface().(MadeUpCustomType); ok {\n\t\tif len(cust.FirstName) == 0 || len(cust.LastName) == 0 {\n\t\t\treturn \"\"\n\t\t}\n\n\t\treturn cust.FirstName + \" \" + cust.LastName\n\t}\n\n\treturn \"\"\n}\n\nfunc OverrideIntTypeForSomeReason(field reflect.Value) interface{} {\n\tif i, ok := field.Interface().(int); ok {\n\t\tif i == 1 {\n\t\t\treturn \"1\"\n\t\t}\n\n\t\tif i == 2 {\n\t\t\treturn \"12\"\n\t\t}\n\t}\n\n\treturn \"\"\n}\n\ntype CustomMadeUpStruct struct {\n\tMadeUp        MadeUpCustomType `validate:\"required\"`\n\tOverriddenInt int              `validate:\"gt=1\"`\n}\n\nfunc ValidateValuerType(field reflect.Value) interface{} {\n\tif valuer, ok := field.Interface().(driver.Valuer); ok {\n\t\tval, err := valuer.Value()\n\t\tif err != nil {\n\t\t\t// handle the error how you want\n\t\t\treturn nil\n\t\t}\n\n\t\treturn val\n\t}\n\n\treturn nil\n}\n\ntype TestPartial struct {\n\tNoTag     string\n\tBlankTag  string     `validate:\"\"`\n\tRequired  string     `validate:\"required\"`\n\tSubSlice  []*SubTest `validate:\"required,dive\"`\n\tSub       *SubTest\n\tSubIgnore *SubTest `validate:\"-\"`\n\tAnonymous struct {\n\t\tA         string     `validate:\"required\"`\n\t\tASubSlice []*SubTest `validate:\"required,dive\"`\n\n\t\tSubAnonStruct []struct {\n\t\t\tTest      string `validate:\"required\"`\n\t\t\tOtherTest string `validate:\"required\"`\n\t\t} `validate:\"required,dive\"`\n\t}\n}\n\ntype TestStruct struct {\n\tString string `validate:\"required\" json:\"StringVal\"`\n}\n\nfunc StructValidationTestStructSuccess(sl StructLevel) {\n\tst := sl.Current().Interface().(TestStruct)\n\n\tif st.String != \"good value\" {\n\t\tsl.ReportError(st.String, \"StringVal\", \"String\", \"badvalueteststruct\", \"good value\")\n\t}\n}\n\nfunc StructValidationTestStruct(sl StructLevel) {\n\tst := sl.Current().Interface().(TestStruct)\n\n\tif st.String != \"bad value\" {\n\t\tsl.ReportError(st.String, \"StringVal\", \"String\", \"badvalueteststruct\", \"bad value\")\n\t}\n}\n\nfunc StructValidationNoTestStructCustomName(sl StructLevel) {\n\tst := sl.Current().Interface().(TestStruct)\n\n\tif st.String != \"bad value\" {\n\t\tsl.ReportError(st.String, \"String\", \"\", \"badvalueteststruct\", \"bad value\")\n\t}\n}\n\nfunc StructValidationTestStructInvalid(sl StructLevel) {\n\tst := sl.Current().Interface().(TestStruct)\n\n\tif st.String != \"bad value\" {\n\t\tsl.ReportError(nil, \"StringVal\", \"String\", \"badvalueteststruct\", \"bad value\")\n\t}\n}\n\nfunc StructValidationTestStructReturnValidationErrors(sl StructLevel) {\n\ts := sl.Current().Interface().(TestStructReturnValidationErrors)\n\n\terrs := sl.Validator().Struct(s.Inner1.Inner2)\n\tif errs == nil {\n\t\treturn\n\t}\n\n\tsl.ReportValidationErrors(\"Inner1.\", \"Inner1.\", errs.(ValidationErrors))\n}\n\nfunc StructValidationTestStructReturnValidationErrors2(sl StructLevel) {\n\ts := sl.Current().Interface().(TestStructReturnValidationErrors)\n\n\terrs := sl.Validator().Struct(s.Inner1.Inner2)\n\tif errs == nil {\n\t\treturn\n\t}\n\n\tsl.ReportValidationErrors(\"Inner1JSON.\", \"Inner1.\", errs.(ValidationErrors))\n}\n\ntype TestStructReturnValidationErrorsInner2 struct {\n\tString string `validate:\"required\" json:\"JSONString\"`\n}\n\ntype TestStructReturnValidationErrorsInner1 struct {\n\tInner2 *TestStructReturnValidationErrorsInner2\n}\n\ntype TestStructReturnValidationErrors struct {\n\tInner1 *TestStructReturnValidationErrorsInner1 `json:\"Inner1JSON\"`\n}\n\ntype StructLevelInvalidErr struct {\n\tValue string\n}\n\nfunc StructLevelInvalidError(sl StructLevel) {\n\ttop := sl.Top().Interface().(StructLevelInvalidErr)\n\ts := sl.Current().Interface().(StructLevelInvalidErr)\n\n\tif top.Value == s.Value {\n\t\tsl.ReportError(nil, \"Value\", \"Value\", \"required\", \"\")\n\t}\n}\n\nfunc stringPtr(v string) *string {\n\treturn &v\n}\n\nfunc intPtr(v int) *int {\n\treturn &v\n}\n\nfunc float64Ptr(v float64) *float64 {\n\treturn &v\n}\n\nfunc TestStructLevelInvalidError(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterStructValidation(StructLevelInvalidError, StructLevelInvalidErr{})\n\n\tvar test StructLevelInvalidErr\n\n\terr := validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(ValidationErrors)\n\tEqual(t, ok, true)\n\n\tfe := errs[0]\n\tEqual(t, fe.Field(), \"Value\")\n\tEqual(t, fe.StructField(), \"Value\")\n\tEqual(t, fe.Namespace(), \"StructLevelInvalidErr.Value\")\n\tEqual(t, fe.StructNamespace(), \"StructLevelInvalidErr.Value\")\n\tEqual(t, fe.Tag(), \"required\")\n\tEqual(t, fe.ActualTag(), \"required\")\n\tEqual(t, fe.Kind(), reflect.Invalid)\n\tEqual(t, fe.Type(), reflect.TypeOf(nil))\n}\n\nfunc TestNameNamespace(t *testing.T) {\n\ttype Inner2Namespace struct {\n\t\tString []string `validate:\"dive,required\" json:\"JSONString\"`\n\t}\n\n\ttype Inner1Namespace struct {\n\t\tInner2 *Inner2Namespace `json:\"Inner2JSON\"`\n\t}\n\n\ttype Namespace struct {\n\t\tInner1 *Inner1Namespace `json:\"Inner1JSON\"`\n\t}\n\n\tvalidate := New()\n\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\n\t\treturn name\n\t})\n\n\ti2 := &Inner2Namespace{String: []string{\"ok\", \"ok\", \"ok\"}}\n\ti1 := &Inner1Namespace{Inner2: i2}\n\tns := &Namespace{Inner1: i1}\n\n\terrs := validate.Struct(ns)\n\tEqual(t, errs, nil)\n\n\ti2.String[1] = \"\"\n\n\terrs = validate.Struct(ns)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 1)\n\tAssertError(t, errs, \"Namespace.Inner1JSON.Inner2JSON.JSONString[1]\", \"Namespace.Inner1.Inner2.String[1]\", \"JSONString[1]\", \"String[1]\", \"required\")\n\n\tfe := getError(ve, \"Namespace.Inner1JSON.Inner2JSON.JSONString[1]\", \"Namespace.Inner1.Inner2.String[1]\")\n\tNotEqual(t, fe, nil)\n\tEqual(t, fe.Field(), \"JSONString[1]\")\n\tEqual(t, fe.StructField(), \"String[1]\")\n\tEqual(t, fe.Namespace(), \"Namespace.Inner1JSON.Inner2JSON.JSONString[1]\")\n\tEqual(t, fe.StructNamespace(), \"Namespace.Inner1.Inner2.String[1]\")\n}\n\nfunc TestAnonymous(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\n\t\treturn name\n\t})\n\n\ttype Test struct {\n\t\tAnonymous struct {\n\t\t\tA string `validate:\"required\" json:\"EH\"`\n\t\t}\n\t\tAnonymousB struct {\n\t\t\tB string `validate:\"required\" json:\"BEE\"`\n\t\t}\n\t\tanonymousC struct {\n\t\t\tc string `validate:\"required\"`\n\t\t}\n\t}\n\n\ttst := &Test{\n\t\tAnonymous: struct {\n\t\t\tA string `validate:\"required\" json:\"EH\"`\n\t\t}{\n\t\t\tA: \"1\",\n\t\t},\n\t\tAnonymousB: struct {\n\t\t\tB string `validate:\"required\" json:\"BEE\"`\n\t\t}{\n\t\t\tB: \"\",\n\t\t},\n\t\tanonymousC: struct {\n\t\t\tc string `validate:\"required\"`\n\t\t}{\n\t\t\tc: \"\",\n\t\t},\n\t}\n\n\tEqual(t, tst.anonymousC.c, \"\")\n\n\terr := validate.Struct(tst)\n\tNotEqual(t, err, nil)\n\n\terrs := err.(ValidationErrors)\n\n\tEqual(t, len(errs), 1)\n\tAssertError(t, errs, \"Test.AnonymousB.BEE\", \"Test.AnonymousB.B\", \"BEE\", \"B\", \"required\")\n\n\tfe := getError(errs, \"Test.AnonymousB.BEE\", \"Test.AnonymousB.B\")\n\tNotEqual(t, fe, nil)\n\tEqual(t, fe.Field(), \"BEE\")\n\tEqual(t, fe.StructField(), \"B\")\n\n\ts := struct {\n\t\tc string `validate:\"required\"`\n\t}{\n\t\tc: \"\",\n\t}\n\n\terr = validate.Struct(s)\n\tEqual(t, err, nil)\n}\n\nfunc TestAnonymousSameStructDifferentTags(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\n\t\treturn name\n\t})\n\n\ttype Test struct {\n\t\tA interface{}\n\t}\n\n\ttst := &Test{\n\t\tA: struct {\n\t\t\tA string `validate:\"required\"`\n\t\t}{\n\t\t\tA: \"\",\n\t\t},\n\t}\n\n\terr := validate.Struct(tst)\n\tNotEqual(t, err, nil)\n\n\terrs := err.(ValidationErrors)\n\n\tEqual(t, len(errs), 1)\n\tAssertError(t, errs, \"Test.A.A\", \"Test.A.A\", \"A\", \"A\", \"required\")\n\n\ttst = &Test{\n\t\tA: struct {\n\t\t\tA string `validate:\"omitempty,required\"`\n\t\t}{\n\t\t\tA: \"\",\n\t\t},\n\t}\n\n\terr = validate.Struct(tst)\n\tEqual(t, err, nil)\n}\n\nfunc TestStructLevelReturnValidationErrors(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterStructValidation(StructValidationTestStructReturnValidationErrors, TestStructReturnValidationErrors{})\n\n\tinner2 := &TestStructReturnValidationErrorsInner2{\n\t\tString: \"I'm HERE\",\n\t}\n\n\tinner1 := &TestStructReturnValidationErrorsInner1{\n\t\tInner2: inner2,\n\t}\n\n\tval := &TestStructReturnValidationErrors{\n\t\tInner1: inner1,\n\t}\n\n\terrs := validate.Struct(val)\n\tEqual(t, errs, nil)\n\n\tinner2.String = \"\"\n\n\terrs = validate.Struct(val)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 2)\n\tAssertError(t, errs, \"TestStructReturnValidationErrors.Inner1.Inner2.String\", \"TestStructReturnValidationErrors.Inner1.Inner2.String\", \"String\", \"String\", \"required\")\n\t// this is an extra error reported from struct validation\n\tAssertError(t, errs, \"TestStructReturnValidationErrors.Inner1.TestStructReturnValidationErrorsInner2.String\", \"TestStructReturnValidationErrors.Inner1.TestStructReturnValidationErrorsInner2.String\", \"String\", \"String\", \"required\")\n}\n\nfunc TestStructLevelReturnValidationErrorsWithJSON(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\n\t\treturn name\n\t})\n\tvalidate.RegisterStructValidation(StructValidationTestStructReturnValidationErrors2, TestStructReturnValidationErrors{})\n\n\tinner2 := &TestStructReturnValidationErrorsInner2{\n\t\tString: \"I'm HERE\",\n\t}\n\n\tinner1 := &TestStructReturnValidationErrorsInner1{\n\t\tInner2: inner2,\n\t}\n\n\tval := &TestStructReturnValidationErrors{\n\t\tInner1: inner1,\n\t}\n\n\terrs := validate.Struct(val)\n\tEqual(t, errs, nil)\n\n\tinner2.String = \"\"\n\n\terrs = validate.Struct(val)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 2)\n\tAssertError(t, errs, \"TestStructReturnValidationErrors.Inner1JSON.Inner2.JSONString\", \"TestStructReturnValidationErrors.Inner1.Inner2.String\", \"JSONString\", \"String\", \"required\")\n\t// this is an extra error reported from struct validation, it's a badly formatted one, but on purpose\n\tAssertError(t, errs, \"TestStructReturnValidationErrors.Inner1JSON.TestStructReturnValidationErrorsInner2.JSONString\", \"TestStructReturnValidationErrors.Inner1.TestStructReturnValidationErrorsInner2.String\", \"JSONString\", \"String\", \"required\")\n\n\tfe := getError(errs, \"TestStructReturnValidationErrors.Inner1JSON.Inner2.JSONString\", \"TestStructReturnValidationErrors.Inner1.Inner2.String\")\n\tNotEqual(t, fe, nil)\n\n\t// check for proper JSON namespace\n\tEqual(t, fe.Field(), \"JSONString\")\n\tEqual(t, fe.StructField(), \"String\")\n\tEqual(t, fe.Namespace(), \"TestStructReturnValidationErrors.Inner1JSON.Inner2.JSONString\")\n\tEqual(t, fe.StructNamespace(), \"TestStructReturnValidationErrors.Inner1.Inner2.String\")\n\n\tfe = getError(errs, \"TestStructReturnValidationErrors.Inner1JSON.TestStructReturnValidationErrorsInner2.JSONString\", \"TestStructReturnValidationErrors.Inner1.TestStructReturnValidationErrorsInner2.String\")\n\tNotEqual(t, fe, nil)\n\n\t// check for proper JSON namespace\n\tEqual(t, fe.Field(), \"JSONString\")\n\tEqual(t, fe.StructField(), \"String\")\n\tEqual(t, fe.Namespace(), \"TestStructReturnValidationErrors.Inner1JSON.TestStructReturnValidationErrorsInner2.JSONString\")\n\tEqual(t, fe.StructNamespace(), \"TestStructReturnValidationErrors.Inner1.TestStructReturnValidationErrorsInner2.String\")\n}\n\nfunc TestStructLevelValidations(t *testing.T) {\n\tv1 := New()\n\tv1.RegisterStructValidation(StructValidationTestStruct, TestStruct{})\n\n\ttst := &TestStruct{\n\t\tString: \"good value\",\n\t}\n\n\terrs := v1.Struct(tst)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestStruct.StringVal\", \"TestStruct.String\", \"StringVal\", \"String\", \"badvalueteststruct\")\n\n\tv2 := New()\n\tv2.RegisterStructValidation(StructValidationNoTestStructCustomName, TestStruct{})\n\n\terrs = v2.Struct(tst)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestStruct.String\", \"TestStruct.String\", \"String\", \"String\", \"badvalueteststruct\")\n\n\tv3 := New()\n\tv3.RegisterStructValidation(StructValidationTestStructInvalid, TestStruct{})\n\n\terrs = v3.Struct(tst)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestStruct.StringVal\", \"TestStruct.String\", \"StringVal\", \"String\", \"badvalueteststruct\")\n\n\tv4 := New()\n\tv4.RegisterStructValidation(StructValidationTestStructSuccess, TestStruct{})\n\n\terrs = v4.Struct(tst)\n\tEqual(t, errs, nil)\n}\n\nfunc TestAliasTags(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterAlias(\"iscoloralias\", \"hexcolor|rgb|rgba|hsl|hsla|cmyk\")\n\n\ts := \"rgb(255,255,255)\"\n\terrs := validate.Var(s, \"iscoloralias\")\n\tEqual(t, errs, nil)\n\n\ts = \"\"\n\terrs = validate.Var(s, \"omitempty,iscoloralias\")\n\tEqual(t, errs, nil)\n\n\ts = \"rgb(255,255,0)\"\n\terrs = validate.Var(s, \"iscoloralias,len=5\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"len\")\n\n\ttype Test struct {\n\t\tColor string `validate:\"iscoloralias\"`\n\t}\n\n\ttst := &Test{\n\t\tColor: \"#000\",\n\t}\n\n\terrs = validate.Struct(tst)\n\tEqual(t, errs, nil)\n\n\ttst.Color = \"cfvre\"\n\terrs = validate.Struct(tst)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.Color\", \"Test.Color\", \"Color\", \"Color\", \"iscoloralias\")\n\n\tfe := getError(errs, \"Test.Color\", \"Test.Color\")\n\tNotEqual(t, fe, nil)\n\tEqual(t, fe.ActualTag(), \"hexcolor|rgb|rgba|hsl|hsla|cmyk\")\n\n\tvalidate.RegisterAlias(\"req\", \"required,dive,iscoloralias\")\n\tarr := []string{\"val1\", \"#fff\", \"#000\"}\n\n\terrs = validate.Var(arr, \"req\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"[0]\", \"[0]\", \"[0]\", \"[0]\", \"iscoloralias\")\n\n\tPanicMatches(t, func() { validate.RegisterAlias(\"exists!\", \"gt=5,lt=10\") }, \"Alias 'exists!' either contains restricted characters or is the same as a restricted tag needed for normal operation\")\n}\n\nfunc TestAliasWithOrOperator(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterAlias(\"customnum\", \"numeric\")\n\tvalidate.RegisterAlias(\"customalpha\", \"alpha\")\n\tvalidate.RegisterAlias(\"customgt5\", \"gt=5\")\n\n\tt.Run(\"numeric|iscolor\", func(t *testing.T) {\n\t\ttype S struct {\n\t\t\tF string `validate:\"numeric|iscolor\"`\n\t\t}\n\t\tEqual(t, validate.Struct(S{\"#fff\"}), nil)\n\t\tEqual(t, validate.Struct(S{\"123\"}), nil)\n\t\tNotEqual(t, validate.Struct(S{\"invalid!\"}), nil)\n\t})\n\n\tt.Run(\"iscolor|numeric\", func(t *testing.T) {\n\t\ttype S struct {\n\t\t\tF string `validate:\"iscolor|numeric\"`\n\t\t}\n\t\tEqual(t, validate.Struct(S{\"456\"}), nil)\n\t\tEqual(t, validate.Struct(S{\"rgb(255,0,0)\"}), nil)\n\t})\n\n\tt.Run(\"alpha|customnum\", func(t *testing.T) {\n\t\ttype S struct {\n\t\t\tF string `validate:\"alpha|customnum\"`\n\t\t}\n\t\tEqual(t, validate.Struct(S{\"789\"}), nil)\n\t\tEqual(t, validate.Struct(S{\"abc\"}), nil)\n\t})\n\n\tt.Run(\"customnum|customalpha\", func(t *testing.T) {\n\t\ttype S struct {\n\t\t\tF string `validate:\"customnum|customalpha\"`\n\t\t}\n\t\tEqual(t, validate.Struct(S{\"xyz\"}), nil)\n\t})\n\n\tt.Run(\"alpha|customnum|email\", func(t *testing.T) {\n\t\ttype S struct {\n\t\t\tF string `validate:\"alpha|customnum|email\"`\n\t\t}\n\t\tEqual(t, validate.Struct(S{\"test@example.com\"}), nil)\n\t})\n\n\tt.Run(\"eq=0|customgt5\", func(t *testing.T) {\n\t\ttype S struct {\n\t\t\tF int `validate:\"eq=0|customgt5\"`\n\t\t}\n\t\tEqual(t, validate.Struct(S{0}), nil)\n\t\tEqual(t, validate.Struct(S{10}), nil)\n\t\tNotEqual(t, validate.Struct(S{3}), nil)\n\t})\n\n\tt.Run(\"numeric|country_code\", func(t *testing.T) {\n\t\ttype S struct {\n\t\t\tF string `validate:\"numeric|country_code\"`\n\t\t}\n\t\tEqual(t, validate.Struct(S{\"US\"}), nil)\n\t})\n}\n\nfunc TestNilValidator(t *testing.T) {\n\ttype TestStruct struct {\n\t\tTest string `validate:\"required\"`\n\t}\n\n\tts := TestStruct{}\n\n\tvar val *Validate\n\n\tfn := func(fl FieldLevel) bool {\n\t\treturn fl.Parent().String() == fl.Field().String()\n\t}\n\n\tPanicMatches(t, func() { val.RegisterCustomTypeFunc(ValidateCustomType, MadeUpCustomType{}) }, \"runtime error: invalid memory address or nil pointer dereference\")\n\tPanicMatches(t, func() { _ = val.RegisterValidation(\"something\", fn) }, \"runtime error: invalid memory address or nil pointer dereference\")\n\tPanicMatches(t, func() { _ = val.Var(ts.Test, \"required\") }, \"runtime error: invalid memory address or nil pointer dereference\")\n\tPanicMatches(t, func() { _ = val.VarWithValue(\"test\", ts.Test, \"required\") }, \"runtime error: invalid memory address or nil pointer dereference\")\n\tPanicMatches(t, func() { _ = val.Struct(ts) }, \"runtime error: invalid memory address or nil pointer dereference\")\n\tPanicMatches(t, func() { _ = val.StructExcept(ts, \"Test\") }, \"runtime error: invalid memory address or nil pointer dereference\")\n\tPanicMatches(t, func() { _ = val.StructPartial(ts, \"Test\") }, \"runtime error: invalid memory address or nil pointer dereference\")\n}\n\nfunc TestStructPartial(t *testing.T) {\n\tp1 := []string{\n\t\t\"NoTag\",\n\t\t\"Required\",\n\t}\n\n\tp2 := []string{\n\t\t\"SubSlice[0].Test\",\n\t\t\"Sub\",\n\t\t\"SubIgnore\",\n\t\t\"Anonymous.A\",\n\t}\n\n\tp3 := []string{\n\t\t\"SubTest.Test\",\n\t}\n\n\tp4 := []string{\n\t\t\"A\",\n\t}\n\n\ttPartial := &TestPartial{\n\t\tNoTag:    \"NoTag\",\n\t\tRequired: \"Required\",\n\n\t\tSubSlice: []*SubTest{\n\t\t\t{\n\t\t\t\tTest: \"Required\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tTest: \"Required\",\n\t\t\t},\n\t\t},\n\n\t\tSub: &SubTest{\n\t\t\tTest: \"1\",\n\t\t},\n\t\tSubIgnore: &SubTest{\n\t\t\tTest: \"\",\n\t\t},\n\t\tAnonymous: struct {\n\t\t\tA             string     `validate:\"required\"`\n\t\t\tASubSlice     []*SubTest `validate:\"required,dive\"`\n\t\t\tSubAnonStruct []struct {\n\t\t\t\tTest      string `validate:\"required\"`\n\t\t\t\tOtherTest string `validate:\"required\"`\n\t\t\t} `validate:\"required,dive\"`\n\t\t}{\n\t\t\tA: \"1\",\n\t\t\tASubSlice: []*SubTest{\n\t\t\t\t{\n\t\t\t\t\tTest: \"Required\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tTest: \"Required\",\n\t\t\t\t},\n\t\t\t},\n\n\t\t\tSubAnonStruct: []struct {\n\t\t\t\tTest      string `validate:\"required\"`\n\t\t\t\tOtherTest string `validate:\"required\"`\n\t\t\t}{\n\t\t\t\t{\"Required\", \"RequiredOther\"},\n\t\t\t\t{\"Required\", \"RequiredOther\"},\n\t\t\t},\n\t\t},\n\t}\n\n\tvalidate := New()\n\n\t// the following should all return no errors as everything is valid in\n\t// the default state\n\terrs := validate.StructPartialCtx(context.Background(), tPartial, p1...)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructPartial(tPartial, p2...)\n\tEqual(t, errs, nil)\n\n\t// this isn't really a robust test, but is meant to illustrate the ANON CASE below\n\terrs = validate.StructPartial(tPartial.SubSlice[0], p3...)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructExceptCtx(context.Background(), tPartial, p1...)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructExcept(tPartial, p2...)\n\tEqual(t, errs, nil)\n\n\t// mod tPartial for required field and re-test making sure invalid fields are NOT required:\n\ttPartial.Required = \"\"\n\n\terrs = validate.StructExcept(tPartial, p1...)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructPartial(tPartial, p2...)\n\tEqual(t, errs, nil)\n\n\t// inversion and retesting Partial to generate failures:\n\terrs = validate.StructPartial(tPartial, p1...)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestPartial.Required\", \"TestPartial.Required\", \"Required\", \"Required\", \"required\")\n\n\terrs = validate.StructExcept(tPartial, p2...)\n\tAssertError(t, errs, \"TestPartial.Required\", \"TestPartial.Required\", \"Required\", \"Required\", \"required\")\n\n\t// reset Required field, and set nested struct\n\ttPartial.Required = \"Required\"\n\ttPartial.Anonymous.A = \"\"\n\n\t// will pass as unset fields is not going to be tested\n\terrs = validate.StructPartial(tPartial, p1...)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructExcept(tPartial, p2...)\n\tEqual(t, errs, nil)\n\n\t// ANON CASE the response here is strange, it clearly does what it is being told to\n\terrs = validate.StructExcept(tPartial.Anonymous, p4...)\n\tEqual(t, errs, nil)\n\n\t// will fail as unset field is tested\n\terrs = validate.StructPartial(tPartial, p2...)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestPartial.Anonymous.A\", \"TestPartial.Anonymous.A\", \"A\", \"A\", \"required\")\n\n\terrs = validate.StructExcept(tPartial, p1...)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestPartial.Anonymous.A\", \"TestPartial.Anonymous.A\", \"A\", \"A\", \"required\")\n\n\t// reset nested struct and unset struct in slice\n\ttPartial.Anonymous.A = \"Required\"\n\ttPartial.SubSlice[0].Test = \"\"\n\n\t// these will pass as unset item is NOT tested\n\terrs = validate.StructPartial(tPartial, p1...)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructExcept(tPartial, p2...)\n\tEqual(t, errs, nil)\n\n\t// these will fail as unset item IS tested\n\terrs = validate.StructExcept(tPartial, p1...)\n\tAssertError(t, errs, \"TestPartial.SubSlice[0].Test\", \"TestPartial.SubSlice[0].Test\", \"Test\", \"Test\", \"required\")\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\n\terrs = validate.StructPartial(tPartial, p2...)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestPartial.SubSlice[0].Test\", \"TestPartial.SubSlice[0].Test\", \"Test\", \"Test\", \"required\")\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\n\t// Unset second slice member concurrently to test dive behavior:\n\ttPartial.SubSlice[1].Test = \"\"\n\n\terrs = validate.StructPartial(tPartial, p1...)\n\tEqual(t, errs, nil)\n\n\t// NOTE: When specifying nested items, it is still the users responsibility\n\t// to specify the dive tag, the library does not override this.\n\terrs = validate.StructExcept(tPartial, p2...)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestPartial.SubSlice[1].Test\", \"TestPartial.SubSlice[1].Test\", \"Test\", \"Test\", \"required\")\n\n\terrs = validate.StructExcept(tPartial, p1...)\n\tEqual(t, len(errs.(ValidationErrors)), 2)\n\tAssertError(t, errs, \"TestPartial.SubSlice[0].Test\", \"TestPartial.SubSlice[0].Test\", \"Test\", \"Test\", \"required\")\n\tAssertError(t, errs, \"TestPartial.SubSlice[1].Test\", \"TestPartial.SubSlice[1].Test\", \"Test\", \"Test\", \"required\")\n\n\terrs = validate.StructPartial(tPartial, p2...)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"TestPartial.SubSlice[0].Test\", \"TestPartial.SubSlice[0].Test\", \"Test\", \"Test\", \"required\")\n\n\t// reset struct in slice, and unset struct in slice in unset position\n\ttPartial.SubSlice[0].Test = \"Required\"\n\n\t// these will pass as the unset item is NOT tested\n\terrs = validate.StructPartial(tPartial, p1...)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructPartial(tPartial, p2...)\n\tEqual(t, errs, nil)\n\n\t// testing for missing item by exception, yes it dives and fails\n\terrs = validate.StructExcept(tPartial, p1...)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"TestPartial.SubSlice[1].Test\", \"TestPartial.SubSlice[1].Test\", \"Test\", \"Test\", \"required\")\n\n\terrs = validate.StructExcept(tPartial, p2...)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestPartial.SubSlice[1].Test\", \"TestPartial.SubSlice[1].Test\", \"Test\", \"Test\", \"required\")\n\n\ttPartial.SubSlice[1].Test = \"Required\"\n\n\ttPartial.Anonymous.SubAnonStruct[0].Test = \"\"\n\t// these will pass as the unset item is NOT tested\n\terrs = validate.StructPartial(tPartial, p1...)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructPartial(tPartial, p2...)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructExcept(tPartial, p1...)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestPartial.Anonymous.SubAnonStruct[0].Test\", \"TestPartial.Anonymous.SubAnonStruct[0].Test\", \"Test\", \"Test\", \"required\")\n\n\terrs = validate.StructExcept(tPartial, p2...)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestPartial.Anonymous.SubAnonStruct[0].Test\", \"TestPartial.Anonymous.SubAnonStruct[0].Test\", \"Test\", \"Test\", \"required\")\n\n\t// Test for unnamed struct\n\ttestStruct := &TestStruct{\n\t\tString: \"test\",\n\t}\n\tunnamedStruct := struct {\n\t\tString string `validate:\"required\" json:\"StringVal\"`\n\t}{String: \"test\"}\n\tcomposedUnnamedStruct := struct{ *TestStruct }{&TestStruct{String: \"test\"}}\n\n\terrs = validate.StructPartial(testStruct, \"String\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructPartial(unnamedStruct, \"String\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructPartial(composedUnnamedStruct, \"TestStruct.String\")\n\tEqual(t, errs, nil)\n\n\ttestStruct.String = \"\"\n\terrs = validate.StructPartial(testStruct, \"String\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestStruct.String\", \"TestStruct.String\", \"String\", \"String\", \"required\")\n\n\tunnamedStruct.String = \"\"\n\terrs = validate.StructPartial(unnamedStruct, \"String\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"String\", \"String\", \"String\", \"String\", \"required\")\n\n\tcomposedUnnamedStruct.String = \"\"\n\terrs = validate.StructPartial(composedUnnamedStruct, \"TestStruct.String\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestStruct.String\", \"TestStruct.String\", \"String\", \"String\", \"required\")\n}\n\nfunc TestCrossStructLteFieldValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\ttype Inner struct {\n\t\tCreatedAt *time.Time\n\t\tString    string\n\t\tInt       int\n\t\tUint      uint\n\t\tFloat     float64\n\t\tArray     []string\n\t}\n\n\ttype Test struct {\n\t\tInner     *Inner\n\t\tCreatedAt *time.Time `validate:\"ltecsfield=Inner.CreatedAt\"`\n\t\tString    string     `validate:\"ltecsfield=Inner.String\"`\n\t\tInt       int        `validate:\"ltecsfield=Inner.Int\"`\n\t\tUint      uint       `validate:\"ltecsfield=Inner.Uint\"`\n\t\tFloat     float64    `validate:\"ltecsfield=Inner.Float\"`\n\t\tArray     []string   `validate:\"ltecsfield=Inner.Array\"`\n\t}\n\n\tnow := time.Now().UTC()\n\tthen := now.Add(time.Hour * 5)\n\n\tinner := &Inner{\n\t\tCreatedAt: &then,\n\t\tString:    \"abcd\",\n\t\tInt:       13,\n\t\tUint:      13,\n\t\tFloat:     1.13,\n\t\tArray:     []string{\"val1\", \"val2\"},\n\t}\n\n\ttest := &Test{\n\t\tInner:     inner,\n\t\tCreatedAt: &now,\n\t\tString:    \"abc\",\n\t\tInt:       12,\n\t\tUint:      12,\n\t\tFloat:     1.12,\n\t\tArray:     []string{\"val1\"},\n\t}\n\n\terrs = validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest.CreatedAt = &then\n\ttest.String = \"abcd\"\n\ttest.Int = 13\n\ttest.Uint = 13\n\ttest.Float = 1.13\n\ttest.Array = []string{\"val1\", \"val2\"}\n\n\terrs = validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\tafter := now.Add(time.Hour * 10)\n\n\ttest.CreatedAt = &after\n\ttest.String = \"abce\"\n\ttest.Int = 14\n\ttest.Uint = 14\n\ttest.Float = 1.14\n\ttest.Array = []string{\"val1\", \"val2\", \"val3\"}\n\n\terrs = validate.Struct(test)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.CreatedAt\", \"Test.CreatedAt\", \"CreatedAt\", \"CreatedAt\", \"ltecsfield\")\n\tAssertError(t, errs, \"Test.String\", \"Test.String\", \"String\", \"String\", \"ltecsfield\")\n\tAssertError(t, errs, \"Test.Int\", \"Test.Int\", \"Int\", \"Int\", \"ltecsfield\")\n\tAssertError(t, errs, \"Test.Uint\", \"Test.Uint\", \"Uint\", \"Uint\", \"ltecsfield\")\n\tAssertError(t, errs, \"Test.Float\", \"Test.Float\", \"Float\", \"Float\", \"ltecsfield\")\n\tAssertError(t, errs, \"Test.Array\", \"Test.Array\", \"Array\", \"Array\", \"ltecsfield\")\n\n\terrs = validate.VarWithValueCtx(context.Background(), 1, \"\", \"ltecsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltecsfield\")\n\n\t// this test is for the WARNING about unforeseen validation issues.\n\terrs = validate.VarWithValue(test, now, \"ltecsfield\")\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 6)\n\tAssertError(t, errs, \"Test.CreatedAt\", \"Test.CreatedAt\", \"CreatedAt\", \"CreatedAt\", \"ltecsfield\")\n\tAssertError(t, errs, \"Test.String\", \"Test.String\", \"String\", \"String\", \"ltecsfield\")\n\tAssertError(t, errs, \"Test.Int\", \"Test.Int\", \"Int\", \"Int\", \"ltecsfield\")\n\tAssertError(t, errs, \"Test.Uint\", \"Test.Uint\", \"Uint\", \"Uint\", \"ltecsfield\")\n\tAssertError(t, errs, \"Test.Float\", \"Test.Float\", \"Float\", \"Float\", \"ltecsfield\")\n\tAssertError(t, errs, \"Test.Array\", \"Test.Array\", \"Array\", \"Array\", \"ltecsfield\")\n\n\ttype Other struct {\n\t\tValue string\n\t}\n\n\ttype Test2 struct {\n\t\tValue Other\n\t\tTime  time.Time `validate:\"ltecsfield=Value\"`\n\t}\n\n\ttst := Test2{\n\t\tValue: Other{Value: \"StringVal\"},\n\t\tTime:  then,\n\t}\n\n\terrs = validate.Struct(tst)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test2.Time\", \"Test2.Time\", \"Time\", \"Time\", \"ltecsfield\")\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for variables of time.Duration type.\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour+time.Minute, \"ltecsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour, \"ltecsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour-time.Minute, \"ltecsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltecsfield\")\n\n\terrs = validate.VarWithValue(time.Duration(0), -time.Minute, \"omitempty,ltecsfield\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct and an inner struct with time.Duration type fields.\n\n\ttype TimeDurationInner struct {\n\t\tDuration time.Duration\n\t}\n\tvar timeDurationInner *TimeDurationInner\n\n\ttype TimeDurationTest struct {\n\t\tInner    *TimeDurationInner\n\t\tDuration time.Duration `validate:\"ltecsfield=Inner.Duration\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour + time.Minute}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour - time.Minute}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"ltecsfield\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tInner    *TimeDurationInner\n\t\tDuration time.Duration `validate:\"omitempty,ltecsfield=Inner.Duration\"`\n\t}\n\tvar timeDurationOmitemptyTest *TimeDurationOmitemptyTest\n\n\ttimeDurationInner = &TimeDurationInner{-time.Minute}\n\ttimeDurationOmitemptyTest = &TimeDurationOmitemptyTest{timeDurationInner, time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestCrossStructLtFieldValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\ttype Inner struct {\n\t\tCreatedAt *time.Time\n\t\tString    string\n\t\tInt       int\n\t\tUint      uint\n\t\tFloat     float64\n\t\tArray     []string\n\t}\n\n\ttype Test struct {\n\t\tInner     *Inner\n\t\tCreatedAt *time.Time `validate:\"ltcsfield=Inner.CreatedAt\"`\n\t\tString    string     `validate:\"ltcsfield=Inner.String\"`\n\t\tInt       int        `validate:\"ltcsfield=Inner.Int\"`\n\t\tUint      uint       `validate:\"ltcsfield=Inner.Uint\"`\n\t\tFloat     float64    `validate:\"ltcsfield=Inner.Float\"`\n\t\tArray     []string   `validate:\"ltcsfield=Inner.Array\"`\n\t}\n\n\tnow := time.Now().UTC()\n\tthen := now.Add(time.Hour * 5)\n\n\tinner := &Inner{\n\t\tCreatedAt: &then,\n\t\tString:    \"abcd\",\n\t\tInt:       13,\n\t\tUint:      13,\n\t\tFloat:     1.13,\n\t\tArray:     []string{\"val1\", \"val2\"},\n\t}\n\n\ttest := &Test{\n\t\tInner:     inner,\n\t\tCreatedAt: &now,\n\t\tString:    \"abc\",\n\t\tInt:       12,\n\t\tUint:      12,\n\t\tFloat:     1.12,\n\t\tArray:     []string{\"val1\"},\n\t}\n\n\terrs = validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest.CreatedAt = &then\n\ttest.String = \"abcd\"\n\ttest.Int = 13\n\ttest.Uint = 13\n\ttest.Float = 1.13\n\ttest.Array = []string{\"val1\", \"val2\"}\n\n\terrs = validate.Struct(test)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.CreatedAt\", \"Test.CreatedAt\", \"CreatedAt\", \"CreatedAt\", \"ltcsfield\")\n\tAssertError(t, errs, \"Test.String\", \"Test.String\", \"String\", \"String\", \"ltcsfield\")\n\tAssertError(t, errs, \"Test.Int\", \"Test.Int\", \"Int\", \"Int\", \"ltcsfield\")\n\tAssertError(t, errs, \"Test.Uint\", \"Test.Uint\", \"Uint\", \"Uint\", \"ltcsfield\")\n\tAssertError(t, errs, \"Test.Float\", \"Test.Float\", \"Float\", \"Float\", \"ltcsfield\")\n\tAssertError(t, errs, \"Test.Array\", \"Test.Array\", \"Array\", \"Array\", \"ltcsfield\")\n\n\terrs = validate.VarWithValue(1, \"\", \"ltcsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltcsfield\")\n\n\t// this test is for the WARNING about unforeseen validation issues.\n\terrs = validate.VarWithValue(test, now, \"ltcsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.CreatedAt\", \"Test.CreatedAt\", \"CreatedAt\", \"CreatedAt\", \"ltcsfield\")\n\tAssertError(t, errs, \"Test.String\", \"Test.String\", \"String\", \"String\", \"ltcsfield\")\n\tAssertError(t, errs, \"Test.Int\", \"Test.Int\", \"Int\", \"Int\", \"ltcsfield\")\n\tAssertError(t, errs, \"Test.Uint\", \"Test.Uint\", \"Uint\", \"Uint\", \"ltcsfield\")\n\tAssertError(t, errs, \"Test.Float\", \"Test.Float\", \"Float\", \"Float\", \"ltcsfield\")\n\tAssertError(t, errs, \"Test.Array\", \"Test.Array\", \"Array\", \"Array\", \"ltcsfield\")\n\n\ttype Other struct {\n\t\tValue string\n\t}\n\n\ttype Test2 struct {\n\t\tValue Other\n\t\tTime  time.Time `validate:\"ltcsfield=Value\"`\n\t}\n\n\ttst := Test2{\n\t\tValue: Other{Value: \"StringVal\"},\n\t\tTime:  then,\n\t}\n\n\terrs = validate.Struct(tst)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test2.Time\", \"Test2.Time\", \"Time\", \"Time\", \"ltcsfield\")\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for variables of time.Duration type.\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour+time.Minute, \"ltcsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour, \"ltcsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltcsfield\")\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour-time.Minute, \"ltcsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltcsfield\")\n\n\terrs = validate.VarWithValue(time.Duration(0), -time.Minute, \"omitempty,ltcsfield\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct and an inner struct with time.Duration type fields.\n\n\ttype TimeDurationInner struct {\n\t\tDuration time.Duration\n\t}\n\tvar timeDurationInner *TimeDurationInner\n\n\ttype TimeDurationTest struct {\n\t\tInner    *TimeDurationInner\n\t\tDuration time.Duration `validate:\"ltcsfield=Inner.Duration\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour + time.Minute}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"ltcsfield\")\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour - time.Minute}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"ltcsfield\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tInner    *TimeDurationInner\n\t\tDuration time.Duration `validate:\"omitempty,ltcsfield=Inner.Duration\"`\n\t}\n\tvar timeDurationOmitemptyTest *TimeDurationOmitemptyTest\n\n\ttimeDurationInner = &TimeDurationInner{-time.Minute}\n\ttimeDurationOmitemptyTest = &TimeDurationOmitemptyTest{timeDurationInner, time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestCrossStructGteFieldValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\ttype Inner struct {\n\t\tCreatedAt *time.Time\n\t\tString    string\n\t\tInt       int\n\t\tUint      uint\n\t\tFloat     float64\n\t\tArray     []string\n\t}\n\n\ttype Test struct {\n\t\tInner     *Inner\n\t\tCreatedAt *time.Time `validate:\"gtecsfield=Inner.CreatedAt\"`\n\t\tString    string     `validate:\"gtecsfield=Inner.String\"`\n\t\tInt       int        `validate:\"gtecsfield=Inner.Int\"`\n\t\tUint      uint       `validate:\"gtecsfield=Inner.Uint\"`\n\t\tFloat     float64    `validate:\"gtecsfield=Inner.Float\"`\n\t\tArray     []string   `validate:\"gtecsfield=Inner.Array\"`\n\t}\n\n\tnow := time.Now().UTC()\n\tthen := now.Add(time.Hour * -5)\n\n\tinner := &Inner{\n\t\tCreatedAt: &then,\n\t\tString:    \"abcd\",\n\t\tInt:       13,\n\t\tUint:      13,\n\t\tFloat:     1.13,\n\t\tArray:     []string{\"val1\", \"val2\"},\n\t}\n\n\ttest := &Test{\n\t\tInner:     inner,\n\t\tCreatedAt: &now,\n\t\tString:    \"abcde\",\n\t\tInt:       14,\n\t\tUint:      14,\n\t\tFloat:     1.14,\n\t\tArray:     []string{\"val1\", \"val2\", \"val3\"},\n\t}\n\n\terrs = validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest.CreatedAt = &then\n\ttest.String = \"abcd\"\n\ttest.Int = 13\n\ttest.Uint = 13\n\ttest.Float = 1.13\n\ttest.Array = []string{\"val1\", \"val2\"}\n\n\terrs = validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\tbefore := now.Add(time.Hour * -10)\n\n\ttest.CreatedAt = &before\n\ttest.String = \"abc\"\n\ttest.Int = 12\n\ttest.Uint = 12\n\ttest.Float = 1.12\n\ttest.Array = []string{\"val1\"}\n\n\terrs = validate.Struct(test)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.CreatedAt\", \"Test.CreatedAt\", \"CreatedAt\", \"CreatedAt\", \"gtecsfield\")\n\tAssertError(t, errs, \"Test.String\", \"Test.String\", \"String\", \"String\", \"gtecsfield\")\n\tAssertError(t, errs, \"Test.Int\", \"Test.Int\", \"Int\", \"Int\", \"gtecsfield\")\n\tAssertError(t, errs, \"Test.Uint\", \"Test.Uint\", \"Uint\", \"Uint\", \"gtecsfield\")\n\tAssertError(t, errs, \"Test.Float\", \"Test.Float\", \"Float\", \"Float\", \"gtecsfield\")\n\tAssertError(t, errs, \"Test.Array\", \"Test.Array\", \"Array\", \"Array\", \"gtecsfield\")\n\n\terrs = validate.VarWithValue(1, \"\", \"gtecsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtecsfield\")\n\n\t// this test is for the WARNING about unforeseen validation issues.\n\terrs = validate.VarWithValue(test, now, \"gtecsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.CreatedAt\", \"Test.CreatedAt\", \"CreatedAt\", \"CreatedAt\", \"gtecsfield\")\n\tAssertError(t, errs, \"Test.String\", \"Test.String\", \"String\", \"String\", \"gtecsfield\")\n\tAssertError(t, errs, \"Test.Int\", \"Test.Int\", \"Int\", \"Int\", \"gtecsfield\")\n\tAssertError(t, errs, \"Test.Uint\", \"Test.Uint\", \"Uint\", \"Uint\", \"gtecsfield\")\n\tAssertError(t, errs, \"Test.Float\", \"Test.Float\", \"Float\", \"Float\", \"gtecsfield\")\n\tAssertError(t, errs, \"Test.Array\", \"Test.Array\", \"Array\", \"Array\", \"gtecsfield\")\n\n\ttype Other struct {\n\t\tValue string\n\t}\n\n\ttype Test2 struct {\n\t\tValue Other\n\t\tTime  time.Time `validate:\"gtecsfield=Value\"`\n\t}\n\n\ttst := Test2{\n\t\tValue: Other{Value: \"StringVal\"},\n\t\tTime:  then,\n\t}\n\n\terrs = validate.Struct(tst)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test2.Time\", \"Test2.Time\", \"Time\", \"Time\", \"gtecsfield\")\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for variables of time.Duration type.\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour-time.Minute, \"gtecsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour, \"gtecsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour+time.Minute, \"gtecsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtecsfield\")\n\n\terrs = validate.VarWithValue(time.Duration(0), time.Hour, \"omitempty,gtecsfield\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct and an inner struct with time.Duration type fields.\n\n\ttype TimeDurationInner struct {\n\t\tDuration time.Duration\n\t}\n\tvar timeDurationInner *TimeDurationInner\n\n\ttype TimeDurationTest struct {\n\t\tInner    *TimeDurationInner\n\t\tDuration time.Duration `validate:\"gtecsfield=Inner.Duration\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour - time.Minute}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour + time.Minute}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"gtecsfield\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tInner    *TimeDurationInner\n\t\tDuration time.Duration `validate:\"omitempty,gtecsfield=Inner.Duration\"`\n\t}\n\tvar timeDurationOmitemptyTest *TimeDurationOmitemptyTest\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour}\n\ttimeDurationOmitemptyTest = &TimeDurationOmitemptyTest{timeDurationInner, time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestCrossStructGtFieldValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\ttype Inner struct {\n\t\tCreatedAt *time.Time\n\t\tString    string\n\t\tInt       int\n\t\tUint      uint\n\t\tFloat     float64\n\t\tArray     []string\n\t}\n\n\ttype Test struct {\n\t\tInner     *Inner\n\t\tCreatedAt *time.Time `validate:\"gtcsfield=Inner.CreatedAt\"`\n\t\tString    string     `validate:\"gtcsfield=Inner.String\"`\n\t\tInt       int        `validate:\"gtcsfield=Inner.Int\"`\n\t\tUint      uint       `validate:\"gtcsfield=Inner.Uint\"`\n\t\tFloat     float64    `validate:\"gtcsfield=Inner.Float\"`\n\t\tArray     []string   `validate:\"gtcsfield=Inner.Array\"`\n\t}\n\n\tnow := time.Now().UTC()\n\tthen := now.Add(time.Hour * -5)\n\n\tinner := &Inner{\n\t\tCreatedAt: &then,\n\t\tString:    \"abcd\",\n\t\tInt:       13,\n\t\tUint:      13,\n\t\tFloat:     1.13,\n\t\tArray:     []string{\"val1\", \"val2\"},\n\t}\n\n\ttest := &Test{\n\t\tInner:     inner,\n\t\tCreatedAt: &now,\n\t\tString:    \"abcde\",\n\t\tInt:       14,\n\t\tUint:      14,\n\t\tFloat:     1.14,\n\t\tArray:     []string{\"val1\", \"val2\", \"val3\"},\n\t}\n\n\terrs = validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest.CreatedAt = &then\n\ttest.String = \"abcd\"\n\ttest.Int = 13\n\ttest.Uint = 13\n\ttest.Float = 1.13\n\ttest.Array = []string{\"val1\", \"val2\"}\n\n\terrs = validate.Struct(test)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.CreatedAt\", \"Test.CreatedAt\", \"CreatedAt\", \"CreatedAt\", \"gtcsfield\")\n\tAssertError(t, errs, \"Test.String\", \"Test.String\", \"String\", \"String\", \"gtcsfield\")\n\tAssertError(t, errs, \"Test.Int\", \"Test.Int\", \"Int\", \"Int\", \"gtcsfield\")\n\tAssertError(t, errs, \"Test.Uint\", \"Test.Uint\", \"Uint\", \"Uint\", \"gtcsfield\")\n\tAssertError(t, errs, \"Test.Float\", \"Test.Float\", \"Float\", \"Float\", \"gtcsfield\")\n\tAssertError(t, errs, \"Test.Array\", \"Test.Array\", \"Array\", \"Array\", \"gtcsfield\")\n\n\terrs = validate.VarWithValue(1, \"\", \"gtcsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtcsfield\")\n\n\t// this test is for the WARNING about unforeseen validation issues.\n\terrs = validate.VarWithValue(test, now, \"gtcsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.CreatedAt\", \"Test.CreatedAt\", \"CreatedAt\", \"CreatedAt\", \"gtcsfield\")\n\tAssertError(t, errs, \"Test.String\", \"Test.String\", \"String\", \"String\", \"gtcsfield\")\n\tAssertError(t, errs, \"Test.Int\", \"Test.Int\", \"Int\", \"Int\", \"gtcsfield\")\n\tAssertError(t, errs, \"Test.Uint\", \"Test.Uint\", \"Uint\", \"Uint\", \"gtcsfield\")\n\tAssertError(t, errs, \"Test.Float\", \"Test.Float\", \"Float\", \"Float\", \"gtcsfield\")\n\tAssertError(t, errs, \"Test.Array\", \"Test.Array\", \"Array\", \"Array\", \"gtcsfield\")\n\n\ttype Other struct {\n\t\tValue string\n\t}\n\n\ttype Test2 struct {\n\t\tValue Other\n\t\tTime  time.Time `validate:\"gtcsfield=Value\"`\n\t}\n\n\ttst := Test2{\n\t\tValue: Other{Value: \"StringVal\"},\n\t\tTime:  then,\n\t}\n\n\terrs = validate.Struct(tst)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test2.Time\", \"Test2.Time\", \"Time\", \"Time\", \"gtcsfield\")\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for variables of time.Duration type.\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour-time.Minute, \"gtcsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour, \"gtcsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtcsfield\")\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour+time.Minute, \"gtcsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtcsfield\")\n\n\terrs = validate.VarWithValue(time.Duration(0), time.Hour, \"omitempty,gtcsfield\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct and an inner struct with time.Duration type fields.\n\n\ttype TimeDurationInner struct {\n\t\tDuration time.Duration\n\t}\n\tvar timeDurationInner *TimeDurationInner\n\n\ttype TimeDurationTest struct {\n\t\tInner    *TimeDurationInner\n\t\tDuration time.Duration `validate:\"gtcsfield=Inner.Duration\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour - time.Minute}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"gtcsfield\")\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour + time.Minute}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"gtcsfield\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tInner    *TimeDurationInner\n\t\tDuration time.Duration `validate:\"omitempty,gtcsfield=Inner.Duration\"`\n\t}\n\tvar timeDurationOmitemptyTest *TimeDurationOmitemptyTest\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour}\n\ttimeDurationOmitemptyTest = &TimeDurationOmitemptyTest{timeDurationInner, time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestCrossStructNeFieldValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\ttype Inner struct {\n\t\tCreatedAt *time.Time\n\t}\n\n\ttype Test struct {\n\t\tInner     *Inner\n\t\tCreatedAt *time.Time `validate:\"necsfield=Inner.CreatedAt\"`\n\t}\n\n\tnow := time.Now().UTC()\n\tthen := now.Add(time.Hour * 5)\n\n\tinner := &Inner{\n\t\tCreatedAt: &then,\n\t}\n\n\ttest := &Test{\n\t\tInner:     inner,\n\t\tCreatedAt: &now,\n\t}\n\n\terrs = validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest.CreatedAt = &then\n\n\terrs = validate.Struct(test)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.CreatedAt\", \"Test.CreatedAt\", \"CreatedAt\", \"CreatedAt\", \"necsfield\")\n\n\tvar j uint64\n\tvar k float64\n\tvar j2 uint64\n\tvar k2 float64\n\ts := \"abcd\"\n\ti := 1\n\tj = 1\n\tk = 1.543\n\tb := true\n\tarr := []string{\"test\"}\n\n\ts2 := \"abcd\"\n\ti2 := 1\n\tj2 = 1\n\tk2 = 1.543\n\tb2 := true\n\tarr2 := []string{\"test\"}\n\tarr3 := []string{\"test\", \"test2\"}\n\tnow2 := now\n\n\terrs = validate.VarWithValue(s, s2, \"necsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"necsfield\")\n\n\terrs = validate.VarWithValue(i2, i, \"necsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"necsfield\")\n\n\terrs = validate.VarWithValue(j2, j, \"necsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"necsfield\")\n\n\terrs = validate.VarWithValue(k2, k, \"necsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"necsfield\")\n\n\terrs = validate.VarWithValue(b2, b, \"necsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"necsfield\")\n\n\terrs = validate.VarWithValue(arr2, arr, \"necsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"necsfield\")\n\n\terrs = validate.VarWithValue(now2, now, \"necsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"necsfield\")\n\n\terrs = validate.VarWithValue(arr3, arr, \"necsfield\")\n\tEqual(t, errs, nil)\n\n\ttype SInner struct {\n\t\tName string\n\t}\n\n\ttype TStruct struct {\n\t\tInner     *SInner\n\t\tCreatedAt *time.Time `validate:\"necsfield=Inner\"`\n\t}\n\n\tsinner := &SInner{\n\t\tName: \"NAME\",\n\t}\n\n\ttest2 := &TStruct{\n\t\tInner:     sinner,\n\t\tCreatedAt: &now,\n\t}\n\n\terrs = validate.Struct(test2)\n\tEqual(t, errs, nil)\n\n\ttest2.Inner = nil\n\terrs = validate.Struct(test2)\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(nil, 1, \"necsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"necsfield\")\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for variables of time.Duration type.\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour-time.Minute, \"necsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour+time.Minute, \"necsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour, \"necsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"necsfield\")\n\n\terrs = validate.VarWithValue(time.Duration(0), time.Duration(0), \"omitempty,necsfield\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct and an inner struct with time.Duration type fields.\n\n\ttype TimeDurationInner struct {\n\t\tDuration time.Duration\n\t}\n\tvar timeDurationInner *TimeDurationInner\n\n\ttype TimeDurationTest struct {\n\t\tInner    *TimeDurationInner\n\t\tDuration time.Duration `validate:\"necsfield=Inner.Duration\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour - time.Minute}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour + time.Minute}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"necsfield\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tInner    *TimeDurationInner\n\t\tDuration time.Duration `validate:\"omitempty,necsfield=Inner.Duration\"`\n\t}\n\tvar timeDurationOmitemptyTest *TimeDurationOmitemptyTest\n\n\ttimeDurationInner = &TimeDurationInner{time.Duration(0)}\n\ttimeDurationOmitemptyTest = &TimeDurationOmitemptyTest{timeDurationInner, time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestCrossStructEqFieldValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\ttype Inner struct {\n\t\tCreatedAt *time.Time\n\t}\n\n\ttype Test struct {\n\t\tInner     *Inner\n\t\tCreatedAt *time.Time `validate:\"eqcsfield=Inner.CreatedAt\"`\n\t}\n\n\tnow := time.Now().UTC()\n\n\tinner := &Inner{\n\t\tCreatedAt: &now,\n\t}\n\n\ttest := &Test{\n\t\tInner:     inner,\n\t\tCreatedAt: &now,\n\t}\n\n\terrs = validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\tnewTime := time.Now().Add(time.Hour).UTC()\n\ttest.CreatedAt = &newTime\n\n\terrs = validate.Struct(test)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.CreatedAt\", \"Test.CreatedAt\", \"CreatedAt\", \"CreatedAt\", \"eqcsfield\")\n\n\tvar j uint64\n\tvar k float64\n\ts := \"abcd\"\n\ti := 1\n\tj = 1\n\tk = 1.543\n\tb := true\n\tarr := []string{\"test\"}\n\n\tvar j2 uint64\n\tvar k2 float64\n\ts2 := \"abcd\"\n\ti2 := 1\n\tj2 = 1\n\tk2 = 1.543\n\tb2 := true\n\tarr2 := []string{\"test\"}\n\tarr3 := []string{\"test\", \"test2\"}\n\tnow2 := now\n\n\terrs = validate.VarWithValue(s, s2, \"eqcsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(i2, i, \"eqcsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(j2, j, \"eqcsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(k2, k, \"eqcsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(b2, b, \"eqcsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(arr2, arr, \"eqcsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(now2, now, \"eqcsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(arr3, arr, \"eqcsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"eqcsfield\")\n\n\ttype SInner struct {\n\t\tName string\n\t}\n\n\ttype TStruct struct {\n\t\tInner     *SInner\n\t\tCreatedAt *time.Time `validate:\"eqcsfield=Inner\"`\n\t}\n\n\tsinner := &SInner{\n\t\tName: \"NAME\",\n\t}\n\n\ttest2 := &TStruct{\n\t\tInner:     sinner,\n\t\tCreatedAt: &now,\n\t}\n\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TStruct.CreatedAt\", \"TStruct.CreatedAt\", \"CreatedAt\", \"CreatedAt\", \"eqcsfield\")\n\n\ttest2.Inner = nil\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TStruct.CreatedAt\", \"TStruct.CreatedAt\", \"CreatedAt\", \"CreatedAt\", \"eqcsfield\")\n\n\terrs = validate.VarWithValue(nil, 1, \"eqcsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"eqcsfield\")\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for variables of time.Duration type.\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour, \"eqcsfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour-time.Minute, \"eqcsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"eqcsfield\")\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour+time.Minute, \"eqcsfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"eqcsfield\")\n\n\terrs = validate.VarWithValue(time.Duration(0), time.Hour, \"omitempty,eqcsfield\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct and an inner struct with time.Duration type fields.\n\n\ttype TimeDurationInner struct {\n\t\tDuration time.Duration\n\t}\n\tvar timeDurationInner *TimeDurationInner\n\n\ttype TimeDurationTest struct {\n\t\tInner    *TimeDurationInner\n\t\tDuration time.Duration `validate:\"eqcsfield=Inner.Duration\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour - time.Minute}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"eqcsfield\")\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour + time.Minute}\n\ttimeDurationTest = &TimeDurationTest{timeDurationInner, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"eqcsfield\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tInner    *TimeDurationInner\n\t\tDuration time.Duration `validate:\"omitempty,eqcsfield=Inner.Duration\"`\n\t}\n\tvar timeDurationOmitemptyTest *TimeDurationOmitemptyTest\n\n\ttimeDurationInner = &TimeDurationInner{time.Hour}\n\ttimeDurationOmitemptyTest = &TimeDurationOmitemptyTest{timeDurationInner, time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestCrossNamespaceFieldValidation(t *testing.T) {\n\ttype SliceStruct struct {\n\t\tName string\n\t}\n\n\ttype Inner struct {\n\t\tCreatedAt        *time.Time\n\t\tSlice            []string\n\t\tSliceStructs     []*SliceStruct\n\t\tSliceSlice       [][]string\n\t\tSliceSliceStruct [][]*SliceStruct\n\t\tSliceMap         []map[string]string\n\t\tMap              map[string]string\n\t\tMapMap           map[string]map[string]string\n\t\tMapStructs       map[string]*SliceStruct\n\t\tMapMapStruct     map[string]map[string]*SliceStruct\n\t\tMapSlice         map[string][]string\n\t\tMapInt           map[int]string\n\t\tMapInt8          map[int8]string\n\t\tMapInt16         map[int16]string\n\t\tMapInt32         map[int32]string\n\t\tMapInt64         map[int64]string\n\t\tMapUint          map[uint]string\n\t\tMapUint8         map[uint8]string\n\t\tMapUint16        map[uint16]string\n\t\tMapUint32        map[uint32]string\n\t\tMapUint64        map[uint64]string\n\t\tMapFloat32       map[float32]string\n\t\tMapFloat64       map[float64]string\n\t\tMapBool          map[bool]string\n\t}\n\n\ttype Test struct {\n\t\tInner     *Inner\n\t\tCreatedAt *time.Time\n\t}\n\n\tnow := time.Now()\n\n\tinner := &Inner{\n\t\tCreatedAt:        &now,\n\t\tSlice:            []string{\"val1\", \"val2\", \"val3\"},\n\t\tSliceStructs:     []*SliceStruct{{Name: \"name1\"}, {Name: \"name2\"}, {Name: \"name3\"}},\n\t\tSliceSlice:       [][]string{{\"1\", \"2\", \"3\"}, {\"4\", \"5\", \"6\"}, {\"7\", \"8\", \"9\"}},\n\t\tSliceSliceStruct: [][]*SliceStruct{{{Name: \"name1\"}, {Name: \"name2\"}, {Name: \"name3\"}}, {{Name: \"name4\"}, {Name: \"name5\"}, {Name: \"name6\"}}, {{Name: \"name7\"}, {Name: \"name8\"}, {Name: \"name9\"}}},\n\t\tSliceMap:         []map[string]string{{\"key1\": \"val1\", \"key2\": \"val2\", \"key3\": \"val3\"}, {\"key4\": \"val4\", \"key5\": \"val5\", \"key6\": \"val6\"}},\n\t\tMap:              map[string]string{\"key1\": \"val1\", \"key2\": \"val2\", \"key3\": \"val3\"},\n\t\tMapStructs:       map[string]*SliceStruct{\"key1\": {Name: \"name1\"}, \"key2\": {Name: \"name2\"}, \"key3\": {Name: \"name3\"}},\n\t\tMapMap:           map[string]map[string]string{\"key1\": {\"key1-1\": \"val1\"}, \"key2\": {\"key2-1\": \"val2\"}, \"key3\": {\"key3-1\": \"val3\"}},\n\t\tMapMapStruct:     map[string]map[string]*SliceStruct{\"key1\": {\"key1-1\": {Name: \"name1\"}}, \"key2\": {\"key2-1\": {Name: \"name2\"}}, \"key3\": {\"key3-1\": {Name: \"name3\"}}},\n\t\tMapSlice:         map[string][]string{\"key1\": {\"1\", \"2\", \"3\"}, \"key2\": {\"4\", \"5\", \"6\"}, \"key3\": {\"7\", \"8\", \"9\"}},\n\t\tMapInt:           map[int]string{1: \"val1\", 2: \"val2\", 3: \"val3\"},\n\t\tMapInt8:          map[int8]string{1: \"val1\", 2: \"val2\", 3: \"val3\"},\n\t\tMapInt16:         map[int16]string{1: \"val1\", 2: \"val2\", 3: \"val3\"},\n\t\tMapInt32:         map[int32]string{1: \"val1\", 2: \"val2\", 3: \"val3\"},\n\t\tMapInt64:         map[int64]string{1: \"val1\", 2: \"val2\", 3: \"val3\"},\n\t\tMapUint:          map[uint]string{1: \"val1\", 2: \"val2\", 3: \"val3\"},\n\t\tMapUint8:         map[uint8]string{1: \"val1\", 2: \"val2\", 3: \"val3\"},\n\t\tMapUint16:        map[uint16]string{1: \"val1\", 2: \"val2\", 3: \"val3\"},\n\t\tMapUint32:        map[uint32]string{1: \"val1\", 2: \"val2\", 3: \"val3\"},\n\t\tMapUint64:        map[uint64]string{1: \"val1\", 2: \"val2\", 3: \"val3\"},\n\t\tMapFloat32:       map[float32]string{1.01: \"val1\", 2.02: \"val2\", 3.03: \"val3\"},\n\t\tMapFloat64:       map[float64]string{1.01: \"val1\", 2.02: \"val2\", 3.03: \"val3\"},\n\t\tMapBool:          map[bool]string{true: \"val1\", false: \"val2\"},\n\t}\n\n\ttest := &Test{\n\t\tInner:     inner,\n\t\tCreatedAt: &now,\n\t}\n\n\tval := reflect.ValueOf(test)\n\n\tvd := New()\n\tv := &validate{\n\t\tv: vd,\n\t}\n\n\tcurrent, kind, _, ok := v.getStructFieldOKInternal(val, \"Inner.CreatedAt\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.Struct)\n\ttm, ok := current.Interface().(time.Time)\n\tEqual(t, ok, true)\n\tEqual(t, tm, now)\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.Slice[1]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val2\")\n\n\t_, _, _, ok = v.getStructFieldOKInternal(val, \"Inner.CrazyNonExistantField\")\n\tEqual(t, ok, false)\n\n\t_, _, _, ok = v.getStructFieldOKInternal(val, \"Inner.Slice[101]\")\n\tEqual(t, ok, false)\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.Map[key3]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val3\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapMap[key2][key2-1]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val2\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapStructs[key2].Name\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"name2\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapMapStruct[key3][key3-1].Name\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"name3\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.SliceSlice[2][0]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"7\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.SliceSliceStruct[2][1].Name\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"name8\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.SliceMap[1][key5]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val5\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapSlice[key3][2]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"9\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapInt[2]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val2\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapInt8[2]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val2\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapInt16[2]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val2\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapInt32[2]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val2\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapInt64[2]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val2\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapUint[2]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val2\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapUint8[2]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val2\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapUint16[2]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val2\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapUint32[2]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val2\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapUint64[2]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val2\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapFloat32[3.03]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val3\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapFloat64[2.02]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val2\")\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.MapBool[true]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.String)\n\tEqual(t, current.String(), \"val1\")\n\n\tinner = &Inner{\n\t\tCreatedAt:        &now,\n\t\tSlice:            []string{\"val1\", \"val2\", \"val3\"},\n\t\tSliceStructs:     []*SliceStruct{{Name: \"name1\"}, {Name: \"name2\"}, nil},\n\t\tSliceSlice:       [][]string{{\"1\", \"2\", \"3\"}, {\"4\", \"5\", \"6\"}, {\"7\", \"8\", \"9\"}},\n\t\tSliceSliceStruct: [][]*SliceStruct{{{Name: \"name1\"}, {Name: \"name2\"}, {Name: \"name3\"}}, {{Name: \"name4\"}, {Name: \"name5\"}, {Name: \"name6\"}}, {{Name: \"name7\"}, {Name: \"name8\"}, {Name: \"name9\"}}},\n\t\tSliceMap:         []map[string]string{{\"key1\": \"val1\", \"key2\": \"val2\", \"key3\": \"val3\"}, {\"key4\": \"val4\", \"key5\": \"val5\", \"key6\": \"val6\"}},\n\t\tMap:              map[string]string{\"key1\": \"val1\", \"key2\": \"val2\", \"key3\": \"val3\"},\n\t\tMapStructs:       map[string]*SliceStruct{\"key1\": {Name: \"name1\"}, \"key2\": {Name: \"name2\"}, \"key3\": {Name: \"name3\"}},\n\t\tMapMap:           map[string]map[string]string{\"key1\": {\"key1-1\": \"val1\"}, \"key2\": {\"key2-1\": \"val2\"}, \"key3\": {\"key3-1\": \"val3\"}},\n\t\tMapMapStruct:     map[string]map[string]*SliceStruct{\"key1\": {\"key1-1\": {Name: \"name1\"}}, \"key2\": {\"key2-1\": {Name: \"name2\"}}, \"key3\": {\"key3-1\": {Name: \"name3\"}}},\n\t\tMapSlice:         map[string][]string{\"key1\": {\"1\", \"2\", \"3\"}, \"key2\": {\"4\", \"5\", \"6\"}, \"key3\": {\"7\", \"8\", \"9\"}},\n\t}\n\n\ttest = &Test{\n\t\tInner:     inner,\n\t\tCreatedAt: nil,\n\t}\n\n\tval = reflect.ValueOf(test)\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.SliceStructs[2]\")\n\tEqual(t, ok, true)\n\tEqual(t, kind, reflect.Ptr)\n\tEqual(t, current.String(), \"<*validator.SliceStruct Value>\")\n\tEqual(t, current.IsNil(), true)\n\n\tcurrent, kind, _, ok = v.getStructFieldOKInternal(val, \"Inner.SliceStructs[2].Name\")\n\tEqual(t, ok, false)\n\tEqual(t, kind, reflect.Ptr)\n\tEqual(t, current.String(), \"<*validator.SliceStruct Value>\")\n\tEqual(t, current.IsNil(), true)\n\n\t// Test that invalid namespace on primitive type returns found=false instead of panicking\n\t// This enables cross-field validators like required_if to work with ValidateMap\n\t_, kind, _, ok = v.getStructFieldOKInternal(reflect.ValueOf(1), \"crazyinput\")\n\tEqual(t, ok, false)\n\tEqual(t, kind, reflect.Int)\n}\n\nfunc TestExistsValidation(t *testing.T) {\n\tjsonText := \"{ \\\"truthiness2\\\": true }\"\n\n\ttype Thing struct {\n\t\tTruthiness *bool `json:\"truthiness\" validate:\"required\"`\n\t}\n\n\tvar ting Thing\n\n\terr := json.Unmarshal([]byte(jsonText), &ting)\n\tEqual(t, err, nil)\n\tNotEqual(t, ting, nil)\n\tEqual(t, ting.Truthiness, nil)\n\n\tvalidate := New()\n\terrs := validate.Struct(ting)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Thing.Truthiness\", \"Thing.Truthiness\", \"Truthiness\", \"Truthiness\", \"required\")\n\n\tjsonText = \"{ \\\"truthiness\\\": true }\"\n\n\terr = json.Unmarshal([]byte(jsonText), &ting)\n\tEqual(t, err, nil)\n\tNotEqual(t, ting, nil)\n\tEqual(t, ting.Truthiness, true)\n\n\terrs = validate.Struct(ting)\n\tEqual(t, errs, nil)\n}\n\nfunc TestSQLValue2Validation(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterCustomTypeFunc(ValidateValuerType, valuer{}, (*driver.Valuer)(nil), sql.NullString{}, sql.NullInt64{}, sql.NullBool{}, sql.NullFloat64{})\n\tvalidate.RegisterCustomTypeFunc(ValidateCustomType, MadeUpCustomType{})\n\tvalidate.RegisterCustomTypeFunc(OverrideIntTypeForSomeReason, 1)\n\n\tval := valuer{\n\t\tName: \"\",\n\t}\n\n\terrs := validate.Var(val, \"required\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"required\")\n\n\tval.Name = \"Valid Name\"\n\terrs = validate.VarCtx(context.Background(), val, \"required\")\n\tEqual(t, errs, nil)\n\n\tval.Name = \"errorme\"\n\n\tPanicMatches(t, func() { _ = validate.Var(val, \"required\") }, \"SQL Driver Valuer error: some kind of error\")\n\n\tmyVal := valuer{\n\t\tName: \"\",\n\t}\n\n\terrs = validate.Var(myVal, \"required\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"required\")\n\n\tcust := MadeUpCustomType{\n\t\tFirstName: \"Joey\",\n\t\tLastName:  \"Bloggs\",\n\t}\n\n\tc := CustomMadeUpStruct{MadeUp: cust, OverriddenInt: 2}\n\n\terrs = validate.Struct(c)\n\tEqual(t, errs, nil)\n\n\tc.MadeUp.FirstName = \"\"\n\tc.OverriddenInt = 1\n\n\terrs = validate.Struct(c)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 2)\n\tAssertError(t, errs, \"CustomMadeUpStruct.MadeUp\", \"CustomMadeUpStruct.MadeUp\", \"MadeUp\", \"MadeUp\", \"required\")\n\tAssertError(t, errs, \"CustomMadeUpStruct.OverriddenInt\", \"CustomMadeUpStruct.OverriddenInt\", \"OverriddenInt\", \"OverriddenInt\", \"gt\")\n}\n\nfunc TestSQLValueValidation(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterCustomTypeFunc(ValidateValuerType, (*driver.Valuer)(nil), valuer{})\n\tvalidate.RegisterCustomTypeFunc(ValidateCustomType, MadeUpCustomType{})\n\tvalidate.RegisterCustomTypeFunc(OverrideIntTypeForSomeReason, 1)\n\n\tval := valuer{\n\t\tName: \"\",\n\t}\n\n\terrs := validate.Var(val, \"required\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"required\")\n\n\tval.Name = \"Valid Name\"\n\terrs = validate.Var(val, \"required\")\n\tEqual(t, errs, nil)\n\n\tval.Name = \"errorme\"\n\n\tPanicMatches(t, func() { errs = validate.Var(val, \"required\") }, \"SQL Driver Valuer error: some kind of error\")\n\n\tmyVal := valuer{\n\t\tName: \"\",\n\t}\n\n\terrs = validate.Var(myVal, \"required\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"required\")\n\n\tcust := MadeUpCustomType{\n\t\tFirstName: \"Joey\",\n\t\tLastName:  \"Bloggs\",\n\t}\n\n\tc := CustomMadeUpStruct{MadeUp: cust, OverriddenInt: 2}\n\n\terrs = validate.Struct(c)\n\tEqual(t, errs, nil)\n\n\tc.MadeUp.FirstName = \"\"\n\tc.OverriddenInt = 1\n\n\terrs = validate.Struct(c)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 2)\n\tAssertError(t, errs, \"CustomMadeUpStruct.MadeUp\", \"CustomMadeUpStruct.MadeUp\", \"MadeUp\", \"MadeUp\", \"required\")\n\tAssertError(t, errs, \"CustomMadeUpStruct.OverriddenInt\", \"CustomMadeUpStruct.OverriddenInt\", \"OverriddenInt\", \"OverriddenInt\", \"gt\")\n\n\t// Test for empty field on structs without tags\n\ttype InvalidValuePanicSafetyTest struct {\n\t\tV valuer\n\t}\n\terrs = validate.Struct(InvalidValuePanicSafetyTest{})\n\tEqual(t, errs, nil)\n}\n\nfunc TestMACValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"3D:F2:C9:A6:B3:4F\", true},\n\t\t{\"3D-F2-C9-A6-B3:4F\", false},\n\t\t{\"123\", false},\n\t\t{\"\", false},\n\t\t{\"abacaba\", false},\n\t\t{\"00:25:96:FF:FE:12:34:56\", true},\n\t\t{\"0025:96FF:FE12:3456\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"mac\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d mac failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d mac failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"mac\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d mac failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIPValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"10.0.0.1\", true},\n\t\t{\"172.16.0.1\", true},\n\t\t{\"192.168.0.1\", true},\n\t\t{\"192.168.255.254\", true},\n\t\t{\"192.168.255.256\", false},\n\t\t{\"172.16.255.254\", true},\n\t\t{\"172.16.256.255\", false},\n\t\t{\"2001:cdba:0000:0000:0000:0000:3257:9652\", true},\n\t\t{\"2001:cdba:0:0:0:0:3257:9652\", true},\n\t\t{\"2001:cdba::3257:9652\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"ip\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ip failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ip failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"ip\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d ip failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIPv6Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"10.0.0.1\", false},\n\t\t{\"172.16.0.1\", false},\n\t\t{\"192.168.0.1\", false},\n\t\t{\"192.168.255.254\", false},\n\t\t{\"192.168.255.256\", false},\n\t\t{\"172.16.255.254\", false},\n\t\t{\"172.16.256.255\", false},\n\t\t{\"2001:cdba:0000:0000:0000:0000:3257:9652\", true},\n\t\t{\"2001:cdba:0:0:0:0:3257:9652\", true},\n\t\t{\"2001:cdba::3257:9652\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"ipv6\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ipv6 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ipv6 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"ipv6\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d ipv6 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIPv4Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"10.0.0.1\", true},\n\t\t{\"172.16.0.1\", true},\n\t\t{\"192.168.0.1\", true},\n\t\t{\"192.168.255.254\", true},\n\t\t{\"192.168.255.256\", false},\n\t\t{\"172.16.255.254\", true},\n\t\t{\"172.16.256.255\", false},\n\t\t{\"2001:cdba:0000:0000:0000:0000:3257:9652\", false},\n\t\t{\"2001:cdba:0:0:0:0:3257:9652\", false},\n\t\t{\"2001:cdba::3257:9652\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"ipv4\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ipv4 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ipv4 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"ipv4\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d ipv4 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestCIDRValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"10.0.0.0/0\", true},\n\t\t{\"10.0.0.1/8\", true},\n\t\t{\"172.16.0.1/16\", true},\n\t\t{\"192.168.0.1/24\", true},\n\t\t{\"192.168.255.254/24\", true},\n\t\t{\"192.168.255.254/48\", false},\n\t\t{\"192.168.255.256/24\", false},\n\t\t{\"172.16.255.254/16\", true},\n\t\t{\"172.16.256.255/16\", false},\n\t\t{\"2001:cdba:0000:0000:0000:0000:3257:9652/64\", true},\n\t\t{\"2001:cdba:0000:0000:0000:0000:3257:9652/256\", false},\n\t\t{\"2001:cdba:0:0:0:0:3257:9652/32\", true},\n\t\t{\"2001:cdba::3257:9652/16\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"cidr\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d cidr failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d cidr failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"cidr\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d cidr failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestCIDRv6Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"10.0.0.0/0\", false},\n\t\t{\"10.0.0.1/8\", false},\n\t\t{\"172.16.0.1/16\", false},\n\t\t{\"192.168.0.1/24\", false},\n\t\t{\"192.168.255.254/24\", false},\n\t\t{\"192.168.255.254/48\", false},\n\t\t{\"192.168.255.256/24\", false},\n\t\t{\"172.16.255.254/16\", false},\n\t\t{\"172.16.256.255/16\", false},\n\t\t{\"2001:cdba:0000:0000:0000:0000:3257:9652/64\", true},\n\t\t{\"2001:cdba:0000:0000:0000:0000:3257:9652/256\", false},\n\t\t{\"2001:cdba:0:0:0:0:3257:9652/32\", true},\n\t\t{\"2001:cdba::3257:9652/16\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"cidrv6\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d cidrv6 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d cidrv6 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"cidrv6\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d cidrv6 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestCIDRv4Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"0.0.0.0/0\", true},\n\t\t{\"10.0.0.0/0\", false},\n\t\t{\"10.0.0.0/8\", true},\n\t\t{\"10.0.0.1/8\", false},\n\t\t{\"172.16.0.0/16\", true},\n\t\t{\"172.16.0.1/16\", false},\n\t\t{\"192.168.0.0/24\", true},\n\t\t{\"192.168.0.1/24\", false},\n\t\t{\"192.168.255.0/24\", true},\n\t\t{\"192.168.255.254/24\", false},\n\t\t{\"192.168.255.254/48\", false},\n\t\t{\"192.168.255.256/24\", false},\n\t\t{\"172.16.0.0/16\", true},\n\t\t{\"172.16.255.254/16\", false},\n\t\t{\"172.16.256.255/16\", false},\n\t\t{\"2001:cdba:0000:0000:0000:0000:3257:9652/64\", false},\n\t\t{\"2001:cdba:0000:0000:0000:0000:3257:9652/256\", false},\n\t\t{\"2001:cdba:0:0:0:0:3257:9652/32\", false},\n\t\t{\"2001:cdba::3257:9652/16\", false},\n\t\t{\"172.56.1.0/16\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"cidrv4\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d cidrv4 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d cidrv4 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"cidrv4\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d cidrv4 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestTCPAddrValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\":80\", false},\n\t\t{\"127.0.0.1:80\", true},\n\t\t{\"[::1]:80\", true},\n\t\t{\"256.0.0.0:1\", false},\n\t\t{\"[::1]\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"tcp_addr\")\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d tcp_addr failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d tcp_addr failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"tcp_addr\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d tcp_addr failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestTCP6AddrValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\":80\", false},\n\t\t{\"127.0.0.1:80\", false},\n\t\t{\"[::1]:80\", true},\n\t\t{\"256.0.0.0:1\", false},\n\t\t{\"[::1]\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"tcp6_addr\")\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d tcp6_addr failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d tcp6_addr failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"tcp6_addr\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d tcp6_addr failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestTCP4AddrValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\":80\", false},\n\t\t{\"127.0.0.1:80\", true},\n\t\t{\"[::1]:80\", false}, // https://github.com/golang/go/issues/14037\n\t\t{\"256.0.0.0:1\", false},\n\t\t{\"[::1]\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"tcp4_addr\")\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d tcp4_addr failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Log(test.param, IsEqual(errs, nil))\n\t\t\t\tt.Fatalf(\"Index: %d tcp4_addr failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"tcp4_addr\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d tcp4_addr failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestUDPAddrValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\":80\", false},\n\t\t{\"127.0.0.1:80\", true},\n\t\t{\"[::1]:80\", true},\n\t\t{\"256.0.0.0:1\", false},\n\t\t{\"[::1]\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"udp_addr\")\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d udp_addr failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d udp_addr failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"udp_addr\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d udp_addr failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestUDP6AddrValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\":80\", false},\n\t\t{\"127.0.0.1:80\", false},\n\t\t{\"[::1]:80\", true},\n\t\t{\"256.0.0.0:1\", false},\n\t\t{\"[::1]\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"udp6_addr\")\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d udp6_addr failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d udp6_addr failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"udp6_addr\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d udp6_addr failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestUDP4AddrValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\":80\", false},\n\t\t{\"127.0.0.1:80\", true},\n\t\t{\"[::1]:80\", false}, // https://github.com/golang/go/issues/14037\n\t\t{\"256.0.0.0:1\", false},\n\t\t{\"[::1]\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"udp4_addr\")\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d udp4_addr failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Log(test.param, IsEqual(errs, nil))\n\t\t\t\tt.Fatalf(\"Index: %d udp4_addr failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"udp4_addr\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d udp4_addr failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIPAddrValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"127.0.0.1\", true},\n\t\t{\"127.0.0.1:80\", false},\n\t\t{\"::1\", true},\n\t\t{\"256.0.0.0\", false},\n\t\t{\"localhost\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"ip_addr\")\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ip_addr failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ip_addr failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"ip_addr\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d ip_addr failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIP6AddrValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"127.0.0.1\", false}, // https://github.com/golang/go/issues/14037\n\t\t{\"127.0.0.1:80\", false},\n\t\t{\"::1\", true},\n\t\t{\"0:0:0:0:0:0:0:1\", true},\n\t\t{\"256.0.0.0\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"ip6_addr\")\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ip6_addr failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ip6_addr failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"ip6_addr\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d ip6_addr failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIP4AddrValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"127.0.0.1\", true},\n\t\t{\"127.0.0.1:80\", false},\n\t\t{\"::1\", false}, // https://github.com/golang/go/issues/14037\n\t\t{\"256.0.0.0\", false},\n\t\t{\"localhost\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"ip4_addr\")\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ip4_addr failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Log(test.param, IsEqual(errs, nil))\n\t\t\t\tt.Fatalf(\"Index: %d ip4_addr failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"ip4_addr\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d ip4_addr failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestUnixAddrValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", true},\n\t\t{\"v.sock\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"unix_addr\")\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d unix_addr failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Log(test.param, IsEqual(errs, nil))\n\t\t\t\tt.Fatalf(\"Index: %d unix_addr failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"unix_addr\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d unix_addr failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestUnixDomainSocketExistsValidation(t *testing.T) {\n\tif runtime.GOOS == \"windows\" {\n\t\tt.Skip(\"Unix domain sockets are not supported on Windows\")\n\t}\n\n\tvalidate := New()\n\n\tt.Run(\"empty\", func(t *testing.T) {\n\t\terrs := validate.Var(\"\", \"uds_exists\")\n\t\tNotEqual(t, errs, nil)\n\t\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"uds_exists\")\n\t})\n\n\tt.Run(\"non_existent\", func(t *testing.T) {\n\t\terrs := validate.Var(\"/tmp/nonexistent.sock\", \"uds_exists\")\n\t\tNotEqual(t, errs, nil)\n\t\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"uds_exists\")\n\t})\n\n\tt.Run(\"sock_file\", func(t *testing.T) {\n\t\tsockPath := \"/tmp/test_validator.sock\"\n\t\tvar lc net.ListenConfig\n\t\tlistener, err := lc.Listen(t.Context(), \"unix\", sockPath)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"Failed to create test socket: %v\", err)\n\t\t}\n\t\tdefer func() {\n\t\t\t_ = os.Remove(sockPath)\n\t\t\t_ = listener.Close()\n\t\t}()\n\n\t\terrs := validate.Var(sockPath, \"uds_exists\")\n\t\tEqual(t, errs, nil)\n\t})\n\n\tt.Run(\"regular_file\", func(t *testing.T) {\n\t\tregularFile := \"/tmp/test_validator_regular.txt\"\n\t\tif err := os.WriteFile(regularFile, []byte(\"test\"), 0644); err != nil {\n\t\t\tt.Fatalf(\"Failed to create regular file: %v\", err)\n\t\t}\n\t\tdefer func() {\n\t\t\t_ = os.Remove(regularFile)\n\t\t}()\n\n\t\terrs := validate.Var(regularFile, \"uds_exists\")\n\t\tNotEqual(t, errs, nil)\n\t\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"uds_exists\")\n\t})\n\n\tt.Run(\"directory\", func(t *testing.T) {\n\t\tdirPath := \"/tmp/test_validator_dir\"\n\t\tif err := os.Mkdir(dirPath, 0755); err != nil && !os.IsExist(err) {\n\t\t\tt.Fatalf(\"Failed to create directory: %v\", err)\n\t\t}\n\t\tdefer func() {\n\t\t\t_ = os.RemoveAll(dirPath)\n\t\t}()\n\n\t\terrs := validate.Var(dirPath, \"uds_exists\")\n\t\tNotEqual(t, errs, nil)\n\t\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"uds_exists\")\n\t})\n\n\t// only supported on linux\n\tt.Run(\"abstract_sockets\", func(t *testing.T) {\n\t\tif runtime.GOOS != \"linux\" {\n\t\t\treturn\n\t\t}\n\n\t\tt.Run(\"non_existent\", func(t *testing.T) {\n\t\t\terrs := validate.Var(\"@nonexistent_abstract_socket\", \"uds_exists\")\n\t\t\tNotEqual(t, errs, nil)\n\t\t\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"uds_exists\")\n\t\t})\n\n\t\tt.Run(\"existing\", func(t *testing.T) {\n\t\t\tabstractSockName := \"@test_abstract_socket_\" + fmt.Sprintf(\"%d\", time.Now().UnixNano())\n\t\t\tvar lc net.ListenConfig\n\t\t\tabstractListener, err := lc.Listen(t.Context(), \"unix\", \"\\x00\"+abstractSockName[1:])\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Failed to create abstract socket: %v\", err)\n\t\t\t}\n\t\t\tdefer func() {\n\t\t\t\t_ = abstractListener.Close()\n\t\t\t}()\n\n\t\t\terrs := validate.Var(abstractSockName, \"uds_exists\")\n\t\t\tEqual(t, errs, nil)\n\t\t})\n\t})\n}\n\nfunc TestSliceMapArrayChanFuncPtrInterfaceRequiredValidation(t *testing.T) {\n\tvalidate := New()\n\n\tvar m map[string]string\n\n\terrs := validate.Var(m, \"required\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"required\")\n\n\tm = map[string]string{}\n\terrs = validate.Var(m, \"required\")\n\tEqual(t, errs, nil)\n\n\tvar arr [5]string\n\terrs = validate.Var(arr, \"required\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"required\")\n\n\tarr[0] = \"ok\"\n\terrs = validate.Var(arr, \"required\")\n\tEqual(t, errs, nil)\n\n\tvar s []string\n\terrs = validate.Var(s, \"required\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"required\")\n\n\ts = []string{}\n\terrs = validate.Var(s, \"required\")\n\tEqual(t, errs, nil)\n\n\tvar c chan string\n\terrs = validate.Var(c, \"required\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"required\")\n\n\tc = make(chan string)\n\terrs = validate.Var(c, \"required\")\n\tEqual(t, errs, nil)\n\n\tvar tst *int\n\terrs = validate.Var(tst, \"required\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"required\")\n\n\tone := 1\n\ttst = &one\n\terrs = validate.Var(tst, \"required\")\n\tEqual(t, errs, nil)\n\n\tvar iface interface{}\n\n\terrs = validate.Var(iface, \"required\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"required\")\n\n\terrs = validate.Var(iface, \"omitempty,required\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(iface, \"\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(nil, iface, \"\")\n\tEqual(t, errs, nil)\n\n\tvar f func(string)\n\n\terrs = validate.Var(f, \"required\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"required\")\n\n\tf = func(name string) {}\n\n\terrs = validate.Var(f, \"required\")\n\tEqual(t, errs, nil)\n}\n\nfunc TestDatePtrValidationIssueValidation(t *testing.T) {\n\ttype Test struct {\n\t\tLastViewed *time.Time\n\t\tReminder   *time.Time\n\t}\n\n\ttest := &Test{}\n\n\tvalidate := New()\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n}\n\nfunc TestCommaAndPipeObfuscationValidation(t *testing.T) {\n\ts := \"My Name Is, |joeybloggs|\"\n\n\tvalidate := New()\n\n\terrs := validate.Var(s, \"excludesall=0x2C\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"excludesall\")\n\n\terrs = validate.Var(s, \"excludesall=0x7C\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"excludesall\")\n}\n\nfunc TestBadKeyValidation(t *testing.T) {\n\ttype Test struct {\n\t\tName string `validate:\"required, \"`\n\t}\n\n\ttst := &Test{\n\t\tName: \"test\",\n\t}\n\n\tvalidate := New()\n\n\tPanicMatches(t, func() { _ = validate.Struct(tst) }, \"Undefined validation function ' ' on field 'Name'\")\n\n\ttype Test2 struct {\n\t\tName string `validate:\"required,,len=2\"`\n\t}\n\n\ttst2 := &Test2{\n\t\tName: \"test\",\n\t}\n\n\tPanicMatches(t, func() { _ = validate.Struct(tst2) }, \"Invalid validation tag on field 'Name'\")\n}\n\nfunc TestInterfaceErrValidation(t *testing.T) {\n\tvar v2 interface{} = 1\n\tvar v1 = v2\n\n\tvalidate := New()\n\terrs := validate.Var(v1, \"len=1\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(v2, \"len=1\")\n\tEqual(t, errs, nil)\n\n\ttype ExternalCMD struct {\n\t\tUserid string      `json:\"userid\"`\n\t\tAction uint32      `json:\"action\"`\n\t\tData   interface{} `json:\"data,omitempty\" validate:\"required\"`\n\t}\n\n\ts := &ExternalCMD{\n\t\tUserid: \"123456\",\n\t\tAction: 10000,\n\t\t// Data:   1,\n\t}\n\n\terrs = validate.Struct(s)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"ExternalCMD.Data\", \"ExternalCMD.Data\", \"Data\", \"Data\", \"required\")\n\n\ttype ExternalCMD2 struct {\n\t\tUserid string      `json:\"userid\"`\n\t\tAction uint32      `json:\"action\"`\n\t\tData   interface{} `json:\"data,omitempty\" validate:\"len=1\"`\n\t}\n\n\ts2 := &ExternalCMD2{\n\t\tUserid: \"123456\",\n\t\tAction: 10000,\n\t\t// Data:   1,\n\t}\n\n\terrs = validate.Struct(s2)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"ExternalCMD2.Data\", \"ExternalCMD2.Data\", \"Data\", \"Data\", \"len\")\n\n\ts3 := &ExternalCMD2{\n\t\tUserid: \"123456\",\n\t\tAction: 10000,\n\t\tData:   2,\n\t}\n\n\terrs = validate.Struct(s3)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"ExternalCMD2.Data\", \"ExternalCMD2.Data\", \"Data\", \"Data\", \"len\")\n\n\ttype Inner struct {\n\t\tName string `validate:\"required\"`\n\t}\n\n\tinner := &Inner{\n\t\tName: \"\",\n\t}\n\n\ts4 := &ExternalCMD{\n\t\tUserid: \"123456\",\n\t\tAction: 10000,\n\t\tData:   inner,\n\t}\n\n\terrs = validate.Struct(s4)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"ExternalCMD.Data.Name\", \"ExternalCMD.Data.Name\", \"Name\", \"Name\", \"required\")\n\n\ttype TestMapStructPtr struct {\n\t\tErrs map[int]interface{} `validate:\"gt=0,dive,required\"`\n\t}\n\n\tmip := map[int]interface{}{0: &Inner{\"ok\"}, 3: nil, 4: &Inner{\"ok\"}}\n\n\tmsp := &TestMapStructPtr{\n\t\tErrs: mip,\n\t}\n\n\terrs = validate.Struct(msp)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"TestMapStructPtr.Errs[3]\", \"TestMapStructPtr.Errs[3]\", \"Errs[3]\", \"Errs[3]\", \"required\")\n\n\ttype TestMultiDimensionalStructs struct {\n\t\tErrs [][]interface{} `validate:\"gt=0,dive,dive\"`\n\t}\n\n\tvar errStructArray [][]interface{}\n\n\terrStructArray = append(errStructArray, []interface{}{&Inner{\"ok\"}, &Inner{\"\"}, &Inner{\"\"}})\n\terrStructArray = append(errStructArray, []interface{}{&Inner{\"ok\"}, &Inner{\"\"}, &Inner{\"\"}})\n\n\ttms := &TestMultiDimensionalStructs{\n\t\tErrs: errStructArray,\n\t}\n\n\terrs = validate.Struct(tms)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 4)\n\tAssertError(t, errs, \"TestMultiDimensionalStructs.Errs[0][1].Name\", \"TestMultiDimensionalStructs.Errs[0][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructs.Errs[0][2].Name\", \"TestMultiDimensionalStructs.Errs[0][2].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructs.Errs[1][1].Name\", \"TestMultiDimensionalStructs.Errs[1][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructs.Errs[1][2].Name\", \"TestMultiDimensionalStructs.Errs[1][2].Name\", \"Name\", \"Name\", \"required\")\n\n\ttype TestMultiDimensionalStructsPtr2 struct {\n\t\tErrs [][]*Inner `validate:\"gt=0,dive,dive,required\"`\n\t}\n\n\tvar errStructPtr2Array [][]*Inner\n\n\terrStructPtr2Array = append(errStructPtr2Array, []*Inner{{\"ok\"}, {\"\"}, {\"\"}})\n\terrStructPtr2Array = append(errStructPtr2Array, []*Inner{{\"ok\"}, {\"\"}, {\"\"}})\n\terrStructPtr2Array = append(errStructPtr2Array, []*Inner{{\"ok\"}, {\"\"}, nil})\n\n\ttmsp2 := &TestMultiDimensionalStructsPtr2{\n\t\tErrs: errStructPtr2Array,\n\t}\n\n\terrs = validate.Struct(tmsp2)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 6)\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr2.Errs[0][1].Name\", \"TestMultiDimensionalStructsPtr2.Errs[0][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr2.Errs[0][2].Name\", \"TestMultiDimensionalStructsPtr2.Errs[0][2].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr2.Errs[1][1].Name\", \"TestMultiDimensionalStructsPtr2.Errs[1][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr2.Errs[1][2].Name\", \"TestMultiDimensionalStructsPtr2.Errs[1][2].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr2.Errs[2][1].Name\", \"TestMultiDimensionalStructsPtr2.Errs[2][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr2.Errs[2][2]\", \"TestMultiDimensionalStructsPtr2.Errs[2][2]\", \"Errs[2][2]\", \"Errs[2][2]\", \"required\")\n\n\tm := map[int]interface{}{0: \"ok\", 3: \"\", 4: \"ok\"}\n\n\terrs = validate.Var(m, \"len=3,dive,len=2\")\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"[3]\", \"[3]\", \"[3]\", \"[3]\", \"len\")\n\n\terrs = validate.Var(m, \"len=2,dive,required\")\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"len\")\n\n\tarr := []interface{}{\"ok\", \"\", \"ok\"}\n\n\terrs = validate.Var(arr, \"len=3,dive,len=2\")\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"[1]\", \"[1]\", \"[1]\", \"[1]\", \"len\")\n\n\terrs = validate.Var(arr, \"len=2,dive,required\")\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"len\")\n\n\ttype MyStruct struct {\n\t\tA, B string\n\t\tC    interface{}\n\t}\n\n\tvar a MyStruct\n\n\ta.A = \"value\"\n\ta.C = \"nu\"\n\n\terrs = validate.Struct(a)\n\tEqual(t, errs, nil)\n}\n\nfunc TestMapDiveValidation(t *testing.T) {\n\tvalidate := New()\n\n\tn := map[int]interface{}{0: nil}\n\terrs := validate.Var(n, \"omitempty,required\")\n\tEqual(t, errs, nil)\n\n\tm := map[int]string{0: \"ok\", 3: \"\", 4: \"ok\"}\n\n\terrs = validate.Var(m, \"len=3,dive,required\")\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"[3]\", \"[3]\", \"[3]\", \"[3]\", \"required\")\n\n\terrs = validate.Var(m, \"len=2,dive,required\")\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"len\")\n\n\ttype Inner struct {\n\t\tName string `validate:\"required\"`\n\t}\n\n\ttype TestMapStruct struct {\n\t\tErrs map[int]Inner `validate:\"gt=0,dive\"`\n\t}\n\n\tmi := map[int]Inner{0: {\"ok\"}, 3: {\"\"}, 4: {\"ok\"}}\n\n\tms := &TestMapStruct{\n\t\tErrs: mi,\n\t}\n\n\terrs = validate.Struct(ms)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"TestMapStruct.Errs[3].Name\", \"TestMapStruct.Errs[3].Name\", \"Name\", \"Name\", \"required\")\n\n\t// for full test coverage\n\ts := fmt.Sprint(errs.Error())\n\tNotEqual(t, s, \"\")\n\n\ttype TestMapInterface struct {\n\t\tErrs map[int]interface{} `validate:\"dive\"`\n\t}\n\n\tmit := map[int]interface{}{0: Inner{\"ok\"}, 1: Inner{\"\"}, 3: nil, 5: \"string\", 6: 33}\n\n\tmsi := &TestMapInterface{\n\t\tErrs: mit,\n\t}\n\n\terrs = validate.Struct(msi)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"TestMapInterface.Errs[1].Name\", \"TestMapInterface.Errs[1].Name\", \"Name\", \"Name\", \"required\")\n\n\ttype TestMapTimeStruct struct {\n\t\tErrs map[int]*time.Time `validate:\"gt=0,dive,required\"`\n\t}\n\n\tt1 := time.Now().UTC()\n\n\tmta := map[int]*time.Time{0: &t1, 3: nil, 4: nil}\n\n\tmt := &TestMapTimeStruct{\n\t\tErrs: mta,\n\t}\n\n\terrs = validate.Struct(mt)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 2)\n\tAssertError(t, errs, \"TestMapTimeStruct.Errs[3]\", \"TestMapTimeStruct.Errs[3]\", \"Errs[3]\", \"Errs[3]\", \"required\")\n\tAssertError(t, errs, \"TestMapTimeStruct.Errs[4]\", \"TestMapTimeStruct.Errs[4]\", \"Errs[4]\", \"Errs[4]\", \"required\")\n\n\ttype TestMapStructPtr struct {\n\t\tErrs map[int]*Inner `validate:\"gt=0,dive,required\"`\n\t}\n\n\tmip := map[int]*Inner{0: {\"ok\"}, 3: nil, 4: {\"ok\"}}\n\n\tmsp := &TestMapStructPtr{\n\t\tErrs: mip,\n\t}\n\n\terrs = validate.Struct(msp)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"TestMapStructPtr.Errs[3]\", \"TestMapStructPtr.Errs[3]\", \"Errs[3]\", \"Errs[3]\", \"required\")\n\n\ttype TestMapStructPtr2 struct {\n\t\tErrs map[int]*Inner `validate:\"gt=0,dive,omitempty,required\"`\n\t}\n\n\tmip2 := map[int]*Inner{0: {\"ok\"}, 3: nil, 4: {\"ok\"}}\n\n\tmsp2 := &TestMapStructPtr2{\n\t\tErrs: mip2,\n\t}\n\n\terrs = validate.Struct(msp2)\n\tEqual(t, errs, nil)\n\n\tv2 := New()\n\tv2.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\n\t\treturn name\n\t})\n\n\ttype MapDiveJSONTest struct {\n\t\tMap map[string]string `validate:\"required,gte=1,dive,gte=1\" json:\"MyName\"`\n\t}\n\n\tmdjt := &MapDiveJSONTest{\n\t\tMap: map[string]string{\n\t\t\t\"Key1\": \"Value1\",\n\t\t\t\"Key2\": \"\",\n\t\t},\n\t}\n\n\terr := v2.Struct(mdjt)\n\tNotEqual(t, err, nil)\n\n\terrs = err.(ValidationErrors)\n\tfe := getError(errs, \"MapDiveJSONTest.MyName[Key2]\", \"MapDiveJSONTest.Map[Key2]\")\n\tNotEqual(t, fe, nil)\n\tEqual(t, fe.Tag(), \"gte\")\n\tEqual(t, fe.ActualTag(), \"gte\")\n\tEqual(t, fe.Field(), \"MyName[Key2]\")\n\tEqual(t, fe.StructField(), \"Map[Key2]\")\n}\n\nfunc TestArrayDiveValidation(t *testing.T) {\n\tvalidate := New()\n\n\tarr := []string{\"ok\", \"\", \"ok\"}\n\n\terrs := validate.Var(arr, \"len=3,dive,required\")\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"[1]\", \"[1]\", \"[1]\", \"[1]\", \"required\")\n\n\terrs = validate.Var(arr, \"len=2,dive,required\")\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"len\")\n\n\ttype BadDive struct {\n\t\tName string `validate:\"dive\"`\n\t}\n\n\tbd := &BadDive{\n\t\tName: \"TEST\",\n\t}\n\n\tPanicMatches(t, func() { _ = validate.Struct(bd) }, \"dive error! can't dive on a non slice or map\")\n\n\ttype Test struct {\n\t\tErrs []string `validate:\"gt=0,dive,required\"`\n\t}\n\n\ttest := &Test{\n\t\tErrs: []string{\"ok\", \"\", \"ok\"},\n\t}\n\n\terrs = validate.Struct(test)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"Test.Errs[1]\", \"Test.Errs[1]\", \"Errs[1]\", \"Errs[1]\", \"required\")\n\n\ttest = &Test{\n\t\tErrs: []string{\"ok\", \"ok\", \"\"},\n\t}\n\n\terrs = validate.Struct(test)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"Test.Errs[2]\", \"Test.Errs[2]\", \"Errs[2]\", \"Errs[2]\", \"required\")\n\n\ttype TestMultiDimensional struct {\n\t\tErrs [][]string `validate:\"gt=0,dive,dive,required\"`\n\t}\n\n\tvar errArray [][]string\n\n\terrArray = append(errArray, []string{\"ok\", \"\", \"\"})\n\terrArray = append(errArray, []string{\"ok\", \"\", \"\"})\n\n\ttm := &TestMultiDimensional{\n\t\tErrs: errArray,\n\t}\n\n\terrs = validate.Struct(tm)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 4)\n\tAssertError(t, errs, \"TestMultiDimensional.Errs[0][1]\", \"TestMultiDimensional.Errs[0][1]\", \"Errs[0][1]\", \"Errs[0][1]\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensional.Errs[0][2]\", \"TestMultiDimensional.Errs[0][2]\", \"Errs[0][2]\", \"Errs[0][2]\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensional.Errs[1][1]\", \"TestMultiDimensional.Errs[1][1]\", \"Errs[1][1]\", \"Errs[1][1]\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensional.Errs[1][2]\", \"TestMultiDimensional.Errs[1][2]\", \"Errs[1][2]\", \"Errs[1][2]\", \"required\")\n\n\ttype Inner struct {\n\t\tName string `validate:\"required\"`\n\t}\n\n\ttype TestMultiDimensionalStructs struct {\n\t\tErrs [][]Inner `validate:\"gt=0,dive,dive\"`\n\t}\n\n\tvar errStructArray [][]Inner\n\n\terrStructArray = append(errStructArray, []Inner{{\"ok\"}, {\"\"}, {\"\"}})\n\terrStructArray = append(errStructArray, []Inner{{\"ok\"}, {\"\"}, {\"\"}})\n\n\ttms := &TestMultiDimensionalStructs{\n\t\tErrs: errStructArray,\n\t}\n\n\terrs = validate.Struct(tms)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 4)\n\tAssertError(t, errs, \"TestMultiDimensionalStructs.Errs[0][1].Name\", \"TestMultiDimensionalStructs.Errs[0][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructs.Errs[0][2].Name\", \"TestMultiDimensionalStructs.Errs[0][2].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructs.Errs[1][1].Name\", \"TestMultiDimensionalStructs.Errs[1][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructs.Errs[1][2].Name\", \"TestMultiDimensionalStructs.Errs[1][2].Name\", \"Name\", \"Name\", \"required\")\n\n\ttype TestMultiDimensionalStructsPtr struct {\n\t\tErrs [][]*Inner `validate:\"gt=0,dive,dive\"`\n\t}\n\n\tvar errStructPtrArray [][]*Inner\n\n\terrStructPtrArray = append(errStructPtrArray, []*Inner{{\"ok\"}, {\"\"}, {\"\"}})\n\terrStructPtrArray = append(errStructPtrArray, []*Inner{{\"ok\"}, {\"\"}, {\"\"}})\n\terrStructPtrArray = append(errStructPtrArray, []*Inner{{\"ok\"}, {\"\"}, nil})\n\n\ttmsp := &TestMultiDimensionalStructsPtr{\n\t\tErrs: errStructPtrArray,\n\t}\n\n\terrs = validate.Struct(tmsp)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 5)\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr.Errs[0][1].Name\", \"TestMultiDimensionalStructsPtr.Errs[0][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr.Errs[0][2].Name\", \"TestMultiDimensionalStructsPtr.Errs[0][2].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr.Errs[1][1].Name\", \"TestMultiDimensionalStructsPtr.Errs[1][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr.Errs[1][2].Name\", \"TestMultiDimensionalStructsPtr.Errs[1][2].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr.Errs[2][1].Name\", \"TestMultiDimensionalStructsPtr.Errs[2][1].Name\", \"Name\", \"Name\", \"required\")\n\n\t// for full test coverage\n\ts := fmt.Sprint(errs.Error())\n\tNotEqual(t, s, \"\")\n\n\ttype TestMultiDimensionalStructsPtr2 struct {\n\t\tErrs [][]*Inner `validate:\"gt=0,dive,dive,required\"`\n\t}\n\n\tvar errStructPtr2Array [][]*Inner\n\n\terrStructPtr2Array = append(errStructPtr2Array, []*Inner{{\"ok\"}, {\"\"}, {\"\"}})\n\terrStructPtr2Array = append(errStructPtr2Array, []*Inner{{\"ok\"}, {\"\"}, {\"\"}})\n\terrStructPtr2Array = append(errStructPtr2Array, []*Inner{{\"ok\"}, {\"\"}, nil})\n\n\ttmsp2 := &TestMultiDimensionalStructsPtr2{\n\t\tErrs: errStructPtr2Array,\n\t}\n\n\terrs = validate.Struct(tmsp2)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 6)\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr2.Errs[0][1].Name\", \"TestMultiDimensionalStructsPtr2.Errs[0][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr2.Errs[0][2].Name\", \"TestMultiDimensionalStructsPtr2.Errs[0][2].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr2.Errs[1][1].Name\", \"TestMultiDimensionalStructsPtr2.Errs[1][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr2.Errs[1][2].Name\", \"TestMultiDimensionalStructsPtr2.Errs[1][2].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr2.Errs[2][1].Name\", \"TestMultiDimensionalStructsPtr2.Errs[2][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr2.Errs[2][2]\", \"TestMultiDimensionalStructsPtr2.Errs[2][2]\", \"Errs[2][2]\", \"Errs[2][2]\", \"required\")\n\n\ttype TestMultiDimensionalStructsPtr3 struct {\n\t\tErrs [][]*Inner `validate:\"gt=0,dive,dive,omitempty\"`\n\t}\n\n\tvar errStructPtr3Array [][]*Inner\n\n\terrStructPtr3Array = append(errStructPtr3Array, []*Inner{{\"ok\"}, {\"\"}, {\"\"}})\n\terrStructPtr3Array = append(errStructPtr3Array, []*Inner{{\"ok\"}, {\"\"}, {\"\"}})\n\terrStructPtr3Array = append(errStructPtr3Array, []*Inner{{\"ok\"}, {\"\"}, nil})\n\n\ttmsp3 := &TestMultiDimensionalStructsPtr3{\n\t\tErrs: errStructPtr3Array,\n\t}\n\n\terrs = validate.Struct(tmsp3)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 5)\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr3.Errs[0][1].Name\", \"TestMultiDimensionalStructsPtr3.Errs[0][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr3.Errs[0][2].Name\", \"TestMultiDimensionalStructsPtr3.Errs[0][2].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr3.Errs[1][1].Name\", \"TestMultiDimensionalStructsPtr3.Errs[1][1].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr3.Errs[1][2].Name\", \"TestMultiDimensionalStructsPtr3.Errs[1][2].Name\", \"Name\", \"Name\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalStructsPtr3.Errs[2][1].Name\", \"TestMultiDimensionalStructsPtr3.Errs[2][1].Name\", \"Name\", \"Name\", \"required\")\n\n\ttype TestMultiDimensionalTimeTime struct {\n\t\tErrs [][]*time.Time `validate:\"gt=0,dive,dive,required\"`\n\t}\n\n\tvar errTimePtr3Array [][]*time.Time\n\n\tt1 := time.Now().UTC()\n\tt2 := time.Now().UTC()\n\tt3 := time.Now().UTC().Add(time.Hour * 24)\n\n\terrTimePtr3Array = append(errTimePtr3Array, []*time.Time{&t1, &t2, &t3})\n\terrTimePtr3Array = append(errTimePtr3Array, []*time.Time{&t1, &t2, nil})\n\terrTimePtr3Array = append(errTimePtr3Array, []*time.Time{&t1, nil, nil})\n\n\ttmtp3 := &TestMultiDimensionalTimeTime{\n\t\tErrs: errTimePtr3Array,\n\t}\n\n\terrs = validate.Struct(tmtp3)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 3)\n\tAssertError(t, errs, \"TestMultiDimensionalTimeTime.Errs[1][2]\", \"TestMultiDimensionalTimeTime.Errs[1][2]\", \"Errs[1][2]\", \"Errs[1][2]\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalTimeTime.Errs[2][1]\", \"TestMultiDimensionalTimeTime.Errs[2][1]\", \"Errs[2][1]\", \"Errs[2][1]\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalTimeTime.Errs[2][2]\", \"TestMultiDimensionalTimeTime.Errs[2][2]\", \"Errs[2][2]\", \"Errs[2][2]\", \"required\")\n\n\ttype TestMultiDimensionalTimeTime2 struct {\n\t\tErrs [][]*time.Time `validate:\"gt=0,dive,dive,required\"`\n\t}\n\n\tvar errTimeArray [][]*time.Time\n\n\tt1 = time.Now().UTC()\n\tt2 = time.Now().UTC()\n\tt3 = time.Now().UTC().Add(time.Hour * 24)\n\n\terrTimeArray = append(errTimeArray, []*time.Time{&t1, &t2, &t3})\n\terrTimeArray = append(errTimeArray, []*time.Time{&t1, &t2, nil})\n\terrTimeArray = append(errTimeArray, []*time.Time{&t1, nil, nil})\n\n\ttmtp := &TestMultiDimensionalTimeTime2{\n\t\tErrs: errTimeArray,\n\t}\n\n\terrs = validate.Struct(tmtp)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 3)\n\tAssertError(t, errs, \"TestMultiDimensionalTimeTime2.Errs[1][2]\", \"TestMultiDimensionalTimeTime2.Errs[1][2]\", \"Errs[1][2]\", \"Errs[1][2]\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalTimeTime2.Errs[2][1]\", \"TestMultiDimensionalTimeTime2.Errs[2][1]\", \"Errs[2][1]\", \"Errs[2][1]\", \"required\")\n\tAssertError(t, errs, \"TestMultiDimensionalTimeTime2.Errs[2][2]\", \"TestMultiDimensionalTimeTime2.Errs[2][2]\", \"Errs[2][2]\", \"Errs[2][2]\", \"required\")\n}\n\nfunc TestNilStructPointerValidation(t *testing.T) {\n\ttype Inner struct {\n\t\tData string\n\t}\n\n\ttype Outer struct {\n\t\tInner *Inner `validate:\"omitempty\"`\n\t}\n\n\tinner := &Inner{\n\t\tData: \"test\",\n\t}\n\n\touter := &Outer{\n\t\tInner: inner,\n\t}\n\n\tvalidate := New()\n\terrs := validate.Struct(outer)\n\tEqual(t, errs, nil)\n\n\touter = &Outer{\n\t\tInner: nil,\n\t}\n\n\terrs = validate.Struct(outer)\n\tEqual(t, errs, nil)\n\n\ttype Inner2 struct {\n\t\tData string\n\t}\n\n\ttype Outer2 struct {\n\t\tInner2 *Inner2 `validate:\"required\"`\n\t}\n\n\tinner2 := &Inner2{\n\t\tData: \"test\",\n\t}\n\n\touter2 := &Outer2{\n\t\tInner2: inner2,\n\t}\n\n\terrs = validate.Struct(outer2)\n\tEqual(t, errs, nil)\n\n\touter2 = &Outer2{\n\t\tInner2: nil,\n\t}\n\n\terrs = validate.Struct(outer2)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Outer2.Inner2\", \"Outer2.Inner2\", \"Inner2\", \"Inner2\", \"required\")\n\n\ttype Inner3 struct {\n\t\tData string\n\t}\n\n\ttype Outer3 struct {\n\t\tInner3 *Inner3\n\t}\n\n\tinner3 := &Inner3{\n\t\tData: \"test\",\n\t}\n\n\touter3 := &Outer3{\n\t\tInner3: inner3,\n\t}\n\n\terrs = validate.Struct(outer3)\n\tEqual(t, errs, nil)\n\n\ttype Inner4 struct {\n\t\tData string\n\t}\n\n\ttype Outer4 struct {\n\t\tInner4 *Inner4 `validate:\"-\"`\n\t}\n\n\tinner4 := &Inner4{\n\t\tData: \"test\",\n\t}\n\n\touter4 := &Outer4{\n\t\tInner4: inner4,\n\t}\n\n\terrs = validate.Struct(outer4)\n\tEqual(t, errs, nil)\n}\n\nfunc TestSSNValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"00-90-8787\", false},\n\t\t{\"66690-76\", false},\n\t\t{\"191 60 2869\", true},\n\t\t{\"191-60-2869\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"ssn\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d SSN failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d SSN failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"ssn\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d Latitude failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestLongitudeValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    interface{}\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"-180.000\", true},\n\t\t{\"180.1\", false},\n\t\t{\"+73.234\", true},\n\t\t{\"+382.3811\", false},\n\t\t{\"23.11111111\", true},\n\t\t{uint(180), true},\n\t\t{float32(-180.0), true},\n\t\t{-180, true},\n\t\t{180.1, false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"longitude\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d Longitude failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d Longitude failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"longitude\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d Longitude failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() { _ = validate.Var(true, \"longitude\") }, \"Bad field type bool\")\n}\n\nfunc TestLatitudeValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    interface{}\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"-90.000\", true},\n\t\t{\"+90\", true},\n\t\t{\"47.1231231\", true},\n\t\t{\"+99.9\", false},\n\t\t{\"108\", false},\n\t\t{uint(90), true},\n\t\t{float32(-90.0), true},\n\t\t{-90, true},\n\t\t{90.1, false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"latitude\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d Latitude failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d Latitude failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"latitude\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d Latitude failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() { _ = validate.Var(true, \"latitude\") }, \"Bad field type bool\")\n}\n\nfunc TestDataURIValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"data:image/png;base64,TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4=\", true},\n\t\t{\"data:text/plain;base64,Vml2YW11cyBmZXJtZW50dW0gc2VtcGVyIHBvcnRhLg==\", true},\n\t\t{\"image/gif;base64,U3VzcGVuZGlzc2UgbGVjdHVzIGxlbw==\", false},\n\t\t{\n\t\t\t\"data:image/gif;base64,MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuMPNS1Ufof9EW/M98FNw\" +\n\t\t\t\t\"UAKrwflsqVxaxQjBQnHQmiI7Vac40t8x7pIb8gLGV6wL7sBTJiPovJ0V7y7oc0Ye\" +\n\t\t\t\t\"rhKh0Rm4skP2z/jHwwZICgGzBvA0rH8xlhUiTvcwDCJ0kc+fh35hNt8srZQM4619\" +\n\t\t\t\t\"FTgB66Xmp4EtVyhpQV+t02g6NzK72oZI0vnAvqhpkxLeLiMCyrI416wHm5Tkukhx\" +\n\t\t\t\t\"QmcL2a6hNOyu0ixX/x2kSFXApEnVrJ+/IxGyfyw8kf4N2IZpW5nEP847lpfj0SZZ\" +\n\t\t\t\t\"Fwrd1mnfnDbYohX2zRptLy2ZUn06Qo9pkG5ntvFEPo9bfZeULtjYzIl6K8gJ2uGZ\" + \"HQIDAQAB\", true,\n\t\t},\n\t\t{\"data:image/png;base64,12345\", false},\n\t\t{\"\", false},\n\t\t{\"data:text,:;base85,U3VzcGVuZGlzc2UgbGVjdHVzIGxlbw==\", false},\n\t\t{\"data:image/jpeg;key=value;base64,UEsDBBQAAAAI\", true},\n\t\t{\"data:image/jpeg;key=value,UEsDBBQAAAAI\", true},\n\t\t{\"data:;base64;sdfgsdfgsdfasdfa=s,UEsDBBQAAAAI\", true},\n\t\t{\"data:,UEsDBBQAAAAI\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"datauri\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d DataURI failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d DataURI failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"datauri\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d DataURI failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestMultibyteValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", true},\n\t\t{\"abc\", false},\n\t\t{\"123\", false},\n\t\t{\"<>@;.-=\", false},\n\t\t{\"ひらがな・カタカナ、．漢字\", true},\n\t\t{\"あいうえお foobar\", true},\n\t\t{\"test＠example.com\", true},\n\t\t{\"test＠example.com\", true},\n\t\t{\"1234abcDEｘｙｚ\", true},\n\t\t{\"ｶﾀｶﾅ\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"multibyte\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d Multibyte failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d Multibyte failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"multibyte\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d Multibyte failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestPrintableASCIIValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    interface{}\n\t\texpected bool\n\t}{\n\t\t{\"\", true},\n\t\t{\"ｆｏｏbar\", false},\n\t\t{\"ｘｙｚ０９８\", false},\n\t\t{\"１２３456\", false},\n\t\t{\"ｶﾀｶﾅ\", false},\n\t\t{\"foobar\", true},\n\t\t{\"0987654321\", true},\n\t\t{\"test@example.com\", true},\n\t\t{\"1234abcDEF\", true},\n\t\t{\"newline\\n\", false},\n\t\t{\"\\x19test\\x7F\", false},\n\t\t{[]int{3000}, false},\n\t\t{1, false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"printascii\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d Printable ASCII failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d Printable ASCII failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"printascii\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d Printable ASCII failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestASCIIValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    interface{}\n\t\texpected bool\n\t}{\n\t\t{\"\", true},\n\t\t{\"ｆｏｏbar\", false},\n\t\t{\"ｘｙｚ０９８\", false},\n\t\t{\"１２３456\", false},\n\t\t{\"ｶﾀｶﾅ\", false},\n\t\t{\"foobar\", true},\n\t\t{\"0987654321\", true},\n\t\t{\"test@example.com\", true},\n\t\t{\"1234abcDEF\", true},\n\t\t{\"\", true},\n\t\t{[]int{3000}, false},\n\t\t{1, false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"ascii\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ASCII failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ASCII failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"ascii\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d ASCII failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestUUID5Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"xxxa987fbc9-4bed-3078-cf07-9141ba07c9f3\", false},\n\t\t{\"9c858901-8a57-4791-81fe-4c455b099bc9\", false},\n\t\t{\"a987fbc9-4bed-3078-cf07-9141ba07c9f3\", false},\n\t\t{\"987fbc97-4bed-5078-af07-9141ba07c9f3\", true},\n\t\t{\"987fbc97-4bed-5078-9f07-9141ba07c9f3\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"uuid5\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID5 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID5 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"uuid5\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d UUID5 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestUUID4Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"xxxa987fbc9-4bed-3078-cf07-9141ba07c9f3\", false},\n\t\t{\"a987fbc9-4bed-5078-af07-9141ba07c9f3\", false},\n\t\t{\"934859\", false},\n\t\t{\"57b73598-8764-4ad0-a76a-679bb6640eb1\", true},\n\t\t{\"625e63f3-58f5-40b7-83a1-a72ad31acffb\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"uuid4\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID4 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID4 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"uuid4\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d UUID4 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestUUID3Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"412452646\", false},\n\t\t{\"xxxa987fbc9-4bed-3078-cf07-9141ba07c9f3\", false},\n\t\t{\"a987fbc9-4bed-4078-8f07-9141ba07c9f3\", false},\n\t\t{\"a987fbc9-4bed-3078-cf07-9141ba07c9f3\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"uuid3\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID3 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID3 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"uuid3\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d UUID3 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\ntype uuidTestType struct {\n\tval string\n}\n\nfunc (u uuidTestType) String() string {\n\treturn u.val\n}\n\ntype uuidAlias string\n\nfunc (u uuidAlias) String() string {\n\treturn \"This is a UUID \" + string(u)\n}\n\nvar (\n\t_ fmt.Stringer = uuidTestType{}\n\t_ fmt.Stringer = uuidAlias(\"\")\n)\n\nfunc TestUUIDValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"xxxa987fbc9-4bed-3078-cf07-9141ba07c9f3\", false},\n\t\t{\"a987fbc9-4bed-3078-cf07-9141ba07c9f3xxx\", false},\n\t\t{\"a987fbc94bed3078cf079141ba07c9f3\", false},\n\t\t{\"934859\", false},\n\t\t{\"987fbc9-4bed-3078-cf07a-9141ba07c9f3\", false},\n\t\t{\"aaaaaaaa-1111-1111-aaag-111111111111\", false},\n\t\t{\"a987fbc9-4bed-3078-cf07-9141ba07c9f3\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"uuid\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"uuid\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d UUID failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Test UUID validation on uuid structs type that implements Stringer interface.\n\tstructWithValidUUID := struct {\n\t\tUUID uuidTestType `validate:\"uuid\"`\n\t}{\n\t\tUUID: uuidTestType{val: \"a987fbc9-4bed-3078-cf07-9141ba07c9f3\"},\n\t}\n\tstructWithInvalidUUID := struct {\n\t\tUUID uuidTestType `validate:\"uuid\"`\n\t}{\n\t\tUUID: uuidTestType{val: \"934859\"},\n\t}\n\n\tif err := validate.Struct(structWithValidUUID); err != nil {\n\t\tt.Fatalf(\"UUID failed Error: %s\", err)\n\t}\n\tif err := validate.Struct(structWithInvalidUUID); err == nil {\n\t\tt.Fatal(\"UUID failed Error expected but received nil\")\n\t}\n\n\t// Test on Alias type with Stringer interface.\n\talias := uuidAlias(\"a987fbc9-4bed-3078-cf07-9141ba07c9f3\")\n\tif err := validate.Var(alias, \"uuid\"); err != nil {\n\t\tt.Fatalf(\"UUID failed Error: %s\", err)\n\t}\n}\n\nfunc TestUUID5RFC4122Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"xxxa987Fbc9-4bed-3078-cf07-9141ba07c9f3\", false},\n\t\t{\"9c858901-8a57-4791-81Fe-4c455b099bc9\", false},\n\t\t{\"a987Fbc9-4bed-3078-cf07-9141ba07c9f3\", false},\n\t\t{\"987Fbc97-4bed-5078-af07-9141ba07c9f3\", true},\n\t\t{\"987Fbc97-4bed-5078-9f07-9141ba07c9f3\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"uuid5_rfc4122\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID5RFC4122 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID5RFC4122 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"uuid5_rfc4122\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d UUID5RFC4122 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestUUID4RFC4122Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"xxxa987fbc9-4bed-3078-cf07-9141ba07c9F3\", false},\n\t\t{\"a987fbc9-4bed-5078-af07-9141ba07c9F3\", false},\n\t\t{\"934859\", false},\n\t\t{\"57b73598-8764-4ad0-a76A-679bb6640eb1\", true},\n\t\t{\"625e63f3-58f5-40b7-83a1-a72ad31acFfb\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"uuid4_rfc4122\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID4RFC4122 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID4RFC4122 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"uuid4_rfc4122\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d UUID4RFC4122 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestUUID3RFC4122Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"412452646\", false},\n\t\t{\"xxxa987fbc9-4bed-3078-cf07-9141ba07c9F3\", false},\n\t\t{\"a987fbc9-4bed-4078-8f07-9141ba07c9F3\", false},\n\t\t{\"a987fbc9-4bed-3078-cf07-9141ba07c9F3\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"uuid3_rfc4122\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID3RFC4122 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUID3RFC4122 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"uuid3_rfc4122\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d UUID3RFC4122 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestUUIDRFC4122Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"xxxa987Fbc9-4bed-3078-cf07-9141ba07c9f3\", false},\n\t\t{\"a987Fbc9-4bed-3078-cf07-9141ba07c9f3xxx\", false},\n\t\t{\"a987Fbc94bed3078cf079141ba07c9f3\", false},\n\t\t{\"934859\", false},\n\t\t{\"987fbc9-4bed-3078-cf07a-9141ba07c9F3\", false},\n\t\t{\"aaaaaaaa-1111-1111-aaaG-111111111111\", false},\n\t\t{\"a987Fbc9-4bed-3078-cf07-9141ba07c9f3\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"uuid_rfc4122\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUIDRFC4122 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d UUIDRFC4122 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"uuid_rfc4122\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d UUIDRFC4122 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestULIDValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"01BX5ZZKBKACT-V9WEVGEMMVRZ\", false},\n\t\t{\"01bx5zzkbkactav9wevgemmvrz\", true},\n\t\t{\"a987Fbc9-4bed-3078-cf07-9141ba07c9f3xxx\", false},\n\t\t{\"01BX5ZZKBKACTAV9WEVGEMMVRZABC\", false},\n\t\t{\"01BX5ZZKBKACTAV9WEVGEMMVRZABC\", false},\n\t\t{\"0IBX5ZZKBKACTAV9WEVGEMMVRZ\", false},\n\t\t{\"O1BX5ZZKBKACTAV9WEVGEMMVRZ\", false},\n\t\t{\"01BX5ZZKBKACTAVLWEVGEMMVRZ\", false},\n\t\t{\"01BX5ZZKBKACTAV9WEVGEMMVRZ\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"ulid\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ULID failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ULID failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"ulid\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d ULID failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestMD4Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc4\", true},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc-\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc41\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dcC\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"md4\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d MD4 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d MD4 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"md4\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d MD4 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestMD5Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc4\", true},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc-\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc41\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dcC\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"md5\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d MD5 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d MD5 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"md5\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d MD5 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestSHA256Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc4\", true},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc-\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc41\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dcC\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"sha256\")\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d SHA256 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d SHA256 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"sha256\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d SHA256 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestSHA384Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc4\", true},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc-\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc41\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dcC\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"sha384\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d SHA384 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d SHA384 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"sha384\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d SHA384 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestSHA512Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc4\", true},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc-\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc41\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dcC\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc46f5902ac237024bdd0c176cb93063dc\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"sha512\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d SHA512 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d SHA512 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"sha512\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d SHA512 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestRIPEMD128Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc4\", true},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc-\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc41\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dcC\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"ripemd128\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d RIPEMD128 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d RIPEMD128 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"ripemd128\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d RIPEMD128 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestRIPEMD160Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"6f5902ac6f5902ac237024bdd0c176cb93063dc4\", true},\n\t\t{\"6f5902ac6f5902ac237024bdd0c176cb93063dc-\", false},\n\t\t{\"6f5902ac6f5902ac237024bdd0c176cb93063dc41\", false},\n\t\t{\"6f5902ac6f5902ac237024bdd0c176cb93063dcC\", false},\n\t\t{\"6f5902ac6f5902ac237024bdd0c176cb93063dc\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"ripemd160\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d RIPEMD160 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d RIPEMD160 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"ripemd160\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d RIPEMD160 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestTIGER128Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc4\", true},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc-\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc41\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dcC\", false},\n\t\t{\"6f5902ac237024bdd0c176cb93063dc\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"tiger128\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d TIGER128 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d TIGER128 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"tiger128\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d TIGER128 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestTIGER160Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"6f5902ac6f5902ac237024bdd0c176cb93063dc4\", true},\n\t\t{\"6f5902ac6f5902ac237024bdd0c176cb93063dc-\", false},\n\t\t{\"6f5902ac6f5902ac237024bdd0c176cb93063dc41\", false},\n\t\t{\"6f5902ac6f5902ac237024bdd0c176cb93063dcC\", false},\n\t\t{\"6f5902ac6f5902ac237024bdd0c176cb93063dc\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"tiger160\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d TIGER160 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d TIGER160 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"tiger160\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d TIGER160 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestTIGER192Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"6f5902ac237024bd6f5902ac237024bdd0c176cb93063dc4\", true},\n\t\t{\"6f5902ac237024bd6f5902ac237024bdd0c176cb93063dc-\", false},\n\t\t{\"6f5902ac237024bd6f5902ac237024bdd0c176cb93063dc41\", false},\n\t\t{\"6f5902ac237024bd6f5902ac237024bdd0c176cb93063dcC\", false},\n\t\t{\"6f5902ac237024bd6f5902ac237024bdd0c176cb93063dc\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"tiger192\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d TIGER192 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d TIGER192 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"tiger192\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d TIGER192 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestISBNValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"foo\", false},\n\t\t{\"3836221195\", true},\n\t\t{\"1-61729-085-8\", true},\n\t\t{\"3 423 21412 0\", true},\n\t\t{\"3 401 01319 X\", true},\n\t\t{\"9784873113685\", true},\n\t\t{\"978-4-87311-368-5\", true},\n\t\t{\"978 3401013190\", true},\n\t\t{\"978-3-8362-2119-1\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"isbn\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ISBN failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ISBN failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"isbn\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d ISBN failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestISBN13Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"foo\", false},\n\t\t{\"3-8362-2119-5\", false},\n\t\t{\"01234567890ab\", false},\n\t\t{\"978 3 8362 2119 0\", false},\n\t\t{\"9784873113685\", true},\n\t\t{\"978-4-87311-368-5\", true},\n\t\t{\"978 3401013190\", true},\n\t\t{\"978-3-8362-2119-1\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"isbn13\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ISBN13 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ISBN13 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"isbn13\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d ISBN13 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestISBN10Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"foo\", false},\n\t\t{\"3423214121\", false},\n\t\t{\"978-3836221191\", false},\n\t\t{\"3-423-21412-1\", false},\n\t\t{\"3 423 21412 1\", false},\n\t\t{\"3836221195\", true},\n\t\t{\"1-61729-085-8\", true},\n\t\t{\"3 423 21412 0\", true},\n\t\t{\"3 401 01319 X\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"isbn10\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ISBN10 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ISBN10 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"isbn10\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d ISBN10 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestISSNValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"foo\", false},\n\t\t{\"20519990\", false},\n\t\t{\"2051-9991\", false},\n\t\t{\"2051-999X\", false},\n\t\t{\"1050-124X\", true},\n\t\t{\"0317-8471\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"issn\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ISSN failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ISSN failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"issn\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d ISSN failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestExcludesRuneValidation(t *testing.T) {\n\ttests := []struct {\n\t\tValue       string `validate:\"excludesrune=☻\"`\n\t\tTag         string\n\t\tExpectedNil bool\n\t}{\n\t\t{Value: \"a☺b☻c☹d\", Tag: \"excludesrune=☻\", ExpectedNil: false},\n\t\t{Value: \"abcd\", Tag: \"excludesrune=☻\", ExpectedNil: true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, s := range tests {\n\t\terrs := validate.Var(s.Value, s.Tag)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\n\t\terrs = validate.Struct(s)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\t}\n}\n\nfunc TestExcludesAllValidation(t *testing.T) {\n\ttests := []struct {\n\t\tValue       string `validate:\"excludesall=@!{}[]\"`\n\t\tTag         string\n\t\tExpectedNil bool\n\t}{\n\t\t{Value: \"abcd@!jfk\", Tag: \"excludesall=@!{}[]\", ExpectedNil: false},\n\t\t{Value: \"abcdefg\", Tag: \"excludesall=@!{}[]\", ExpectedNil: true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, s := range tests {\n\t\terrs := validate.Var(s.Value, s.Tag)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\n\t\terrs = validate.Struct(s)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\t}\n\n\tusername := \"joeybloggs \"\n\n\terrs := validate.Var(username, \"excludesall=@ \")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"excludesall\")\n\n\texcluded := \",\"\n\n\terrs = validate.Var(excluded, \"excludesall=!@#$%^&*()_+.0x2C?\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"excludesall\")\n\n\texcluded = \"=\"\n\n\terrs = validate.Var(excluded, \"excludesall=!@#$%^&*()_+.0x2C=?\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"excludesall\")\n}\n\nfunc TestExcludesValidation(t *testing.T) {\n\ttests := []struct {\n\t\tValue       string `validate:\"excludes=@\"`\n\t\tTag         string\n\t\tExpectedNil bool\n\t}{\n\t\t{Value: \"abcd@!jfk\", Tag: \"excludes=@\", ExpectedNil: false},\n\t\t{Value: \"abcdq!jfk\", Tag: \"excludes=@\", ExpectedNil: true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, s := range tests {\n\t\terrs := validate.Var(s.Value, s.Tag)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\n\t\terrs = validate.Struct(s)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\t}\n}\n\nfunc TestContainsRuneValidation(t *testing.T) {\n\ttests := []struct {\n\t\tValue       string `validate:\"containsrune=☻\"`\n\t\tTag         string\n\t\tExpectedNil bool\n\t}{\n\t\t{Value: \"a☺b☻c☹d\", Tag: \"containsrune=☻\", ExpectedNil: true},\n\t\t{Value: \"abcd\", Tag: \"containsrune=☻\", ExpectedNil: false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, s := range tests {\n\t\terrs := validate.Var(s.Value, s.Tag)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\n\t\terrs = validate.Struct(s)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\t}\n}\n\nfunc TestContainsAnyValidation(t *testing.T) {\n\ttests := []struct {\n\t\tValue       string `validate:\"containsany=@!{}[]\"`\n\t\tTag         string\n\t\tExpectedNil bool\n\t}{\n\t\t{Value: \"abcd@!jfk\", Tag: \"containsany=@!{}[]\", ExpectedNil: true},\n\t\t{Value: \"abcdefg\", Tag: \"containsany=@!{}[]\", ExpectedNil: false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, s := range tests {\n\t\terrs := validate.Var(s.Value, s.Tag)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\n\t\terrs = validate.Struct(s)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\t}\n}\n\nfunc TestContainsValidation(t *testing.T) {\n\ttests := []struct {\n\t\tValue       string `validate:\"contains=@\"`\n\t\tTag         string\n\t\tExpectedNil bool\n\t}{\n\t\t{Value: \"abcd@!jfk\", Tag: \"contains=@\", ExpectedNil: true},\n\t\t{Value: \"abcdq!jfk\", Tag: \"contains=@\", ExpectedNil: false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, s := range tests {\n\t\terrs := validate.Var(s.Value, s.Tag)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\n\t\terrs = validate.Struct(s)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\t}\n}\n\nfunc TestIsNeFieldValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\tvar j uint64\n\tvar k float64\n\ts := \"abcd\"\n\ti := 1\n\tj = 1\n\tk = 1.543\n\tb := true\n\tarr := []string{\"test\"}\n\tnow := time.Now().UTC()\n\n\tvar j2 uint64\n\tvar k2 float64\n\ts2 := \"abcdef\"\n\ti2 := 3\n\tj2 = 2\n\tk2 = 1.5434456\n\tb2 := false\n\tarr2 := []string{\"test\", \"test2\"}\n\tarr3 := []string{\"test\"}\n\tnow2 := now\n\n\terrs = validate.VarWithValue(s, s2, \"nefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(i2, i, \"nefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(j2, j, \"nefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(k2, k, \"nefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(b2, b, \"nefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(arr2, arr, \"nefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(now2, now, \"nefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"nefield\")\n\n\terrs = validate.VarWithValue(arr3, arr, \"nefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"nefield\")\n\n\ttype Test struct {\n\t\tStart *time.Time `validate:\"nefield=End\"`\n\t\tEnd   *time.Time\n\t}\n\n\tsv := &Test{\n\t\tStart: &now,\n\t\tEnd:   &now,\n\t}\n\n\terrs = validate.Struct(sv)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.Start\", \"Test.Start\", \"Start\", \"Start\", \"nefield\")\n\n\tnow3 := time.Now().Add(time.Hour).UTC()\n\n\tsv = &Test{\n\t\tStart: &now,\n\t\tEnd:   &now3,\n\t}\n\n\terrs = validate.Struct(sv)\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(nil, 1, \"nefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"nefield\")\n\n\terrs = validate.VarWithValue(sv, now, \"nefield\")\n\tEqual(t, errs, nil)\n\n\ttype Test2 struct {\n\t\tStart *time.Time `validate:\"nefield=NonExistantField\"`\n\t\tEnd   *time.Time\n\t}\n\n\tsv2 := &Test2{\n\t\tStart: &now,\n\t\tEnd:   &now,\n\t}\n\n\terrs = validate.Struct(sv2)\n\tEqual(t, errs, nil)\n\n\ttype Other struct {\n\t\tValue string\n\t}\n\n\ttype Test3 struct {\n\t\tValue Other\n\t\tTime  time.Time `validate:\"nefield=Value\"`\n\t}\n\n\ttst := Test3{\n\t\tValue: Other{Value: \"StringVal\"},\n\t\tTime:  now,\n\t}\n\n\terrs = validate.Struct(tst)\n\tEqual(t, errs, nil)\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for variables of time.Duration type.\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour-time.Minute, \"nefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour+time.Minute, \"nefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour, \"nefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"nefield\")\n\n\terrs = validate.VarWithValue(time.Duration(0), time.Duration(0), \"omitempty,nefield\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with time.Duration type fields.\n\n\ttype TimeDurationTest struct {\n\t\tFirst  time.Duration `validate:\"nefield=Second\"`\n\t\tSecond time.Duration\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour - time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour + time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.First\", \"TimeDurationTest.First\", \"First\", \"First\", \"nefield\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tFirst  time.Duration `validate:\"omitempty,nefield=Second\"`\n\t\tSecond time.Duration\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0), time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestIsNeValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\tvar j uint64\n\tvar k float64\n\ts := \"abcdef\"\n\ti := 3\n\tj = 2\n\tk = 1.5434\n\tarr := []string{\"test\"}\n\tnow := time.Now().UTC()\n\n\terrs = validate.Var(s, \"ne=abcd\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(i, \"ne=1\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(j, \"ne=1\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(k, \"ne=1.543\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(arr, \"ne=2\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(arr, \"ne=1\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ne\")\n\n\tPanicMatches(t, func() { _ = validate.Var(now, \"ne=now\") }, \"Bad field type time.Time\")\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for a variable of time.Duration type.\n\n\terrs = validate.Var(time.Hour-time.Minute, \"ne=1h\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour+time.Minute, \"ne=1h\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour, \"ne=1h\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ne\")\n\n\terrs = validate.Var(time.Duration(0), \"omitempty,ne=0\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with a time.Duration type field.\n\n\ttype TimeDurationTest struct {\n\t\tDuration time.Duration `validate:\"ne=1h\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour - time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour + time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"ne\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tDuration time.Duration `validate:\"omitempty,ne=0\"`\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestIsNeIgnoreCaseValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\ts := \"abcd\"\n\tnow := time.Now()\n\n\terrs = validate.Var(s, \"ne_ignore_case=efgh\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(s, \"ne_ignore_case=AbCd\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ne_ignore_case\")\n\n\tPanicMatches(\n\t\tt, func() { _ = validate.Var(now, \"ne_ignore_case=abcd\") }, \"Bad field type time.Time\",\n\t)\n}\n\nfunc TestIsEqFieldValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\tvar j uint64\n\tvar k float64\n\ts := \"abcd\"\n\ti := 1\n\tj = 1\n\tk = 1.543\n\tb := true\n\tarr := []string{\"test\"}\n\tnow := time.Now().UTC()\n\n\tvar j2 uint64\n\tvar k2 float64\n\ts2 := \"abcd\"\n\ti2 := 1\n\tj2 = 1\n\tk2 = 1.543\n\tb2 := true\n\tarr2 := []string{\"test\"}\n\tarr3 := []string{\"test\", \"test2\"}\n\tnow2 := now\n\n\terrs = validate.VarWithValue(s, s2, \"eqfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(i2, i, \"eqfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(j2, j, \"eqfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(k2, k, \"eqfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(b2, b, \"eqfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(arr2, arr, \"eqfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(now2, now, \"eqfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(arr3, arr, \"eqfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"eqfield\")\n\n\ttype Test struct {\n\t\tStart *time.Time `validate:\"eqfield=End\"`\n\t\tEnd   *time.Time\n\t}\n\n\tsv := &Test{\n\t\tStart: &now,\n\t\tEnd:   &now,\n\t}\n\n\terrs = validate.Struct(sv)\n\tEqual(t, errs, nil)\n\n\tnow3 := time.Now().Add(time.Hour).UTC()\n\n\tsv = &Test{\n\t\tStart: &now,\n\t\tEnd:   &now3,\n\t}\n\n\terrs = validate.Struct(sv)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.Start\", \"Test.Start\", \"Start\", \"Start\", \"eqfield\")\n\n\terrs = validate.VarWithValue(nil, 1, \"eqfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"eqfield\")\n\n\tchannel := make(chan string)\n\terrs = validate.VarWithValue(5, channel, \"eqfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"eqfield\")\n\n\terrs = validate.VarWithValue(5, now, \"eqfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"eqfield\")\n\n\ttype Test2 struct {\n\t\tStart *time.Time `validate:\"eqfield=NonExistantField\"`\n\t\tEnd   *time.Time\n\t}\n\n\tsv2 := &Test2{\n\t\tStart: &now,\n\t\tEnd:   &now,\n\t}\n\n\terrs = validate.Struct(sv2)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test2.Start\", \"Test2.Start\", \"Start\", \"Start\", \"eqfield\")\n\n\ttype Inner struct {\n\t\tName string\n\t}\n\n\ttype TStruct struct {\n\t\tInner     *Inner\n\t\tCreatedAt *time.Time `validate:\"eqfield=Inner\"`\n\t}\n\n\tinner := &Inner{\n\t\tName: \"NAME\",\n\t}\n\n\ttest := &TStruct{\n\t\tInner:     inner,\n\t\tCreatedAt: &now,\n\t}\n\n\terrs = validate.Struct(test)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TStruct.CreatedAt\", \"TStruct.CreatedAt\", \"CreatedAt\", \"CreatedAt\", \"eqfield\")\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for variables of time.Duration type.\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour, \"eqfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour-time.Minute, \"eqfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"eqfield\")\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour+time.Minute, \"eqfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"eqfield\")\n\n\terrs = validate.VarWithValue(time.Duration(0), time.Hour, \"omitempty,eqfield\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with time.Duration type fields.\n\n\ttype TimeDurationTest struct {\n\t\tFirst  time.Duration `validate:\"eqfield=Second\"`\n\t\tSecond time.Duration\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour - time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.First\", \"TimeDurationTest.First\", \"First\", \"First\", \"eqfield\")\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour + time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.First\", \"TimeDurationTest.First\", \"First\", \"First\", \"eqfield\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tFirst  time.Duration `validate:\"omitempty,eqfield=Second\"`\n\t\tSecond time.Duration\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0), time.Hour}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestIsEqFieldValidationWithAliasTime(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\ttype CustomTime time.Time\n\n\ttype Test struct {\n\t\tStart CustomTime `validate:\"eqfield=End\"`\n\t\tEnd   *time.Time\n\t}\n\n\tnow := time.Now().UTC()\n\n\tsv := &Test{\n\t\tStart: CustomTime(now),\n\t\tEnd:   &now,\n\t}\n\n\terrs = validate.Struct(sv)\n\tEqual(t, errs, nil)\n}\n\nfunc TestIsEqValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\tvar j uint64\n\tvar k float64\n\ts := \"abcd\"\n\ti := 1\n\tj = 1\n\tk = 1.543\n\tarr := []string{\"test\"}\n\tnow := time.Now().UTC()\n\n\terrs = validate.Var(s, \"eq=abcd\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(i, \"eq=1\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(j, \"eq=1\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(k, \"eq=1.543\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(arr, \"eq=1\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(arr, \"eq=2\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"eq\")\n\n\tPanicMatches(t, func() { _ = validate.Var(now, \"eq=now\") }, \"Bad field type time.Time\")\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for a variable of time.Duration type.\n\n\terrs = validate.Var(time.Hour, \"eq=1h\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour-time.Minute, \"eq=1h\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"eq\")\n\n\terrs = validate.Var(time.Hour+time.Minute, \"eq=1h\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"eq\")\n\n\terrs = validate.Var(time.Duration(0), \"omitempty,eq=1h\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with a time.Duration type field.\n\n\ttype TimeDurationTest struct {\n\t\tDuration time.Duration `validate:\"eq=1h\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour - time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"eq\")\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour + time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"eq\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tDuration time.Duration `validate:\"omitempty,eq=1h\"`\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestIsEqIgnoreCaseValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\ts := \"abcd\"\n\tnow := time.Now()\n\n\terrs = validate.Var(s, \"eq_ignore_case=abcd\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(s, \"eq_ignore_case=AbCd\")\n\tEqual(t, errs, nil)\n\n\tPanicMatches(\n\t\tt, func() { _ = validate.Var(now, \"eq_ignore_case=abcd\") }, \"Bad field type time.Time\",\n\t)\n}\n\nfunc TestOneOfValidation(t *testing.T) {\n\tvalidate := New()\n\n\tpassSpecs := []struct {\n\t\tf interface{}\n\t\tt string\n\t}{\n\t\t{f: \"red\", t: \"oneof=red green\"},\n\t\t{f: \"green\", t: \"oneof=red green\"},\n\t\t{f: \"red green\", t: \"oneof='red green' blue\"},\n\t\t{f: \"blue\", t: \"oneof='red green' blue\"},\n\t\t{f: 5, t: \"oneof=5 6\"},\n\t\t{f: 6, t: \"oneof=5 6\"},\n\t\t{f: int8(6), t: \"oneof=5 6\"},\n\t\t{f: int16(6), t: \"oneof=5 6\"},\n\t\t{f: int32(6), t: \"oneof=5 6\"},\n\t\t{f: int64(6), t: \"oneof=5 6\"},\n\t\t{f: uint(6), t: \"oneof=5 6\"},\n\t\t{f: uint8(6), t: \"oneof=5 6\"},\n\t\t{f: uint16(6), t: \"oneof=5 6\"},\n\t\t{f: uint32(6), t: \"oneof=5 6\"},\n\t\t{f: uint64(6), t: \"oneof=5 6\"},\n\t}\n\n\tfor _, spec := range passSpecs {\n\t\tt.Logf(\"%#v\", spec)\n\t\terrs := validate.Var(spec.f, spec.t)\n\t\tEqual(t, errs, nil)\n\t}\n\n\tfailSpecs := []struct {\n\t\tf interface{}\n\t\tt string\n\t}{\n\t\t{f: \"\", t: \"oneof=red green\"},\n\t\t{f: \"yellow\", t: \"oneof=red green\"},\n\t\t{f: \"green\", t: \"oneof='red green' blue\"},\n\t\t{f: 5, t: \"oneof=red green\"},\n\t\t{f: 6, t: \"oneof=red green\"},\n\t\t{f: 6, t: \"oneof=7\"},\n\t\t{f: uint(6), t: \"oneof=7\"},\n\t\t{f: int8(5), t: \"oneof=red green\"},\n\t\t{f: int16(5), t: \"oneof=red green\"},\n\t\t{f: int32(5), t: \"oneof=red green\"},\n\t\t{f: int64(5), t: \"oneof=red green\"},\n\t\t{f: uint(5), t: \"oneof=red green\"},\n\t\t{f: uint8(5), t: \"oneof=red green\"},\n\t\t{f: uint16(5), t: \"oneof=red green\"},\n\t\t{f: uint32(5), t: \"oneof=red green\"},\n\t\t{f: uint64(5), t: \"oneof=red green\"},\n\t}\n\n\tfor _, spec := range failSpecs {\n\t\tt.Logf(\"%#v\", spec)\n\t\terrs := validate.Var(spec.f, spec.t)\n\t\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"oneof\")\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var(3.14, \"oneof=red green\")\n\t}, \"Bad field type float64\")\n}\n\nfunc TestOneOfCIValidation(t *testing.T) {\n\tvalidate := New()\n\n\tpassSpecs := []struct {\n\t\tf interface{}\n\t\tt string\n\t}{\n\t\t{f: \"red\", t: \"oneofci=RED GREEN\"},\n\t\t{f: \"RED\", t: \"oneofci=red green\"},\n\t\t{f: \"red\", t: \"oneofci=red green\"},\n\t\t{f: \"RED\", t: \"oneofci=RED GREEN\"},\n\t\t{f: \"green\", t: \"oneofci=red green\"},\n\t\t{f: \"red green\", t: \"oneofci='red green' blue\"},\n\t\t{f: \"blue\", t: \"oneofci='red green' blue\"},\n\t\t{f: \"GREEN\", t: \"oneofci=Red Green\"},\n\t\t{f: \"ReD\", t: \"oneofci=RED GREEN\"},\n\t\t{f: \"gReEn\", t: \"oneofci=rEd GrEeN\"},\n\t\t{f: \"RED GREEN\", t: \"oneofci='red green' blue\"},\n\t\t{f: \"red Green\", t: \"oneofci='RED GREEN' Blue\"},\n\t\t{f: \"Red green\", t: \"oneofci='Red Green' BLUE\"},\n\t\t{f: \"rEd GrEeN\", t: \"oneofci='ReD gReEn' BlUe\"},\n\t\t{f: \"BLUE\", t: \"oneofci='Red Green' BLUE\"},\n\t\t{f: \"BlUe\", t: \"oneofci='RED GREEN' Blue\"},\n\t\t{f: \"bLuE\", t: \"oneofci='red green' BLUE\"},\n\t}\n\n\tfor _, spec := range passSpecs {\n\t\tt.Logf(\"%#v\", spec)\n\t\terrs := validate.Var(spec.f, spec.t)\n\t\tEqual(t, errs, nil)\n\t}\n\n\tfailSpecs := []struct {\n\t\tf interface{}\n\t\tt string\n\t}{\n\t\t{f: \"\", t: \"oneofci=red green\"},\n\t\t{f: \"yellow\", t: \"oneofci=red green\"},\n\t\t{f: \"green\", t: \"oneofci='red green' blue\"},\n\t}\n\n\tfor _, spec := range failSpecs {\n\t\tt.Logf(\"%#v\", spec)\n\t\terrs := validate.Var(spec.f, spec.t)\n\t\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"oneofci\")\n\t}\n\n\tpanicSpecs := []struct {\n\t\tf interface{}\n\t\tt string\n\t}{\n\t\t{f: 3.14, t: \"oneofci=red green\"},\n\t\t{f: 5, t: \"oneofci=red green\"},\n\t\t{f: uint(6), t: \"oneofci=7\"},\n\t\t{f: int8(5), t: \"oneofci=red green\"},\n\t\t{f: int16(5), t: \"oneofci=red green\"},\n\t\t{f: int32(5), t: \"oneofci=red green\"},\n\t\t{f: int64(5), t: \"oneofci=red green\"},\n\t\t{f: uint(5), t: \"oneofci=red green\"},\n\t\t{f: uint8(5), t: \"oneofci=red green\"},\n\t\t{f: uint16(5), t: \"oneofci=red green\"},\n\t\t{f: uint32(5), t: \"oneofci=red green\"},\n\t\t{f: uint64(5), t: \"oneofci=red green\"},\n\t}\n\n\tpanicCount := 0\n\tfor _, spec := range panicSpecs {\n\t\tt.Logf(\"%#v\", spec)\n\t\tPanicMatches(t, func() {\n\t\t\t_ = validate.Var(spec.f, spec.t)\n\t\t}, fmt.Sprintf(\"Bad field type %T\", spec.f))\n\t\tpanicCount++\n\t}\n\tEqual(t, panicCount, len(panicSpecs))\n}\n\nfunc TestBase32Validation(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"ABCD2345\"\n\terrs := validate.Var(s, \"base32\")\n\tEqual(t, errs, nil)\n\n\ts = \"AB======\"\n\terrs = validate.Var(s, \"base32\")\n\tEqual(t, errs, nil)\n\n\ts = \"ABCD2===\"\n\terrs = validate.Var(s, \"base32\")\n\tEqual(t, errs, nil)\n\n\ts = \"ABCD====\"\n\terrs = validate.Var(s, \"base32\")\n\tEqual(t, errs, nil)\n\n\ts = \"ABCD234=\"\n\terrs = validate.Var(s, \"base32\")\n\tEqual(t, errs, nil)\n\n\ts = \"\"\n\terrs = validate.Var(s, \"base32\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"base32\")\n\n\ts = \"ABCabc1890== foo bar\"\n\terrs = validate.Var(s, \"base32\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"base32\")\n}\n\nfunc TestBase64Validation(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"dW5pY29ybg==\"\n\n\terrs := validate.Var(s, \"base64\")\n\tEqual(t, errs, nil)\n\n\ts = \"dGhpIGlzIGEgdGVzdCBiYXNlNjQ=\"\n\terrs = validate.Var(s, \"base64\")\n\tEqual(t, errs, nil)\n\n\ts = \"\"\n\terrs = validate.Var(s, \"base64\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"base64\")\n\n\ts = \"dW5pY29ybg== foo bar\"\n\terrs = validate.Var(s, \"base64\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"base64\")\n}\n\nfunc TestBase64URLValidation(t *testing.T) {\n\tvalidate := New()\n\n\ttestCases := []struct {\n\t\tdecoded, encoded string\n\t\tsuccess          bool\n\t}{\n\t\t// empty string, although a valid base64 string, should fail\n\t\t{\"\", \"\", false},\n\t\t// invalid length\n\t\t{\"\", \"a\", false},\n\t\t// base64 with padding\n\t\t{\"f\", \"Zg==\", true},\n\t\t{\"fo\", \"Zm8=\", true},\n\t\t// base64 without padding\n\t\t{\"foo\", \"Zm9v\", true},\n\t\t{\"\", \"Zg\", false},\n\t\t{\"\", \"Zm8\", false},\n\t\t// base64 URL safe encoding with invalid, special characters '+' and '/'\n\t\t{\"\\x14\\xfb\\x9c\\x03\\xd9\\x7e\", \"FPucA9l+\", false},\n\t\t{\"\\x14\\xfb\\x9c\\x03\\xf9\\x73\", \"FPucA/lz\", false},\n\t\t// base64 URL safe encoding with valid, special characters '-' and '_'\n\t\t{\"\\x14\\xfb\\x9c\\x03\\xd9\\x7e\", \"FPucA9l-\", true},\n\t\t{\"\\x14\\xfb\\x9c\\x03\\xf9\\x73\", \"FPucA_lz\", true},\n\t\t// non base64 characters\n\t\t{\"\", \"@mc=\", false},\n\t\t{\"\", \"Zm 9\", false},\n\t}\n\tfor _, tc := range testCases {\n\t\terr := validate.Var(tc.encoded, \"base64url\")\n\t\tif tc.success {\n\t\t\tEqual(t, err, nil)\n\t\t\t// make sure encoded value is decoded back to the expected value\n\t\t\td, innerErr := base64.URLEncoding.DecodeString(tc.encoded)\n\t\t\tEqual(t, innerErr, nil)\n\t\t\tEqual(t, tc.decoded, string(d))\n\t\t} else {\n\t\t\tNotEqual(t, err, nil)\n\t\t\tif len(tc.encoded) > 0 {\n\t\t\t\t// make sure that indeed the encoded value was faulty\n\t\t\t\t_, err := base64.URLEncoding.DecodeString(tc.encoded)\n\t\t\t\tNotEqual(t, err, nil)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestBase64RawURLValidation(t *testing.T) {\n\tvalidate := New()\n\n\ttestCases := []struct {\n\t\tdecoded, encoded string\n\t\tsuccess          bool\n\t}{\n\t\t// empty string, although a valid base64 string, should fail\n\t\t{\"\", \"\", false},\n\t\t// invalid length\n\t\t{\"\", \"a\", false},\n\t\t// base64 with padding should fail\n\t\t{\"f\", \"Zg==\", false},\n\t\t{\"fo\", \"Zm8=\", false},\n\t\t// base64 without padding\n\t\t{\"foo\", \"Zm9v\", true},\n\t\t{\"hello\", \"aGVsbG8\", true},\n\t\t{\"\", \"aGVsb\", false},\n\t\t// // base64 URL safe encoding with invalid, special characters '+' and '/'\n\t\t{\"\\x14\\xfb\\x9c\\x03\\xd9\\x7e\", \"FPucA9l+\", false},\n\t\t{\"\\x14\\xfb\\x9c\\x03\\xf9\\x73\", \"FPucA/lz\", false},\n\t\t// // base64 URL safe encoding with valid, special characters '-' and '_'\n\t\t{\"\\x14\\xfb\\x9c\\x03\\xd9\\x7e\", \"FPucA9l-\", true},\n\t\t{\"\\x14\\xfb\\x9c\\x03\\xf9\\x73\", \"FPucA_lz\", true},\n\t\t// non base64 characters\n\t\t{\"\", \"@mc=\", false},\n\t\t{\"\", \"Zm 9\", false},\n\t}\n\tfor _, tc := range testCases {\n\t\terr := validate.Var(tc.encoded, \"base64rawurl\")\n\t\tif tc.success {\n\t\t\tEqual(t, err, nil)\n\t\t\t// make sure encoded value is decoded back to the expected value\n\t\t\td, innerErr := base64.RawURLEncoding.DecodeString(tc.encoded)\n\t\t\tEqual(t, innerErr, nil)\n\t\t\tEqual(t, tc.decoded, string(d))\n\t\t} else {\n\t\t\tNotEqual(t, err, nil)\n\t\t\tif len(tc.encoded) > 0 {\n\t\t\t\t// make sure that indeed the encoded value was faulty\n\t\t\t\t_, err := base64.RawURLEncoding.DecodeString(tc.encoded)\n\t\t\t\tNotEqual(t, err, nil)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestFileValidation(t *testing.T) {\n\tvalidate := New()\n\n\ttests := []struct {\n\t\ttitle    string\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"empty path\", \"\", false},\n\t\t{\"regular file\", filepath.Join(\"testdata\", \"a.go\"), true},\n\t\t{\"missing file\", filepath.Join(\"testdata\", \"no.go\"), false},\n\t\t{\"directory, not a file\", \"testdata\", false},\n\t}\n\n\tfor _, test := range tests {\n\t\terrs := validate.Var(test.param, \"file\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Test: '%s' failed Error: %s\", test.title, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Test: '%s' failed Error: %s\", test.title, errs)\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var(6, \"file\")\n\t}, \"Bad field type int\")\n}\n\nfunc TestImageValidation(t *testing.T) {\n\tvalidate := New()\n\n\ttmpDir := t.TempDir()\n\n\tpaths := map[string]string{\n\t\t\"empty\":     \"\",\n\t\t\"directory\": \"testdata\",\n\t\t\"missing\":   filepath.Join(tmpDir, \"none.png\"),\n\t\t\"png\":       filepath.Join(tmpDir, \"image.png\"),\n\t\t\"jpeg\":      filepath.Join(tmpDir, \"image.jpg\"),\n\t\t\"mp3\":       filepath.Join(tmpDir, \"music.mp3\"),\n\t}\n\n\ttests := []struct {\n\t\ttitle        string\n\t\tparam        string\n\t\texpected     bool\n\t\tcreateImage  func()\n\t\tdestroyImage func()\n\t}{\n\t\t{\n\t\t\t\"empty path\",\n\t\t\tpaths[\"empty\"], false,\n\t\t\tfunc() {},\n\t\t\tfunc() {},\n\t\t},\n\t\t{\n\t\t\t\"directory, not a file\",\n\t\t\tpaths[\"directory\"],\n\t\t\tfalse,\n\t\t\tfunc() {},\n\t\t\tfunc() {},\n\t\t},\n\t\t{\n\t\t\t\"missing file\",\n\t\t\tpaths[\"missing\"],\n\t\t\tfalse,\n\t\t\tfunc() {},\n\t\t\tfunc() {},\n\t\t},\n\t\t{\n\t\t\t\"valid png\",\n\t\t\tpaths[\"png\"],\n\t\t\ttrue,\n\t\t\tfunc() {\n\t\t\t\timg := image.NewRGBA(image.Rectangle{image.Point{0, 0}, image.Point{10, 10}})\n\t\t\t\tf, err := os.Create(paths[\"png\"])\n\t\t\t\tEqual(t, err, nil)\n\t\t\t\tdefer func() {\n\t\t\t\t\t_ = f.Close()\n\t\t\t\t}()\n\n\t\t\t\terr = png.Encode(f, img)\n\t\t\t\tEqual(t, err, nil)\n\t\t\t},\n\t\t\tfunc() {\n\t\t\t\terr := os.Remove(paths[\"png\"])\n\t\t\t\tEqual(t, err, nil)\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"valid jpeg\",\n\t\t\tpaths[\"jpeg\"],\n\t\t\ttrue,\n\t\t\tfunc() {\n\t\t\t\tvar opt jpeg.Options\n\t\t\t\timg := image.NewGray(image.Rect(0, 0, 10, 10))\n\t\t\t\tf, err := os.Create(paths[\"jpeg\"])\n\t\t\t\tEqual(t, err, nil)\n\t\t\t\tdefer func() {\n\t\t\t\t\t_ = f.Close()\n\t\t\t\t}()\n\n\t\t\t\terr = jpeg.Encode(f, img, &opt)\n\t\t\t\tEqual(t, err, nil)\n\t\t\t},\n\t\t\tfunc() {\n\t\t\t\terr := os.Remove(paths[\"jpeg\"])\n\t\t\t\tEqual(t, err, nil)\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t\"valid mp3\",\n\t\t\tpaths[\"mp3\"],\n\t\t\tfalse,\n\t\t\tfunc() {},\n\t\t\tfunc() {},\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\ttest.createImage()\n\t\terrs := validate.Var(test.param, \"image\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Test: '%s' failed Error: %s\", test.title, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Test: '%s' failed Error: %s\", test.title, errs)\n\t\t\t}\n\t\t}\n\t\ttest.destroyImage()\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var(6, \"image\")\n\t}, \"Bad field type int\")\n}\n\nfunc TestFilePathValidation(t *testing.T) {\n\tvalidate := New()\n\n\ttests := []struct {\n\t\ttitle    string\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"empty filepath\", \"\", false},\n\t\t{\"valid filepath\", filepath.Join(\"testdata\", \"a.go\"), true},\n\t\t{\"invalid filepath\", filepath.Join(\"testdata\", \"no\\000.go\"), false},\n\t\t{\"directory, not a filepath\", \"testdata\" + string(os.PathSeparator), false},\n\t\t{\"directory\", \"testdata\", false},\n\t}\n\n\tfor _, test := range tests {\n\t\terrs := validate.Var(test.param, \"filepath\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Test: '%s' failed Error: %s\", test.title, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Test: '%s' failed Error: %s\", test.title, errs)\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var(6, \"filepath\")\n\t}, \"Bad field type int\")\n}\n\nfunc TestEthereumAddressValidation(t *testing.T) {\n\tvalidate := New()\n\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t// All caps.\n\t\t{\"0x52908400098527886E0F7030069857D2E4169EE7\", true},\n\t\t{\"0x8617E340B3D01FA5F11F306F4090FD50E238070D\", true},\n\n\t\t// All lower.\n\t\t{\"0xde709f2102306220921060314715629080e2fb77\", true},\n\t\t{\"0x27b1fdb04752bbc536007a920d24acb045561c26\", true},\n\t\t{\"0x123f681646d4a755815f9cb19e1acc8565a0c2ac\", true},\n\n\t\t// Mixed case: runs checksum validation.\n\t\t{\"0x02F9AE5f22EA3fA88F05780B30385bECFacbf130\", true},\n\t\t{\"0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed\", true},\n\t\t{\"0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359\", true},\n\t\t{\"0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB\", true},\n\t\t{\"0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb\", true},\n\t\t{\"0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDB\", true}, // Invalid checksum, but valid address.\n\n\t\t// Other.\n\t\t{\"\", false},\n\t\t{\"D1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb\", false},    // Missing \"0x\" prefix.\n\t\t{\"0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDbc\", false}, // More than 40 hex digits.\n\t\t{\"0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aD\", false},   // Less than 40 hex digits.\n\t\t{\"0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDw\", false},  // Invalid hex digit \"w\".\n\t}\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"eth_addr\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d eth_addr failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d eth_addr failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"eth_addr\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d Latitude failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestEthereumAddressChecksumValidation(t *testing.T) {\n\tvalidate := New()\n\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t// All caps.\n\t\t{\"0x52908400098527886E0F7030069857D2E4169EE7\", true},\n\t\t{\"0x8617E340B3D01FA5F11F306F4090FD50E238070D\", true},\n\n\t\t// All lower.\n\t\t{\"0x27b1fdb04752bbc536007a920d24acb045561c26\", true},\n\t\t{\"0x123f681646d4a755815f9cb19e1acc8565a0c2ac\", false},\n\n\t\t// Mixed case: runs checksum validation.\n\t\t{\"0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb\", true},\n\t\t{\"0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDB\", false}, // Invalid checksum.\n\t\t{\"0x000000000000000000000000000000000000dead\", false}, // Invalid checksum.\n\t\t{\"0x000000000000000000000000000000000000dEaD\", true},  // Valid checksum.\n\n\t\t// Other.\n\t\t{\"\", false},\n\t\t{\"D1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb\", false},    // Missing \"0x\" prefix.\n\t\t{\"0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDbc\", false}, // More than 40 hex digits.\n\t\t{\"0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aD\", false},   // Less than 40 hex digits.\n\t\t{\"0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDw\", false},  // Invalid hex digit \"w\".\n\t}\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"eth_addr_checksum\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d eth_addr_checksum failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d eth_addr_checksum failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"eth_addr_checksum\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d Latitude failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestBitcoinAddressValidation(t *testing.T) {\n\tvalidate := New()\n\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"x\", false},\n\t\t{\"0x02F9AE5f22EA3fA88F05780B30385bEC\", false},\n\t\t{\"1A1zP1ePQGefi2DMPTifTL5SLmv7DivfNa\", false},\n\t\t{\"1P9RQEr2XeE3PEb44ZE35sfZRRW1JH8Uqx\", false},\n\t\t{\"3P14159I73E4gFr7JterCCQh9QjiTjiZrG\", false},\n\t\t{\"3P141597f3E4gFr7JterCCQh9QjiTjiZrG\", false},\n\t\t{\"37qgekLpCCHrQuSjvX3fs496FWTGsHFHizjJAs6NPcR47aefnnCWECAhHV6E3g4YN7u7Yuwod5Y\", false},\n\t\t{\"dzb7VV1Ui55BARxv7ATxAtCUeJsANKovDGWFVgpTbhq9gvPqP3yv\", false},\n\t\t{\"MuNu7ZAEDFiHthiunm7dPjwKqrVNCM3mAz6rP9zFveQu14YA8CxExSJTHcVP9DErn6u84E6Ej7S\", false},\n\t\t{\"rPpQpYknyNQ5AEHuY6H8ijJJrYc2nDKKk9jjmKEXsWzyAQcFGpDLU2Zvsmoi8JLR7hAwoy3RQWf\", false},\n\t\t{\"4Uc3FmN6NQ6zLBK5QQBXRBUREaaHwCZYsGCueHauuDmJpZKn6jkEskMB2Zi2CNgtb5r6epWEFfUJq\", false},\n\t\t{\"7aQgR5DFQ25vyXmqZAWmnVCjL3PkBcdVkBUpjrjMTcghHx3E8wb\", false},\n\t\t{\"17QpPprjeg69fW1DV8DcYYCKvWjYhXvWkov6MJ1iTTvMFj6weAqW7wybZeH57WTNxXVCRH4veVs\", false},\n\t\t{\"KxuACDviz8Xvpn1xAh9MfopySZNuyajYMZWz16Dv2mHHryznWUp3\", false},\n\t\t{\"7nK3GSmqdXJQtdohvGfJ7KsSmn3TmGqExug49583bDAL91pVSGq5xS9SHoAYL3Wv3ijKTit65th\", false},\n\t\t{\"cTivdBmq7bay3RFGEBBuNfMh2P1pDCgRYN2Wbxmgwr4ki3jNUL2va\", false},\n\t\t{\"gjMV4vjNjyMrna4fsAr8bWxAbwtmMUBXJS3zL4NJt5qjozpbQLmAfK1uA3CquSqsZQMpoD1g2nk\", false},\n\t\t{\"emXm1naBMoVzPjbk7xpeTVMFy4oDEe25UmoyGgKEB1gGWsK8kRGs\", false},\n\t\t{\"7VThQnNRj1o3Zyvc7XHPRrjDf8j2oivPTeDXnRPYWeYGE4pXeRJDZgf28ppti5hsHWXS2GSobdqyo\", false},\n\t\t{\"1G9u6oCVCPh2o8m3t55ACiYvG1y5BHewUkDSdiQarDcYXXhFHYdzMdYfUAhfxn5vNZBwpgUNpso\", false},\n\t\t{\"31QQ7ZMLkScDiB4VyZjuptr7AEc9j1SjstF7pRoLhHTGkW4Q2y9XELobQmhhWxeRvqcukGd1XCq\", false},\n\t\t{\"DHqKSnpxa8ZdQyH8keAhvLTrfkyBMQxqngcQA5N8LQ9KVt25kmGN\", false},\n\t\t{\"2LUHcJPbwLCy9GLH1qXmfmAwvadWw4bp4PCpDfduLqV17s6iDcy1imUwhQJhAoNoN1XNmweiJP4i\", false},\n\t\t{\"7USRzBXAnmck8fX9HmW7RAb4qt92VFX6soCnts9s74wxm4gguVhtG5of8fZGbNPJA83irHVY6bCos\", false},\n\t\t{\"1DGezo7BfVebZxAbNT3XGujdeHyNNBF3vnficYoTSp4PfK2QaML9bHzAMxke3wdKdHYWmsMTJVu\", false},\n\t\t{\"2D12DqDZKwCxxkzs1ZATJWvgJGhQ4cFi3WrizQ5zLAyhN5HxuAJ1yMYaJp8GuYsTLLxTAz6otCfb\", false},\n\t\t{\"8AFJzuTujXjw1Z6M3fWhQ1ujDW7zsV4ePeVjVo7D1egERqSW9nZ\", false},\n\t\t{\"163Q17qLbTCue8YY3AvjpUhotuaodLm2uqMhpYirsKjVqnxJRWTEoywMVY3NbBAHuhAJ2cF9GAZ\", false},\n\t\t{\"2MnmgiRH4eGLyLc9eAqStzk7dFgBjFtUCtu\", false},\n\t\t{\"461QQ2sYWxU7H2PV4oBwJGNch8XVTYYbZxU\", false},\n\t\t{\"2UCtv53VttmQYkVU4VMtXB31REvQg4ABzs41AEKZ8UcB7DAfVzdkV9JDErwGwyj5AUHLkmgZeobs\", false},\n\t\t{\"cSNjAsnhgtiFMi6MtfvgscMB2Cbhn2v1FUYfviJ1CdjfidvmeW6mn\", false},\n\t\t{\"gmsow2Y6EWAFDFE1CE4Hd3Tpu2BvfmBfG1SXsuRARbnt1WjkZnFh1qGTiptWWbjsq2Q6qvpgJVj\", false},\n\t\t{\"nksUKSkzS76v8EsSgozXGMoQFiCoCHzCVajFKAXqzK5on9ZJYVHMD5CKwgmX3S3c7M1U3xabUny\", false},\n\t\t{\"L3favK1UzFGgdzYBF2oBT5tbayCo4vtVBLJhg2iYuMeePxWG8SQc\", false},\n\t\t{\"7VxLxGGtYT6N99GdEfi6xz56xdQ8nP2dG1CavuXx7Rf2PrvNMTBNevjkfgs9JmkcGm6EXpj8ipyPZ \", false},\n\t\t{\"2mbZwFXF6cxShaCo2czTRB62WTx9LxhTtpP\", false},\n\t\t{\"dB7cwYdcPSgiyAwKWL3JwCVwSk6epU2txw\", false},\n\t\t{\"HPhFUhUAh8ZQQisH8QQWafAxtQYju3SFTX\", false},\n\t\t{\"4ctAH6AkHzq5ioiM1m9T3E2hiYEev5mTsB\", false},\n\t\t{\"31uEbMgunupShBVTewXjtqbBv5MndwfXhb\", false},\n\t\t{\"175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W\", false},\n\t\t{\"Hn1uFi4dNexWrqARpjMqgT6cX1UsNPuV3cHdGg9ExyXw8HTKadbktRDtdeVmY3M1BxJStiL4vjJ\", false},\n\t\t{\"Sq3fDbvutABmnAHHExJDgPLQn44KnNC7UsXuT7KZecpaYDMU9Txs\", false},\n\t\t{\"6TqWyrqdgUEYDQU1aChMuFMMEimHX44qHFzCUgGfqxGgZNMUVWJ\", false},\n\t\t{\"giqJo7oWqFxNKWyrgcBxAVHXnjJ1t6cGoEffce5Y1y7u649Noj5wJ4mmiUAKEVVrYAGg2KPB3Y4\", false},\n\t\t{\"cNzHY5e8vcmM3QVJUcjCyiKMYfeYvyueq5qCMV3kqcySoLyGLYUK\", false},\n\t\t{\"37uTe568EYc9WLoHEd9jXEvUiWbq5LFLscNyqvAzLU5vBArUJA6eydkLmnMwJDjkL5kXc2VK7ig\", false},\n\t\t{\"EsYbG4tWWWY45G31nox838qNdzksbPySWc\", false},\n\t\t{\"nbuzhfwMoNzA3PaFnyLcRxE9bTJPDkjZ6Rf6Y6o2ckXZfzZzXBT\", false},\n\t\t{\"cQN9PoxZeCWK1x56xnz6QYAsvR11XAce3Ehp3gMUdfSQ53Y2mPzx\", false},\n\t\t{\"1Gm3N3rkef6iMbx4voBzaxtXcmmiMTqZPhcuAepRzYUJQW4qRpEnHvMojzof42hjFRf8PE2jPde\", false},\n\t\t{\"2TAq2tuN6x6m233bpT7yqdYQPELdTDJn1eU\", false},\n\t\t{\"ntEtnnGhqPii4joABvBtSEJG6BxjT2tUZqE8PcVYgk3RHpgxgHDCQxNbLJf7ardf1dDk2oCQ7Cf\", false},\n\t\t{\"Ky1YjoZNgQ196HJV3HpdkecfhRBmRZdMJk89Hi5KGfpfPwS2bUbfd\", false},\n\t\t{\"2A1q1YsMZowabbvta7kTy2Fd6qN4r5ZCeG3qLpvZBMzCixMUdkN2Y4dHB1wPsZAeVXUGD83MfRED\", false},\n\t\t{\"1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i\", true},\n\t\t{\"1Ax4gZtb7gAit2TivwejZHYtNNLT18PUXJ\", true},\n\t\t{\"1C5bSj1iEGUgSTbziymG7Cn18ENQuT36vv\", true},\n\t\t{\"1Gqk4Tv79P91Cc1STQtU3s1W6277M2CVWu\", true},\n\t\t{\"1JwMWBVLtiqtscbaRHai4pqHokhFCbtoB4\", true},\n\t\t{\"19dcawoKcZdQz365WpXWMhX6QCUpR9SY4r\", true},\n\t\t{\"13p1ijLwsnrcuyqcTvJXkq2ASdXqcnEBLE\", true},\n\t\t{\"1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2\", true},\n\t\t{\"3P14159f73E4gFr7JterCCQh9QjiTjiZrG\", true},\n\t\t{\"3CMNFxN1oHBc4R1EpboAL5yzHGgE611Xou\", true},\n\t\t{\"3QjYXhTkvuj8qPaXHTTWb5wjXhdsLAAWVy\", true},\n\t\t{\"3AnNxabYGoTxYiTEZwFEnerUoeFXK2Zoks\", true},\n\t\t{\"33vt8ViH5jsr115AGkW6cEmEz9MpvJSwDk\", true},\n\t\t{\"3QCzvfL4ZRvmJFiWWBVwxfdaNBT8EtxB5y\", true},\n\t\t{\"37Sp6Rv3y4kVd1nQ1JV5pfqXccHNyZm1x3\", true},\n\t\t{\"3ALJH9Y951VCGcVZYAdpA3KchoP9McEj1G\", true},\n\t\t{\"12KYrjTdVGjFMtaxERSk3gphreJ5US8aUP\", true},\n\t\t{\"12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y\", true},\n\t\t{\"1oNLrsHnBcR6dpaBpwz3LSwutbUNkNSjs\", true},\n\t\t{\"1SQHtwR5oJRKLfiWQ2APsAd9miUc4k2ez\", true},\n\t\t{\"116CGDLddrZhMrTwhCVJXtXQpxygTT1kHd\", true},\n\t\t{\"3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt\", true},\n\t}\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"btc_addr\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d btc_addr failed with Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d btc_addr failed with Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"btc_addr\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d Latitude failed with Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestBitcoinBech32AddressValidation(t *testing.T) {\n\tvalidate := New()\n\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"bc1rw5uspcuh\", false},\n\t\t{\"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5\", false},\n\t\t{\"BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2\", false},\n\t\t{\"qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty\", false},\n\t\t{\"bc1rw5uspcuh\", false},\n\t\t{\"bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90\", false},\n\t\t{\"BC1QW508d6QEJxTDG4y5R3ZArVARY0C5XW7KV8F3T4\", false},\n\t\t{\"BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P\", false},\n\t\t{\"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5\", false},\n\t\t{\"bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90\", false},\n\t\t{\"bc1pw508d6qejxtdg4y5r3zarqfsj6c3\", false},\n\t\t{\"bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du\", false},\n\t\t{\"bc1gmk9yu\", false},\n\t\t{\"bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv\", false},\n\t\t{\"BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4\", true},\n\t\t{\"bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx\", true},\n\t\t{\"bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3\", true},\n\t\t{\"BC1SW50QA3JX3S\", true},\n\t\t{\"bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj\", true},\n\t}\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"btc_addr_bech32\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d btc_addr_bech32 failed with Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d btc_addr_bech32 failed with Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"btc_addr_bech32\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d Latitude failed with Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestNoStructLevelValidation(t *testing.T) {\n\ttype Inner struct {\n\t\tTest string `validate:\"len=5\"`\n\t}\n\n\ttype Outer struct {\n\t\tInnerStruct    Inner  `validate:\"required,nostructlevel\"`\n\t\tInnerStructPtr *Inner `validate:\"required,nostructlevel\"`\n\t}\n\n\touter := &Outer{\n\t\tInnerStructPtr: nil,\n\t\tInnerStruct:    Inner{},\n\t}\n\n\t// test with struct required failing on\n\tvalidate := New(WithRequiredStructEnabled())\n\n\terrs := validate.Struct(outer)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Outer.InnerStruct\", \"Outer.InnerStruct\", \"InnerStruct\", \"InnerStruct\", \"required\")\n\tAssertError(t, errs, \"Outer.InnerStructPtr\", \"Outer.InnerStructPtr\", \"InnerStructPtr\", \"InnerStructPtr\", \"required\")\n\n\tinner := Inner{\n\t\tTest: \"1234\",\n\t}\n\n\touter = &Outer{\n\t\tInnerStruct:    inner,\n\t\tInnerStructPtr: &inner,\n\t}\n\n\terrs = validate.Struct(outer)\n\tEqual(t, errs, nil)\n\n\t// test with struct required failing off\n\n\touter = &Outer{\n\t\tInnerStructPtr: nil,\n\t\tInnerStruct:    Inner{},\n\t}\n\tvalidate = New()\n\n\terrs = validate.Struct(outer)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Outer.InnerStructPtr\", \"Outer.InnerStructPtr\", \"InnerStructPtr\", \"InnerStructPtr\", \"required\")\n\n\tinner = Inner{\n\t\tTest: \"1234\",\n\t}\n\n\touter = &Outer{\n\t\tInnerStruct:    inner,\n\t\tInnerStructPtr: &inner,\n\t}\n\n\terrs = validate.Struct(outer)\n\tEqual(t, errs, nil)\n}\n\nfunc TestStructOnlyValidation(t *testing.T) {\n\ttype Inner struct {\n\t\tTest string `validate:\"len=5\"`\n\t}\n\n\ttype Outer struct {\n\t\tInnerStruct    Inner  `validate:\"required,structonly\"`\n\t\tInnerStructPtr *Inner `validate:\"required,structonly\"`\n\t}\n\n\touter := &Outer{\n\t\tInnerStruct:    Inner{},\n\t\tInnerStructPtr: nil,\n\t}\n\n\t// without required struct on\n\tvalidate := New()\n\n\terrs := validate.Struct(outer)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Outer.InnerStructPtr\", \"Outer.InnerStructPtr\", \"InnerStructPtr\", \"InnerStructPtr\", \"required\")\n\n\t// with required struct on\n\tvalidate.requiredStructEnabled = true\n\n\terrs = validate.Struct(outer)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Outer.InnerStruct\", \"Outer.InnerStruct\", \"InnerStruct\", \"InnerStruct\", \"required\")\n\tAssertError(t, errs, \"Outer.InnerStructPtr\", \"Outer.InnerStructPtr\", \"InnerStructPtr\", \"InnerStructPtr\", \"required\")\n\n\tinner := Inner{\n\t\tTest: \"1234\",\n\t}\n\n\touter = &Outer{\n\t\tInnerStruct:    inner,\n\t\tInnerStructPtr: &inner,\n\t}\n\n\terrs = validate.Struct(outer)\n\tEqual(t, errs, nil)\n\n\t// Address houses a users address information\n\ttype Address struct {\n\t\tStreet string `validate:\"required\"`\n\t\tCity   string `validate:\"required\"`\n\t\tPlanet string `validate:\"required\"`\n\t\tPhone  string `validate:\"required\"`\n\t}\n\n\ttype User struct {\n\t\tFirstName      string     `json:\"fname\"`\n\t\tLastName       string     `json:\"lname\"`\n\t\tAge            uint8      `validate:\"gte=0,lte=130\"`\n\t\tNumber         string     `validate:\"required,e164\"`\n\t\tEmail          string     `validate:\"required,email\"`\n\t\tFavouriteColor string     `validate:\"hexcolor|rgb|rgba\"`\n\t\tAddresses      []*Address `validate:\"required\"`   // a person can have a home and cottage...\n\t\tAddress        Address    `validate:\"structonly\"` // a person can have a home and cottage...\n\t}\n\n\taddress := &Address{\n\t\tStreet: \"Eavesdown Docks\",\n\t\tPlanet: \"Persphone\",\n\t\tPhone:  \"none\",\n\t\tCity:   \"Unknown\",\n\t}\n\n\tuser := &User{\n\t\tFirstName:      \"\",\n\t\tLastName:       \"\",\n\t\tAge:            45,\n\t\tNumber:         \"+1123456789\",\n\t\tEmail:          \"Badger.Smith@gmail.com\",\n\t\tFavouriteColor: \"#000\",\n\t\tAddresses:      []*Address{address},\n\t\tAddress: Address{\n\t\t\t// Street: \"Eavesdown Docks\",\n\t\t\tPlanet: \"Persphone\",\n\t\t\tPhone:  \"none\",\n\t\t\tCity:   \"Unknown\",\n\t\t},\n\t}\n\n\terrs = validate.Struct(user)\n\tEqual(t, errs, nil)\n}\n\nfunc TestGtField(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\ttype TimeTest struct {\n\t\tStart *time.Time `validate:\"required,gt\"`\n\t\tEnd   *time.Time `validate:\"required,gt,gtfield=Start\"`\n\t}\n\n\tnow := time.Now()\n\tstart := now.Add(time.Hour * 24)\n\tend := start.Add(time.Hour * 24)\n\n\ttimeTest := &TimeTest{\n\t\tStart: &start,\n\t\tEnd:   &end,\n\t}\n\n\terrs = validate.Struct(timeTest)\n\tEqual(t, errs, nil)\n\n\ttimeTest = &TimeTest{\n\t\tStart: &end,\n\t\tEnd:   &start,\n\t}\n\n\terrs = validate.Struct(timeTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeTest.End\", \"TimeTest.End\", \"End\", \"End\", \"gtfield\")\n\n\terrs = validate.VarWithValue(&end, &start, \"gtfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(&start, &end, \"gtfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtfield\")\n\n\terrs = validate.VarWithValue(&end, &start, \"gtfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(&timeTest, &end, \"gtfield\")\n\tNotEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(\"test bigger\", \"test\", \"gtfield\")\n\tEqual(t, errs, nil)\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for variables of time.Duration type.\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour-time.Minute, \"gtfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour, \"gtfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtfield\")\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour+time.Minute, \"gtfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtfield\")\n\n\terrs = validate.VarWithValue(time.Duration(0), time.Hour, \"omitempty,gtfield\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with time.Duration type fields.\n\n\ttype TimeDurationTest struct {\n\t\tFirst  time.Duration `validate:\"gtfield=Second\"`\n\t\tSecond time.Duration\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour - time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.First\", \"TimeDurationTest.First\", \"First\", \"First\", \"gtfield\")\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour + time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.First\", \"TimeDurationTest.First\", \"First\", \"First\", \"gtfield\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tFirst  time.Duration `validate:\"omitempty,gtfield=Second\"`\n\t\tSecond time.Duration\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0), time.Hour}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n\n\t// Tests for Ints types.\n\n\ttype IntTest struct {\n\t\tVal1 int `validate:\"required\"`\n\t\tVal2 int `validate:\"required,gtfield=Val1\"`\n\t}\n\n\tintTest := &IntTest{\n\t\tVal1: 1,\n\t\tVal2: 5,\n\t}\n\n\terrs = validate.Struct(intTest)\n\tEqual(t, errs, nil)\n\n\tintTest = &IntTest{\n\t\tVal1: 5,\n\t\tVal2: 1,\n\t}\n\n\terrs = validate.Struct(intTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"IntTest.Val2\", \"IntTest.Val2\", \"Val2\", \"Val2\", \"gtfield\")\n\n\terrs = validate.VarWithValue(int(5), int(1), \"gtfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(int(1), int(5), \"gtfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtfield\")\n\n\ttype UIntTest struct {\n\t\tVal1 uint `validate:\"required\"`\n\t\tVal2 uint `validate:\"required,gtfield=Val1\"`\n\t}\n\n\tuIntTest := &UIntTest{\n\t\tVal1: 1,\n\t\tVal2: 5,\n\t}\n\n\terrs = validate.Struct(uIntTest)\n\tEqual(t, errs, nil)\n\n\tuIntTest = &UIntTest{\n\t\tVal1: 5,\n\t\tVal2: 1,\n\t}\n\n\terrs = validate.Struct(uIntTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"UIntTest.Val2\", \"UIntTest.Val2\", \"Val2\", \"Val2\", \"gtfield\")\n\n\terrs = validate.VarWithValue(uint(5), uint(1), \"gtfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(uint(1), uint(5), \"gtfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtfield\")\n\n\ttype FloatTest struct {\n\t\tVal1 float64 `validate:\"required\"`\n\t\tVal2 float64 `validate:\"required,gtfield=Val1\"`\n\t}\n\n\tfloatTest := &FloatTest{\n\t\tVal1: 1,\n\t\tVal2: 5,\n\t}\n\n\terrs = validate.Struct(floatTest)\n\tEqual(t, errs, nil)\n\n\tfloatTest = &FloatTest{\n\t\tVal1: 5,\n\t\tVal2: 1,\n\t}\n\n\terrs = validate.Struct(floatTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"FloatTest.Val2\", \"FloatTest.Val2\", \"Val2\", \"Val2\", \"gtfield\")\n\n\terrs = validate.VarWithValue(float32(5), float32(1), \"gtfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(float32(1), float32(5), \"gtfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtfield\")\n\n\terrs = validate.VarWithValue(nil, 1, \"gtfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtfield\")\n\n\terrs = validate.VarWithValue(5, \"T\", \"gtfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtfield\")\n\n\terrs = validate.VarWithValue(5, start, \"gtfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtfield\")\n\n\ttype TimeTest2 struct {\n\t\tStart *time.Time `validate:\"required\"`\n\t\tEnd   *time.Time `validate:\"required,gtfield=NonExistantField\"`\n\t}\n\n\ttimeTest2 := &TimeTest2{\n\t\tStart: &start,\n\t\tEnd:   &end,\n\t}\n\n\terrs = validate.Struct(timeTest2)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeTest2.End\", \"TimeTest2.End\", \"End\", \"End\", \"gtfield\")\n\n\ttype Other struct {\n\t\tValue string\n\t}\n\n\ttype Test struct {\n\t\tValue Other\n\t\tTime  time.Time `validate:\"gtfield=Value\"`\n\t}\n\n\ttst := Test{\n\t\tValue: Other{Value: \"StringVal\"},\n\t\tTime:  end,\n\t}\n\n\terrs = validate.Struct(tst)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.Time\", \"Test.Time\", \"Time\", \"Time\", \"gtfield\")\n}\n\nfunc TestLtField(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\ttype TimeTest struct {\n\t\tStart *time.Time `validate:\"required,lt,ltfield=End\"`\n\t\tEnd   *time.Time `validate:\"required,lt\"`\n\t}\n\n\tnow := time.Now()\n\tstart := now.Add(time.Hour * 24 * -1 * 2)\n\tend := start.Add(time.Hour * 24)\n\n\ttimeTest := &TimeTest{\n\t\tStart: &start,\n\t\tEnd:   &end,\n\t}\n\n\terrs = validate.Struct(timeTest)\n\tEqual(t, errs, nil)\n\n\ttimeTest = &TimeTest{\n\t\tStart: &end,\n\t\tEnd:   &start,\n\t}\n\n\terrs = validate.Struct(timeTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeTest.Start\", \"TimeTest.Start\", \"Start\", \"Start\", \"ltfield\")\n\n\terrs = validate.VarWithValue(&start, &end, \"ltfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(&end, &start, \"ltfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltfield\")\n\n\terrs = validate.VarWithValue(&end, timeTest, \"ltfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltfield\")\n\n\terrs = validate.VarWithValue(\"tes\", \"test\", \"ltfield\")\n\tEqual(t, errs, nil)\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for variables of time.Duration type.\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour+time.Minute, \"ltfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour, \"ltfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltfield\")\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour-time.Minute, \"ltfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltfield\")\n\n\terrs = validate.VarWithValue(time.Duration(0), -time.Minute, \"omitempty,ltfield\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with time.Duration type fields.\n\n\ttype TimeDurationTest struct {\n\t\tFirst  time.Duration `validate:\"ltfield=Second\"`\n\t\tSecond time.Duration\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour + time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.First\", \"TimeDurationTest.First\", \"First\", \"First\", \"ltfield\")\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour - time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.First\", \"TimeDurationTest.First\", \"First\", \"First\", \"ltfield\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tFirst  time.Duration `validate:\"omitempty,ltfield=Second\"`\n\t\tSecond time.Duration\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0), -time.Minute}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n\n\t// Tests for Ints types.\n\n\ttype IntTest struct {\n\t\tVal1 int `validate:\"required\"`\n\t\tVal2 int `validate:\"required,ltfield=Val1\"`\n\t}\n\n\tintTest := &IntTest{\n\t\tVal1: 5,\n\t\tVal2: 1,\n\t}\n\n\terrs = validate.Struct(intTest)\n\tEqual(t, errs, nil)\n\n\tintTest = &IntTest{\n\t\tVal1: 1,\n\t\tVal2: 5,\n\t}\n\n\terrs = validate.Struct(intTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"IntTest.Val2\", \"IntTest.Val2\", \"Val2\", \"Val2\", \"ltfield\")\n\n\terrs = validate.VarWithValue(int(1), int(5), \"ltfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(int(5), int(1), \"ltfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltfield\")\n\n\ttype UIntTest struct {\n\t\tVal1 uint `validate:\"required\"`\n\t\tVal2 uint `validate:\"required,ltfield=Val1\"`\n\t}\n\n\tuIntTest := &UIntTest{\n\t\tVal1: 5,\n\t\tVal2: 1,\n\t}\n\n\terrs = validate.Struct(uIntTest)\n\tEqual(t, errs, nil)\n\n\tuIntTest = &UIntTest{\n\t\tVal1: 1,\n\t\tVal2: 5,\n\t}\n\n\terrs = validate.Struct(uIntTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"UIntTest.Val2\", \"UIntTest.Val2\", \"Val2\", \"Val2\", \"ltfield\")\n\n\terrs = validate.VarWithValue(uint(1), uint(5), \"ltfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(uint(5), uint(1), \"ltfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltfield\")\n\n\ttype FloatTest struct {\n\t\tVal1 float64 `validate:\"required\"`\n\t\tVal2 float64 `validate:\"required,ltfield=Val1\"`\n\t}\n\n\tfloatTest := &FloatTest{\n\t\tVal1: 5,\n\t\tVal2: 1,\n\t}\n\n\terrs = validate.Struct(floatTest)\n\tEqual(t, errs, nil)\n\n\tfloatTest = &FloatTest{\n\t\tVal1: 1,\n\t\tVal2: 5,\n\t}\n\n\terrs = validate.Struct(floatTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"FloatTest.Val2\", \"FloatTest.Val2\", \"Val2\", \"Val2\", \"ltfield\")\n\n\terrs = validate.VarWithValue(float32(1), float32(5), \"ltfield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(float32(5), float32(1), \"ltfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltfield\")\n\n\terrs = validate.VarWithValue(nil, 5, \"ltfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltfield\")\n\n\terrs = validate.VarWithValue(1, \"T\", \"ltfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltfield\")\n\n\terrs = validate.VarWithValue(1, end, \"ltfield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltfield\")\n\n\ttype TimeTest2 struct {\n\t\tStart *time.Time `validate:\"required\"`\n\t\tEnd   *time.Time `validate:\"required,ltfield=NonExistantField\"`\n\t}\n\n\ttimeTest2 := &TimeTest2{\n\t\tStart: &end,\n\t\tEnd:   &start,\n\t}\n\n\terrs = validate.Struct(timeTest2)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeTest2.End\", \"TimeTest2.End\", \"End\", \"End\", \"ltfield\")\n}\n\nfunc TestFieldContains(t *testing.T) {\n\tvalidate := New()\n\n\ttype StringTest struct {\n\t\tFoo string `validate:\"fieldcontains=Bar\"`\n\t\tBar string\n\t}\n\n\tstringTest := &StringTest{\n\t\tFoo: \"foobar\",\n\t\tBar: \"bar\",\n\t}\n\n\terrs := validate.Struct(stringTest)\n\tEqual(t, errs, nil)\n\n\tstringTest = &StringTest{\n\t\tFoo: \"foo\",\n\t\tBar: \"bar\",\n\t}\n\n\terrs = validate.Struct(stringTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"StringTest.Foo\", \"StringTest.Foo\", \"Foo\", \"Foo\", \"fieldcontains\")\n\n\terrs = validate.VarWithValue(\"foo\", \"bar\", \"fieldcontains\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"fieldcontains\")\n\n\terrs = validate.VarWithValue(\"bar\", \"foobarfoo\", \"fieldcontains\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"fieldcontains\")\n\n\terrs = validate.VarWithValue(\"foobarfoo\", \"bar\", \"fieldcontains\")\n\tEqual(t, errs, nil)\n\n\ttype StringTestMissingField struct {\n\t\tFoo string `validate:\"fieldcontains=Bar\"`\n\t}\n\n\tstringTestMissingField := &StringTestMissingField{\n\t\tFoo: \"foo\",\n\t}\n\n\terrs = validate.Struct(stringTestMissingField)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"StringTestMissingField.Foo\", \"StringTestMissingField.Foo\", \"Foo\", \"Foo\", \"fieldcontains\")\n}\n\nfunc TestFieldExcludes(t *testing.T) {\n\tvalidate := New()\n\n\ttype StringTest struct {\n\t\tFoo string `validate:\"fieldexcludes=Bar\"`\n\t\tBar string\n\t}\n\n\tstringTest := &StringTest{\n\t\tFoo: \"foobar\",\n\t\tBar: \"bar\",\n\t}\n\n\terrs := validate.Struct(stringTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"StringTest.Foo\", \"StringTest.Foo\", \"Foo\", \"Foo\", \"fieldexcludes\")\n\n\tstringTest = &StringTest{\n\t\tFoo: \"foo\",\n\t\tBar: \"bar\",\n\t}\n\n\terrs = validate.Struct(stringTest)\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(\"foo\", \"bar\", \"fieldexcludes\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(\"bar\", \"foobarfoo\", \"fieldexcludes\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(\"foobarfoo\", \"bar\", \"fieldexcludes\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"fieldexcludes\")\n\n\ttype StringTestMissingField struct {\n\t\tFoo string `validate:\"fieldexcludes=Bar\"`\n\t}\n\n\tstringTestMissingField := &StringTestMissingField{\n\t\tFoo: \"foo\",\n\t}\n\n\terrs = validate.Struct(stringTestMissingField)\n\tEqual(t, errs, nil)\n}\n\nfunc TestContainsAndExcludes(t *testing.T) {\n\tvalidate := New()\n\n\ttype ImpossibleStringTest struct {\n\t\tFoo string `validate:\"fieldcontains=Bar\"`\n\t\tBar string `validate:\"fieldexcludes=Foo\"`\n\t}\n\n\timpossibleStringTest := &ImpossibleStringTest{\n\t\tFoo: \"foo\",\n\t\tBar: \"bar\",\n\t}\n\n\terrs := validate.Struct(impossibleStringTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"ImpossibleStringTest.Foo\", \"ImpossibleStringTest.Foo\", \"Foo\", \"Foo\", \"fieldcontains\")\n\n\timpossibleStringTest = &ImpossibleStringTest{\n\t\tFoo: \"bar\",\n\t\tBar: \"foo\",\n\t}\n\n\terrs = validate.Struct(impossibleStringTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"ImpossibleStringTest.Foo\", \"ImpossibleStringTest.Foo\", \"Foo\", \"Foo\", \"fieldcontains\")\n}\n\nfunc TestLteField(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\ttype TimeTest struct {\n\t\tStart *time.Time `validate:\"required,lte,ltefield=End\"`\n\t\tEnd   *time.Time `validate:\"required,lte\"`\n\t}\n\n\tnow := time.Now()\n\tstart := now.Add(time.Hour * 24 * -1 * 2)\n\tend := start.Add(time.Hour * 24)\n\n\ttimeTest := &TimeTest{\n\t\tStart: &start,\n\t\tEnd:   &end,\n\t}\n\n\terrs = validate.Struct(timeTest)\n\tEqual(t, errs, nil)\n\n\ttimeTest = &TimeTest{\n\t\tStart: &end,\n\t\tEnd:   &start,\n\t}\n\n\terrs = validate.Struct(timeTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeTest.Start\", \"TimeTest.Start\", \"Start\", \"Start\", \"ltefield\")\n\n\terrs = validate.VarWithValue(&start, &end, \"ltefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(&end, &start, \"ltefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltefield\")\n\n\terrs = validate.VarWithValue(&end, timeTest, \"ltefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltefield\")\n\n\terrs = validate.VarWithValue(\"tes\", \"test\", \"ltefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(\"test\", \"test\", \"ltefield\")\n\tEqual(t, errs, nil)\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for variables of time.Duration type.\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour+time.Minute, \"ltefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour, \"ltefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour-time.Minute, \"ltefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltefield\")\n\n\terrs = validate.VarWithValue(time.Duration(0), -time.Minute, \"omitempty,ltefield\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with time.Duration type fields.\n\n\ttype TimeDurationTest struct {\n\t\tFirst  time.Duration `validate:\"ltefield=Second\"`\n\t\tSecond time.Duration\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour + time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour - time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.First\", \"TimeDurationTest.First\", \"First\", \"First\", \"ltefield\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tFirst  time.Duration `validate:\"omitempty,ltefield=Second\"`\n\t\tSecond time.Duration\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0), -time.Minute}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n\n\t// Tests for Ints types.\n\n\ttype IntTest struct {\n\t\tVal1 int `validate:\"required\"`\n\t\tVal2 int `validate:\"required,ltefield=Val1\"`\n\t}\n\n\tintTest := &IntTest{\n\t\tVal1: 5,\n\t\tVal2: 1,\n\t}\n\n\terrs = validate.Struct(intTest)\n\tEqual(t, errs, nil)\n\n\tintTest = &IntTest{\n\t\tVal1: 1,\n\t\tVal2: 5,\n\t}\n\n\terrs = validate.Struct(intTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"IntTest.Val2\", \"IntTest.Val2\", \"Val2\", \"Val2\", \"ltefield\")\n\n\terrs = validate.VarWithValue(int(1), int(5), \"ltefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(int(5), int(1), \"ltefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltefield\")\n\n\ttype UIntTest struct {\n\t\tVal1 uint `validate:\"required\"`\n\t\tVal2 uint `validate:\"required,ltefield=Val1\"`\n\t}\n\n\tuIntTest := &UIntTest{\n\t\tVal1: 5,\n\t\tVal2: 1,\n\t}\n\n\terrs = validate.Struct(uIntTest)\n\tEqual(t, errs, nil)\n\n\tuIntTest = &UIntTest{\n\t\tVal1: 1,\n\t\tVal2: 5,\n\t}\n\n\terrs = validate.Struct(uIntTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"UIntTest.Val2\", \"UIntTest.Val2\", \"Val2\", \"Val2\", \"ltefield\")\n\n\terrs = validate.VarWithValue(uint(1), uint(5), \"ltefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(uint(5), uint(1), \"ltefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltefield\")\n\n\ttype FloatTest struct {\n\t\tVal1 float64 `validate:\"required\"`\n\t\tVal2 float64 `validate:\"required,ltefield=Val1\"`\n\t}\n\n\tfloatTest := &FloatTest{\n\t\tVal1: 5,\n\t\tVal2: 1,\n\t}\n\n\terrs = validate.Struct(floatTest)\n\tEqual(t, errs, nil)\n\n\tfloatTest = &FloatTest{\n\t\tVal1: 1,\n\t\tVal2: 5,\n\t}\n\n\terrs = validate.Struct(floatTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"FloatTest.Val2\", \"FloatTest.Val2\", \"Val2\", \"Val2\", \"ltefield\")\n\n\terrs = validate.VarWithValue(float32(1), float32(5), \"ltefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(float32(5), float32(1), \"ltefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltefield\")\n\n\terrs = validate.VarWithValue(nil, 5, \"ltefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltefield\")\n\n\terrs = validate.VarWithValue(1, \"T\", \"ltefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltefield\")\n\n\terrs = validate.VarWithValue(1, end, \"ltefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"ltefield\")\n\n\ttype TimeTest2 struct {\n\t\tStart *time.Time `validate:\"required\"`\n\t\tEnd   *time.Time `validate:\"required,ltefield=NonExistantField\"`\n\t}\n\n\ttimeTest2 := &TimeTest2{\n\t\tStart: &end,\n\t\tEnd:   &start,\n\t}\n\n\terrs = validate.Struct(timeTest2)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeTest2.End\", \"TimeTest2.End\", \"End\", \"End\", \"ltefield\")\n}\n\nfunc TestGteField(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\ttype TimeTest struct {\n\t\tStart *time.Time `validate:\"required,gte\"`\n\t\tEnd   *time.Time `validate:\"required,gte,gtefield=Start\"`\n\t}\n\n\tnow := time.Now()\n\tstart := now.Add(time.Hour * 24)\n\tend := start.Add(time.Hour * 24)\n\n\ttimeTest := &TimeTest{\n\t\tStart: &start,\n\t\tEnd:   &end,\n\t}\n\n\terrs = validate.Struct(timeTest)\n\tEqual(t, errs, nil)\n\n\ttimeTest = &TimeTest{\n\t\tStart: &end,\n\t\tEnd:   &start,\n\t}\n\n\terrs = validate.Struct(timeTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeTest.End\", \"TimeTest.End\", \"End\", \"End\", \"gtefield\")\n\n\terrs = validate.VarWithValue(&end, &start, \"gtefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(&start, &end, \"gtefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtefield\")\n\n\terrs = validate.VarWithValue(&start, timeTest, \"gtefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtefield\")\n\n\terrs = validate.VarWithValue(\"test\", \"test\", \"gtefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(\"test bigger\", \"test\", \"gtefield\")\n\tEqual(t, errs, nil)\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for variables of time.Duration type.\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour-time.Minute, \"gtefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour, \"gtefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(time.Hour, time.Hour+time.Minute, \"gtefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtefield\")\n\n\terrs = validate.VarWithValue(time.Duration(0), time.Hour, \"omitempty,gtefield\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with time.Duration type fields.\n\n\ttype TimeDurationTest struct {\n\t\tFirst  time.Duration `validate:\"gtefield=Second\"`\n\t\tSecond time.Duration\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour - time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour, time.Hour + time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.First\", \"TimeDurationTest.First\", \"First\", \"First\", \"gtefield\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tFirst  time.Duration `validate:\"omitempty,gtefield=Second\"`\n\t\tSecond time.Duration\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0), time.Hour}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n\n\t// Tests for Ints types.\n\n\ttype IntTest struct {\n\t\tVal1 int `validate:\"required\"`\n\t\tVal2 int `validate:\"required,gtefield=Val1\"`\n\t}\n\n\tintTest := &IntTest{\n\t\tVal1: 1,\n\t\tVal2: 5,\n\t}\n\n\terrs = validate.Struct(intTest)\n\tEqual(t, errs, nil)\n\n\tintTest = &IntTest{\n\t\tVal1: 5,\n\t\tVal2: 1,\n\t}\n\n\terrs = validate.Struct(intTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"IntTest.Val2\", \"IntTest.Val2\", \"Val2\", \"Val2\", \"gtefield\")\n\n\terrs = validate.VarWithValue(int(5), int(1), \"gtefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(int(1), int(5), \"gtefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtefield\")\n\n\ttype UIntTest struct {\n\t\tVal1 uint `validate:\"required\"`\n\t\tVal2 uint `validate:\"required,gtefield=Val1\"`\n\t}\n\n\tuIntTest := &UIntTest{\n\t\tVal1: 1,\n\t\tVal2: 5,\n\t}\n\n\terrs = validate.Struct(uIntTest)\n\tEqual(t, errs, nil)\n\n\tuIntTest = &UIntTest{\n\t\tVal1: 5,\n\t\tVal2: 1,\n\t}\n\n\terrs = validate.Struct(uIntTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"UIntTest.Val2\", \"UIntTest.Val2\", \"Val2\", \"Val2\", \"gtefield\")\n\n\terrs = validate.VarWithValue(uint(5), uint(1), \"gtefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(uint(1), uint(5), \"gtefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtefield\")\n\n\ttype FloatTest struct {\n\t\tVal1 float64 `validate:\"required\"`\n\t\tVal2 float64 `validate:\"required,gtefield=Val1\"`\n\t}\n\n\tfloatTest := &FloatTest{\n\t\tVal1: 1,\n\t\tVal2: 5,\n\t}\n\n\terrs = validate.Struct(floatTest)\n\tEqual(t, errs, nil)\n\n\tfloatTest = &FloatTest{\n\t\tVal1: 5,\n\t\tVal2: 1,\n\t}\n\n\terrs = validate.Struct(floatTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"FloatTest.Val2\", \"FloatTest.Val2\", \"Val2\", \"Val2\", \"gtefield\")\n\n\terrs = validate.VarWithValue(float32(5), float32(1), \"gtefield\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(float32(1), float32(5), \"gtefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtefield\")\n\n\terrs = validate.VarWithValue(nil, 1, \"gtefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtefield\")\n\n\terrs = validate.VarWithValue(5, \"T\", \"gtefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtefield\")\n\n\terrs = validate.VarWithValue(5, start, \"gtefield\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gtefield\")\n\n\ttype TimeTest2 struct {\n\t\tStart *time.Time `validate:\"required\"`\n\t\tEnd   *time.Time `validate:\"required,gtefield=NonExistantField\"`\n\t}\n\n\ttimeTest2 := &TimeTest2{\n\t\tStart: &start,\n\t\tEnd:   &end,\n\t}\n\n\terrs = validate.Struct(timeTest2)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeTest2.End\", \"TimeTest2.End\", \"End\", \"End\", \"gtefield\")\n}\n\nfunc TestValidateByTagAndValue(t *testing.T) {\n\tvalidate := New()\n\n\tval := \"test\"\n\tfield := \"test\"\n\terrs := validate.VarWithValue(val, field, \"required\")\n\tEqual(t, errs, nil)\n\n\tfn := func(fl FieldLevel) bool {\n\t\treturn fl.Parent().String() == fl.Field().String()\n\t}\n\n\terrs = validate.RegisterValidation(\"isequaltestfunc\", fn)\n\tEqual(t, errs, nil)\n\n\terrs = validate.VarWithValue(val, field, \"isequaltestfunc\")\n\tEqual(t, errs, nil)\n\n\tval = \"unequal\"\n\n\terrs = validate.VarWithValue(val, field, \"isequaltestfunc\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"isequaltestfunc\")\n}\n\nfunc TestAddFunctions(t *testing.T) {\n\tfn := func(fl FieldLevel) bool {\n\t\treturn true\n\t}\n\n\tfnCtx := func(ctx context.Context, fl FieldLevel) bool {\n\t\treturn true\n\t}\n\n\tvalidate := New()\n\n\terrs := validate.RegisterValidation(\"new\", fn)\n\tEqual(t, errs, nil)\n\n\terrs = validate.RegisterValidation(\"\", fn)\n\tNotEqual(t, errs, nil)\n\n\terrs = validate.RegisterValidation(\"new\", nil)\n\tNotEqual(t, errs, nil)\n\n\terrs = validate.RegisterValidation(\"new\", fn)\n\tEqual(t, errs, nil)\n\n\terrs = validate.RegisterValidationCtx(\"new\", fnCtx)\n\tEqual(t, errs, nil)\n\n\tPanicMatches(t, func() { _ = validate.RegisterValidation(\"dive\", fn) }, \"Tag 'dive' either contains restricted characters or is the same as a restricted tag needed for normal operation\")\n}\n\nfunc TestChangeTag(t *testing.T) {\n\tvalidate := New()\n\tvalidate.SetTagName(\"val\")\n\n\ttype Test struct {\n\t\tName string `val:\"len=4\"`\n\t}\n\ts := &Test{\n\t\tName: \"TEST\",\n\t}\n\n\terrs := validate.Struct(s)\n\tEqual(t, errs, nil)\n\n\ts.Name = \"\"\n\n\terrs = validate.Struct(s)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.Name\", \"Test.Name\", \"Name\", \"Name\", \"len\")\n}\n\nfunc TestUnexposedStruct(t *testing.T) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tName      string\n\t\tunexposed struct {\n\t\t\tA string `validate:\"required\"`\n\t\t}\n\t}\n\n\ts := &Test{\n\t\tName: \"TEST\",\n\t}\n\tEqual(t, s.unexposed.A, \"\")\n\n\terrs := validate.Struct(s)\n\tEqual(t, errs, nil)\n}\n\nfunc TestBadParams(t *testing.T) {\n\tvalidate := New()\n\ti := 1\n\terrs := validate.Var(i, \"-\")\n\tEqual(t, errs, nil)\n\n\tPanicMatches(t, func() { _ = validate.Var(i, \"len=a\") }, \"strconv.ParseInt: parsing \\\"a\\\": invalid syntax\")\n\tPanicMatches(t, func() { _ = validate.Var(i, \"len=a\") }, \"strconv.ParseInt: parsing \\\"a\\\": invalid syntax\")\n\n\tvar ui uint = 1\n\tPanicMatches(t, func() { _ = validate.Var(ui, \"len=a\") }, \"strconv.ParseUint: parsing \\\"a\\\": invalid syntax\")\n\n\tf := 1.23\n\tPanicMatches(t, func() { _ = validate.Var(f, \"len=a\") }, \"strconv.ParseFloat: parsing \\\"a\\\": invalid syntax\")\n}\n\nfunc TestLength(t *testing.T) {\n\tvalidate := New()\n\ti := true\n\tPanicMatches(t, func() { _ = validate.Var(i, \"len\") }, \"Bad field type bool\")\n}\n\nfunc TestIsGt(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\tmyMap := map[string]string{}\n\terrs = validate.Var(myMap, \"gt=0\")\n\tNotEqual(t, errs, nil)\n\n\tf := 1.23\n\terrs = validate.Var(f, \"gt=5\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gt\")\n\n\tvar ui uint = 5\n\terrs = validate.Var(ui, \"gt=10\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gt\")\n\n\ti := true\n\tPanicMatches(t, func() { _ = validate.Var(i, \"gt\") }, \"Bad field type bool\")\n\n\ttm := time.Now().UTC()\n\ttm = tm.Add(time.Hour * 24)\n\n\terrs = validate.Var(tm, \"gt\")\n\tEqual(t, errs, nil)\n\n\tt2 := time.Now().UTC().Add(-time.Hour)\n\n\terrs = validate.Var(t2, \"gt\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gt\")\n\n\ttype Test struct {\n\t\tNow *time.Time `validate:\"gt\"`\n\t}\n\ts := &Test{\n\t\tNow: &tm,\n\t}\n\n\terrs = validate.Struct(s)\n\tEqual(t, errs, nil)\n\n\ts = &Test{\n\t\tNow: &t2,\n\t}\n\n\terrs = validate.Struct(s)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.Now\", \"Test.Now\", \"Now\", \"Now\", \"gt\")\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for a variable of time.Duration type.\n\n\terrs = validate.Var(time.Hour, \"gt=59m\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour-time.Minute, \"gt=59m\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gt\")\n\n\terrs = validate.Var(time.Hour-2*time.Minute, \"gt=59m\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gt\")\n\n\terrs = validate.Var(time.Duration(0), \"omitempty,gt=59m\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with a time.Duration type field.\n\n\ttype TimeDurationTest struct {\n\t\tDuration time.Duration `validate:\"gt=59m\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour - time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"gt\")\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour - 2*time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"gt\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tDuration time.Duration `validate:\"omitempty,gt=59m\"`\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestIsGte(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\ti := true\n\tPanicMatches(t, func() { _ = validate.Var(i, \"gte\") }, \"Bad field type bool\")\n\n\tt1 := time.Now().UTC()\n\tt1 = t1.Add(time.Hour * 24)\n\n\terrs = validate.Var(t1, \"gte\")\n\tEqual(t, errs, nil)\n\n\tt2 := time.Now().UTC().Add(-time.Hour)\n\n\terrs = validate.Var(t2, \"gte\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gte\")\n\n\ttype Test struct {\n\t\tNow *time.Time `validate:\"gte\"`\n\t}\n\ts := &Test{\n\t\tNow: &t1,\n\t}\n\n\terrs = validate.Struct(s)\n\tEqual(t, errs, nil)\n\n\ts = &Test{\n\t\tNow: &t2,\n\t}\n\n\terrs = validate.Struct(s)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.Now\", \"Test.Now\", \"Now\", \"Now\", \"gte\")\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for a variable of time.Duration type.\n\n\terrs = validate.Var(time.Hour, \"gte=59m\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour-time.Minute, \"gte=59m\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour-2*time.Minute, \"gte=59m\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"gte\")\n\n\terrs = validate.Var(time.Duration(0), \"omitempty,gte=59m\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with a time.Duration type field.\n\n\ttype TimeDurationTest struct {\n\t\tDuration time.Duration `validate:\"gte=59m\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour - time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour - 2*time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"gte\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tDuration time.Duration `validate:\"omitempty,gte=59m\"`\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestMinValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for a variable of time.Duration type.\n\n\terrs = validate.Var(time.Hour, \"min=59m\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour-time.Minute, \"min=59m\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour-2*time.Minute, \"min=59m\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"min\")\n\n\terrs = validate.Var(time.Duration(0), \"omitempty,min=59m\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with a time.Duration type field.\n\n\ttype TimeDurationTest struct {\n\t\tDuration time.Duration `validate:\"min=59m\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour - time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour - 2*time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"min\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tDuration time.Duration `validate:\"omitempty,min=59m\"`\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestMaxValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for a variable of time.Duration type.\n\n\terrs = validate.Var(time.Hour, \"max=1h1m\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour+time.Minute, \"max=1h1m\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour+2*time.Minute, \"max=1h1m\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"max\")\n\n\terrs = validate.Var(time.Duration(0), \"omitempty,max=-1s\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with a time.Duration type field.\n\n\ttype TimeDurationTest struct {\n\t\tDuration time.Duration `validate:\"max=1h1m\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour + time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour + 2*time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"max\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tDuration time.Duration `validate:\"omitempty,max=-1s\"`\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestMinMaxValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for a variable of time.Duration type.\n\n\terrs = validate.Var(time.Hour, \"min=59m,max=1h1m\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour-time.Minute, \"min=59m,max=1h1m\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour+time.Minute, \"min=59m,max=1h1m\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour-2*time.Minute, \"min=59m,max=1h1m\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"min\")\n\n\terrs = validate.Var(time.Hour+2*time.Minute, \"min=59m,max=1h1m\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"max\")\n\n\terrs = validate.Var(time.Duration(0), \"omitempty,min=59m,max=1h1m\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with a time.Duration type field.\n\n\ttype TimeDurationTest struct {\n\t\tDuration time.Duration `validate:\"min=59m,max=1h1m\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour - time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour + time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour - 2*time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"min\")\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour + 2*time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"max\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tDuration time.Duration `validate:\"omitempty,min=59m,max=1h1m\"`\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestLenValidation(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for a variable of time.Duration type.\n\n\terrs = validate.Var(time.Hour, \"len=1h\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour-time.Minute, \"len=1h\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"len\")\n\n\terrs = validate.Var(time.Hour+time.Minute, \"len=1h\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"len\")\n\n\terrs = validate.Var(time.Duration(0), \"omitempty,len=1h\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with a time.Duration type field.\n\n\ttype TimeDurationTest struct {\n\t\tDuration time.Duration `validate:\"len=1h\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour - time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"len\")\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour + time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"len\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tDuration time.Duration `validate:\"omitempty,len=1h\"`\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestIsLt(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\tmyMap := map[string]string{}\n\terrs = validate.Var(myMap, \"lt=0\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"lt\")\n\n\tf := 1.23\n\terrs = validate.Var(f, \"lt=0\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"lt\")\n\n\tvar ui uint = 5\n\terrs = validate.Var(ui, \"lt=0\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"lt\")\n\n\ti := true\n\tPanicMatches(t, func() { _ = validate.Var(i, \"lt\") }, \"Bad field type bool\")\n\n\tt1 := time.Now().UTC().Add(-time.Hour)\n\n\terrs = validate.Var(t1, \"lt\")\n\tEqual(t, errs, nil)\n\n\tt2 := time.Now().UTC()\n\tt2 = t2.Add(time.Hour * 24)\n\n\terrs = validate.Var(t2, \"lt\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"lt\")\n\n\ttype Test struct {\n\t\tNow *time.Time `validate:\"lt\"`\n\t}\n\n\ts := &Test{\n\t\tNow: &t1,\n\t}\n\n\terrs = validate.Struct(s)\n\tEqual(t, errs, nil)\n\n\ts = &Test{\n\t\tNow: &t2,\n\t}\n\n\terrs = validate.Struct(s)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.Now\", \"Test.Now\", \"Now\", \"Now\", \"lt\")\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for a variable of time.Duration type.\n\n\terrs = validate.Var(time.Hour, \"lt=1h1m\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour+time.Minute, \"lt=1h1m\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"lt\")\n\n\terrs = validate.Var(time.Hour+2*time.Minute, \"lt=1h1m\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"lt\")\n\n\terrs = validate.Var(time.Duration(0), \"omitempty,lt=0\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with a time.Duration type field.\n\n\ttype TimeDurationTest struct {\n\t\tDuration time.Duration `validate:\"lt=1h1m\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour + time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"lt\")\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour + 2*time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"lt\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tDuration time.Duration `validate:\"omitempty,lt=0\"`\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestIsLte(t *testing.T) {\n\tvar errs error\n\tvalidate := New()\n\n\ti := true\n\tPanicMatches(t, func() { _ = validate.Var(i, \"lte\") }, \"Bad field type bool\")\n\n\tt1 := time.Now().UTC().Add(-time.Hour)\n\n\terrs = validate.Var(t1, \"lte\")\n\tEqual(t, errs, nil)\n\n\tt2 := time.Now().UTC()\n\tt2 = t2.Add(time.Hour * 24)\n\n\terrs = validate.Var(t2, \"lte\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"lte\")\n\n\ttype Test struct {\n\t\tNow *time.Time `validate:\"lte\"`\n\t}\n\n\ts := &Test{\n\t\tNow: &t1,\n\t}\n\n\terrs = validate.Struct(s)\n\tEqual(t, errs, nil)\n\n\ts = &Test{\n\t\tNow: &t2,\n\t}\n\n\terrs = validate.Struct(s)\n\tNotEqual(t, errs, nil)\n\n\t// Tests for time.Duration type.\n\n\t// -- Validations for a variable of time.Duration type.\n\n\terrs = validate.Var(time.Hour, \"lte=1h1m\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour+time.Minute, \"lte=1h1m\")\n\tEqual(t, errs, nil)\n\n\terrs = validate.Var(time.Hour+2*time.Minute, \"lte=1h1m\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"lte\")\n\n\terrs = validate.Var(time.Duration(0), \"omitempty,lte=-1s\")\n\tEqual(t, errs, nil)\n\n\t// -- Validations for a struct with a time.Duration type field.\n\n\ttype TimeDurationTest struct {\n\t\tDuration time.Duration `validate:\"lte=1h1m\"`\n\t}\n\tvar timeDurationTest *TimeDurationTest\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour + time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tEqual(t, errs, nil)\n\n\ttimeDurationTest = &TimeDurationTest{time.Hour + 2*time.Minute}\n\terrs = validate.Struct(timeDurationTest)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TimeDurationTest.Duration\", \"TimeDurationTest.Duration\", \"Duration\", \"Duration\", \"lte\")\n\n\ttype TimeDurationOmitemptyTest struct {\n\t\tDuration time.Duration `validate:\"omitempty,lte=-1s\"`\n\t}\n\n\ttimeDurationOmitemptyTest := &TimeDurationOmitemptyTest{time.Duration(0)}\n\terrs = validate.Struct(timeDurationOmitemptyTest)\n\tEqual(t, errs, nil)\n}\n\nfunc TestUrnRFC2141(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"urn:a:b\", true},\n\t\t{\"urn:a::\", true},\n\t\t{\"urn:a:-\", true},\n\t\t{\"URN:simple:simple\", true},\n\t\t{\"urn:urna:simple\", true},\n\t\t{\"urn:burnout:nss\", true},\n\t\t{\"urn:burn:nss\", true},\n\t\t{\"urn:urnurnurn:x\", true},\n\t\t{\"urn:abcdefghilmnopqrstuvzabcdefghilm:x\", true},\n\t\t{\"URN:123:x\", true},\n\t\t{\"URN:abcd-:x\", true},\n\t\t{\"URN:abcd-abcd:x\", true},\n\t\t{\"urn:urnx:urn\", true},\n\t\t{\"urn:ciao:a:b:c\", true},\n\t\t{\"urn:aaa:x:y:\", true},\n\t\t{\"urn:ciao:-\", true},\n\t\t{\"urn:colon:::::nss\", true},\n\t\t{\"urn:ciao:@!=%2C(xyz)+a,b.*@g=$_'\", true},\n\t\t{\"URN:hexes:%25\", true},\n\t\t{\"URN:x:abc%1Dz%2F%3az\", true},\n\t\t{\"URN:foo:a123,456\", true},\n\t\t{\"urn:foo:a123,456\", true},\n\t\t{\"urn:FOO:a123,456\", true},\n\t\t{\"urn:foo:A123,456\", true},\n\t\t{\"urn:foo:a123%2C456\", true},\n\t\t{\"URN:FOO:a123%2c456\", true},\n\t\t{\"URN:FOO:ABC%FFabc123%2c456\", true},\n\t\t{\"URN:FOO:ABC%FFabc123%2C456%9A\", true},\n\t\t{\"urn:ietf:params:scim:schemas:core:2.0:User\", true},\n\t\t{\"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:meta.lastModified\", true},\n\t\t{\"URN:-xxx:x\", false},\n\t\t{\"urn::colon:nss\", false},\n\t\t{\"urn:abcdefghilmnopqrstuvzabcdefghilmn:specificstring\", false},\n\t\t{\"URN:a!?:x\", false},\n\t\t{\"URN:#,:x\", false},\n\t\t{\"urn:urn:NSS\", false},\n\t\t{\"urn:URN:NSS\", false},\n\t\t{\"urn:white space:NSS\", false},\n\t\t{\"urn:concat:no spaces\", false},\n\t\t{\"urn:a:%\", false},\n\t\t{\"urn:\", false},\n\t}\n\n\ttag := \"urn_rfc2141\"\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, tag)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d URN failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d URN failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != tag {\n\t\t\t\t\tt.Fatalf(\"Index: %d URN failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\ti := 1\n\tPanicMatches(t, func() { _ = validate.Var(i, tag) }, \"Bad field type int\")\n}\n\nfunc TestUrl(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"http://foo.bar#com\", true},\n\t\t{\"http://foobar.com\", true},\n\t\t{\"https://foobar.com\", true},\n\t\t{\"foobar.com\", false},\n\t\t{\"http://foobar.coffee/\", true},\n\t\t{\"http://foobar.中文网/\", true},\n\t\t{\"http://foobar.org/\", true},\n\t\t{\"http://foobar.org:8080/\", true},\n\t\t{\"ftp://foobar.ru/\", true},\n\t\t{\"http://user:pass@www.foobar.com/\", true},\n\t\t{\"http://127.0.0.1/\", true},\n\t\t{\"http://duckduckgo.com/?q=%2F\", true},\n\t\t{\"http://localhost:3000/\", true},\n\t\t{\"http://foobar.com/?foo=bar#baz=qux\", true},\n\t\t{\"http://foobar.com?foo=bar\", true},\n\t\t{\"http://www.xn--froschgrn-x9a.net/\", true},\n\t\t{\"\", false},\n\t\t{\"xyz://foobar.com\", true},\n\t\t{\"invalid.\", false},\n\t\t{\".com\", false},\n\t\t{\"rtmp://foobar.com\", true},\n\t\t{\"http://www.foo_bar.com/\", true},\n\t\t{\"http://localhost:3000/\", true},\n\t\t{\"http://foobar.com/#baz\", true},\n\t\t{\"http://foobar.com#baz=qux\", true},\n\t\t{\"http://foobar.com/t$-_.+!*\\\\'(),\", true},\n\t\t{\"http://www.foobar.com/~foobar\", true},\n\t\t{\"http://www.-foobar.com/\", true},\n\t\t{\"http://www.foo---bar.com/\", true},\n\t\t{\"mailto:someone@example.com\", true},\n\t\t{\"irc://irc.server.org/channel\", true},\n\t\t{\"irc://#channel@network\", true},\n\t\t{\"/abs/test/dir\", false},\n\t\t{\"./rel/test/dir\", false},\n\t\t{\"irc:\", false},\n\t\t{\"http://\", false},\n\t\t{\"file://path/to/file.txt\", true},\n\t\t{\"file:///c:/Windows/file.txt\", true},\n\t\t{\"file://localhost/path/to/file.txt\", true},\n\t\t{\"file://localhost/c:/WINDOWS/file.txt\", true},\n\t\t{\"file:\", false},\n\t\t{\"file:/\", false},\n\t\t{\"file://\", false},\n\t\t{\"file:////remotehost/path/file.txt\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"url\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d URL failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d URL failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"url\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d URL failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\ti := 1\n\tPanicMatches(t, func() { _ = validate.Var(i, \"url\") }, \"Bad field type int\")\n}\n\nfunc TestHttpUrl(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"http://foo.bar#com\", true},\n\t\t{\"http://foobar.com\", true},\n\t\t{\"HTTP://foobar.com\", true},\n\t\t{\"https://foobar.com\", true},\n\t\t{\"foobar.com\", false},\n\t\t{\"http://foobar.coffee/\", true},\n\t\t{\"http://foobar.中文网/\", true},\n\t\t{\"http://foobar.org/\", true},\n\t\t{\"http://foobar.org:8080/\", true},\n\t\t{\"ftp://foobar.ru/\", false},\n\t\t{\"file:///etc/passwd\", false},\n\t\t{\"file://C:/windows/win.ini\", false},\n\t\t{\"http://user:pass@www.foobar.com/\", true},\n\t\t{\"http://127.0.0.1/\", true},\n\t\t{\"http://duckduckgo.com/?q=%2F\", true},\n\t\t{\"http://localhost:3000/\", true},\n\t\t{\"http://foobar.com/?foo=bar#baz=qux\", true},\n\t\t{\"http://foobar.com?foo=bar\", true},\n\t\t{\"http://www.xn--froschgrn-x9a.net/\", true},\n\t\t{\"\", false},\n\t\t{\"a://b\", false},\n\t\t{\"xyz://foobar.com\", false},\n\t\t{\"invalid.\", false},\n\t\t{\".com\", false},\n\t\t{\"rtmp://foobar.com\", false},\n\t\t{\"http://www.foo_bar.com/\", true},\n\t\t{\"http://localhost:3000/\", true},\n\t\t{\"http://foobar.com/#baz\", true},\n\t\t{\"http://foobar.com#baz=qux\", true},\n\t\t{\"http://foobar.com/t$-_.+!*\\\\'(),\", true},\n\t\t{\"http://www.foobar.com/~foobar\", true},\n\t\t{\"http://www.-foobar.com/\", true},\n\t\t{\"http://www.foo---bar.com/\", true},\n\t\t{\"mailto:someone@example.com\", false},\n\t\t{\"irc://irc.server.org/channel\", false},\n\t\t{\"irc://#channel@network\", false},\n\t\t{\"/abs/test/dir\", false},\n\t\t{\"./rel/test/dir\", false},\n\t\t{\"http:\", false},\n\t\t{\"http://\", false},\n\t\t{\"http://#invalid\", false},\n\t\t{\"https://1.1.1.1\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"http_url\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d HTTP URL failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d HTTP URL failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"http_url\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d HTTP URL failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\ti := 1\n\tPanicMatches(t, func() { _ = validate.Var(i, \"http_url\") }, \"Bad field type int\")\n}\n\nfunc TestHttpsUrl(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"https://foo.bar#com\", true},\n\t\t{\"https://foobar.com\", true},\n\t\t{\"HTTPS://foobar.com\", true},\n\t\t{\"http://foobar.com\", false},\n\t\t{\"foobar.com\", false},\n\t\t{\"https://foobar.coffee/\", true},\n\t\t{\"https://foobar.中文网/\", true},\n\t\t{\"https://foobar.org/\", true},\n\t\t{\"https://foobar.org:8080/\", true},\n\t\t{\"ftp://foobar.ru/\", false},\n\t\t{\"file:///etc/passwd\", false},\n\t\t{\"file://C:/windows/win.ini\", false},\n\t\t{\"https://user:pass@www.foobar.com/\", true},\n\t\t{\"https://127.0.0.1/\", true},\n\t\t{\"https://duckduckgo.com/?q=%2F\", true},\n\t\t{\"https://localhost:3000/\", true},\n\t\t{\"https://foobar.com/?foo=bar#baz=qux\", true},\n\t\t{\"https://foobar.com?foo=bar\", true},\n\t\t{\"https://www.xn--froschgrn-x9a.net/\", true},\n\t\t{\"\", false},\n\t\t{\"a://b\", false},\n\t\t{\"xyz://foobar.com\", false},\n\t\t{\"invalid.\", false},\n\t\t{\".com\", false},\n\t\t{\"rtmp://foobar.com\", false},\n\t\t{\"https://www.foo_bar.com/\", true},\n\t\t{\"https://localhost:3000/\", true},\n\t\t{\"https://foobar.com/#baz\", true},\n\t\t{\"https://foobar.com#baz=qux\", true},\n\t\t{\"https://foobar.com/t$-_.+!*\\\\'(),\", true},\n\t\t{\"https://www.foobar.com/~foobar\", true},\n\t\t{\"https://www.-foobar.com/\", true},\n\t\t{\"https://www.foo---bar.com/\", true},\n\t\t{\"mailto:someone@example.com\", false},\n\t\t{\"irc://irc.server.org/channel\", false},\n\t\t{\"irc://#channel@network\", false},\n\t\t{\"/abs/test/dir\", false},\n\t\t{\"./rel/test/dir\", false},\n\t\t{\"https:\", false},\n\t\t{\"https://\", false},\n\t\t{\"https://#invalid\", false},\n\t\t{\"http://1.1.1.1\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"https_url\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d HTTPS URL failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d HTTPS URL failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"https_url\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d HTTPS URL failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\ti := 1\n\tPanicMatches(t, func() { _ = validate.Var(i, \"https_url\") }, \"Bad field type int\")\n}\n\nfunc TestUri(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"http://foo.bar#com\", true},\n\t\t{\"http://foobar.com\", true},\n\t\t{\"https://foobar.com\", true},\n\t\t{\"foobar.com\", false},\n\t\t{\"http://foobar.coffee/\", true},\n\t\t{\"http://foobar.中文网/\", true},\n\t\t{\"http://foobar.org/\", true},\n\t\t{\"http://foobar.org:8080/\", true},\n\t\t{\"ftp://foobar.ru/\", true},\n\t\t{\"http://user:pass@www.foobar.com/\", true},\n\t\t{\"http://127.0.0.1/\", true},\n\t\t{\"http://duckduckgo.com/?q=%2F\", true},\n\t\t{\"http://localhost:3000/\", true},\n\t\t{\"http://foobar.com/?foo=bar#baz=qux\", true},\n\t\t{\"http://foobar.com?foo=bar\", true},\n\t\t{\"http://www.xn--froschgrn-x9a.net/\", true},\n\t\t{\"\", false},\n\t\t{\"xyz://foobar.com\", true},\n\t\t{\"invalid.\", false},\n\t\t{\".com\", false},\n\t\t{\"rtmp://foobar.com\", true},\n\t\t{\"http://www.foo_bar.com/\", true},\n\t\t{\"http://localhost:3000/\", true},\n\t\t{\"http://foobar.com#baz=qux\", true},\n\t\t{\"http://foobar.com/t$-_.+!*\\\\'(),\", true},\n\t\t{\"http://www.foobar.com/~foobar\", true},\n\t\t{\"http://www.-foobar.com/\", true},\n\t\t{\"http://www.foo---bar.com/\", true},\n\t\t{\"mailto:someone@example.com\", true},\n\t\t{\"irc://irc.server.org/channel\", true},\n\t\t{\"irc://#channel@network\", true},\n\t\t{\"/abs/test/dir\", true},\n\t\t{\"./rel/test/dir\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"uri\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d URI failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d URI failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"uri\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d URI failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\ti := 1\n\tPanicMatches(t, func() { _ = validate.Var(i, \"uri\") }, \"Bad field type int\")\n}\n\nfunc TestOrTag(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"rgba(0,31,255,0.5)\"\n\terrs := validate.Var(s, \"rgb|rgba\")\n\tEqual(t, errs, nil)\n\n\ts = \"rgba(0,31,255,0.5)\"\n\terrs = validate.Var(s, \"rgb|rgba|len=18\")\n\tEqual(t, errs, nil)\n\n\ts = \"this ain't right\"\n\terrs = validate.Var(s, \"rgb|rgba\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"rgb|rgba\")\n\n\ts = \"this ain't right\"\n\terrs = validate.Var(s, \"rgb|rgba|len=10\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"rgb|rgba|len=10\")\n\n\ts = \"this is right\"\n\terrs = validate.Var(s, \"rgb|rgba|len=13\")\n\tEqual(t, errs, nil)\n\n\ts = \"\"\n\terrs = validate.Var(s, \"omitempty,rgb|rgba\")\n\tEqual(t, errs, nil)\n\n\ts = \"green\"\n\terrs = validate.Var(s, \"eq=|eq=blue,rgb|rgba\") // should fail on first validation block\n\tNotEqual(t, errs, nil)\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 1)\n\tEqual(t, ve[0].Tag(), \"eq=|eq=blue\")\n\n\ts = \"this is right, but a blank or isn't\"\n\n\tPanicMatches(t, func() { _ = validate.Var(s, \"rgb||len=13\") }, \"Invalid validation tag on field ''\")\n\tPanicMatches(t, func() { _ = validate.Var(s, \"rgb|rgbaa|len=13\") }, \"Undefined validation function 'rgbaa' on field ''\")\n\n\tv2 := New()\n\tv2.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\n\t\treturn name\n\t})\n\n\ttype Colors struct {\n\t\tFav string `validate:\"rgb|rgba\" json:\"fc\"`\n\t}\n\n\tc := Colors{Fav: \"this ain't right\"}\n\n\terr := v2.Struct(c)\n\tNotEqual(t, err, nil)\n\n\terrs = err.(ValidationErrors)\n\tfe := getError(errs, \"Colors.fc\", \"Colors.Fav\")\n\tNotEqual(t, fe, nil)\n}\n\nfunc TestCmyk(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"cmyk(0%, 100%, 50%, 0%)\"\n\terrs := validate.Var(s, \"cmyk\")\n\tEqual(t, errs, nil)\n\n\ts = \"cmyk(0%, 0%, 0%, 0%)\"\n\terrs = validate.Var(s, \"cmyk\")\n\tEqual(t, errs, nil)\n\n\ts = \"cmyk(0%, 0.1%, 0%, 0%)\"\n\terrs = validate.Var(s, \"cmyk\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"cmyk\")\n\n\ts = \"cmyk(0, 100%, 50%, 0%)\"\n\terrs = validate.Var(s, \"cmyk\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"cmyk\")\n\n\ts = \"cmyk(0%, 101%, 50%)\"\n\terrs = validate.Var(s, \"cmyk\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"cmyk\")\n\n\ts = \"cmyk(0%, 100%, 50%)\"\n\terrs = validate.Var(s, \"cmyk\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"cmyk\")\n\n\ts = \"cmyk(0%, 0%, 0%)\"\n\terrs = validate.Var(s, \"cmyk\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"cmyk\")\n\n\ti := 1\n\terrs = validate.Var(i, \"cmyk\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"cmyk\")\n}\nfunc TestHsla(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"hsla(360,100%,100%,1)\"\n\terrs := validate.Var(s, \"hsla\")\n\tEqual(t, errs, nil)\n\n\ts = \"hsla(360,100%,100%,0.5)\"\n\terrs = validate.Var(s, \"hsla\")\n\tEqual(t, errs, nil)\n\n\ts = \"hsla(0,0%,0%, 0)\"\n\terrs = validate.Var(s, \"hsla\")\n\tEqual(t, errs, nil)\n\n\ts = \"hsl(361,100%,50%,1)\"\n\terrs = validate.Var(s, \"hsla\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hsla\")\n\n\ts = \"hsl(361,100%,50%)\"\n\terrs = validate.Var(s, \"hsla\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hsla\")\n\n\ts = \"hsla(361,100%,50%)\"\n\terrs = validate.Var(s, \"hsla\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hsla\")\n\n\ts = \"hsla(360,101%,50%)\"\n\terrs = validate.Var(s, \"hsla\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hsla\")\n\n\ts = \"hsla(360,100%,101%)\"\n\terrs = validate.Var(s, \"hsla\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hsla\")\n\n\ti := 1\n\terrs = validate.Var(i, \"hsla\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hsla\")\n}\n\nfunc TestHsl(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"hsl(360,100%,50%)\"\n\terrs := validate.Var(s, \"hsl\")\n\tEqual(t, errs, nil)\n\n\ts = \"hsl(0,0%,0%)\"\n\terrs = validate.Var(s, \"hsl\")\n\tEqual(t, errs, nil)\n\n\ts = \"hsl(361,100%,50%)\"\n\terrs = validate.Var(s, \"hsl\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hsl\")\n\n\ts = \"hsl(361,101%,50%)\"\n\terrs = validate.Var(s, \"hsl\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hsl\")\n\n\ts = \"hsl(361,100%,101%)\"\n\terrs = validate.Var(s, \"hsl\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hsl\")\n\n\ts = \"hsl(-10,100%,100%)\"\n\terrs = validate.Var(s, \"hsl\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hsl\")\n\n\ti := 1\n\terrs = validate.Var(i, \"hsl\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hsl\")\n}\n\nfunc TestRgba(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"rgba(0,31,255,0.5)\"\n\terrs := validate.Var(s, \"rgba\")\n\tEqual(t, errs, nil)\n\n\ts = \"rgba(0,31,255,0.12)\"\n\terrs = validate.Var(s, \"rgba\")\n\tEqual(t, errs, nil)\n\n\ts = \"rgba(12%,55%,100%,0.12)\"\n\terrs = validate.Var(s, \"rgba\")\n\tEqual(t, errs, nil)\n\n\ts = \"rgba( 0,  31, 255, 0.5)\"\n\terrs = validate.Var(s, \"rgba\")\n\tEqual(t, errs, nil)\n\n\ts = \"rgba(12%,55,100%,0.12)\"\n\terrs = validate.Var(s, \"rgba\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"rgba\")\n\n\ts = \"rgb(0,  31, 255)\"\n\terrs = validate.Var(s, \"rgba\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"rgba\")\n\n\ts = \"rgb(1,349,275,0.5)\"\n\terrs = validate.Var(s, \"rgba\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"rgba\")\n\n\ts = \"rgb(01,31,255,0.5)\"\n\terrs = validate.Var(s, \"rgba\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"rgba\")\n\n\ti := 1\n\terrs = validate.Var(i, \"rgba\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"rgba\")\n}\n\nfunc TestRgb(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"rgb(0,31,255)\"\n\terrs := validate.Var(s, \"rgb\")\n\tEqual(t, errs, nil)\n\n\ts = \"rgb(0,  31, 255)\"\n\terrs = validate.Var(s, \"rgb\")\n\tEqual(t, errs, nil)\n\n\ts = \"rgb(10%,  50%, 100%)\"\n\terrs = validate.Var(s, \"rgb\")\n\tEqual(t, errs, nil)\n\n\ts = \"rgb(10%,  50%, 55)\"\n\terrs = validate.Var(s, \"rgb\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"rgb\")\n\n\ts = \"rgb(1,349,275)\"\n\terrs = validate.Var(s, \"rgb\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"rgb\")\n\n\ts = \"rgb(01,31,255)\"\n\terrs = validate.Var(s, \"rgb\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"rgb\")\n\n\ts = \"rgba(0,31,255)\"\n\terrs = validate.Var(s, \"rgb\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"rgb\")\n\n\ti := 1\n\terrs = validate.Var(i, \"rgb\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"rgb\")\n}\n\nfunc TestE164(t *testing.T) {\n\tvalidate := New()\n\n\ttests := []struct {\n\t\tnumber   string\n\t\texpected bool\n\t}{\n\t\t{\"+12025550123\", true},\n\t\t{\"+447911123456\", true},\n\t\t{\"0123456789\", false},\n\t\t{\"++12025550123\", false},\n\t\t{\"+1 202-555-0123\", false},\n\t\t{\"1234567\", false},\n\t\t{\"12345678\", true},\n\t\t{\"123456\", false},\n\t\t{\"0123456789\", false},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.number, func(t *testing.T) {\n\t\t\terrs := validate.Var(test.number, \"e164\")\n\t\t\tif test.expected {\n\t\t\t\tEqual(t, errs, nil)\n\t\t\t} else {\n\t\t\t\tNotEqual(t, errs, nil)\n\t\t\t\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"e164\")\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestEmail(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"test@mail.com\"\n\terrs := validate.Var(s, \"email\")\n\tEqual(t, errs, nil)\n\n\ts = \"Dörte@Sörensen.example.com\"\n\terrs = validate.Var(s, \"email\")\n\tEqual(t, errs, nil)\n\n\ts = \"θσερ@εχαμπλε.ψομ\"\n\terrs = validate.Var(s, \"email\")\n\tEqual(t, errs, nil)\n\n\ts = \"юзер@екзампл.ком\"\n\terrs = validate.Var(s, \"email\")\n\tEqual(t, errs, nil)\n\n\ts = \"उपयोगकर्ता@उदाहरण.कॉम\"\n\terrs = validate.Var(s, \"email\")\n\tEqual(t, errs, nil)\n\n\ts = \"用户@例子.广告\"\n\terrs = validate.Var(s, \"email\")\n\tEqual(t, errs, nil)\n\n\ts = \"mail@domain_with_underscores.org\"\n\terrs = validate.Var(s, \"email\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"email\")\n\n\ts = \"mail@dotaftercom.com.\"\n\terrs = validate.Var(s, \"email\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"email\")\n\n\ts = \"mail@dotaftercom.co.uk.\"\n\terrs = validate.Var(s, \"email\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"email\")\n\n\ts = \"Foo Bar <foobar@example.com>\"\n\terrs = validate.Var(s, \"email\")\n\tNotEqual(t, errs, nil)\n\n\ts = \"\"\n\terrs = validate.Var(s, \"email\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"email\")\n\n\ts = \"test@email\"\n\terrs = validate.Var(s, \"email\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"email\")\n\n\ts = \"test@email.\"\n\terrs = validate.Var(s, \"email\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"email\")\n\n\ts = \"@email.com\"\n\terrs = validate.Var(s, \"email\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"email\")\n\n\ts = `\"test test\"@email.com`\n\terrs = validate.Var(s, \"email\")\n\tEqual(t, errs, nil)\n\n\ts = `\"@email.com`\n\terrs = validate.Var(s, \"email\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"email\")\n\n\ti := true\n\terrs = validate.Var(i, \"email\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"email\")\n}\n\nfunc TestHexColor(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"#fff\"\n\terrs := validate.Var(s, \"hexcolor\")\n\tEqual(t, errs, nil)\n\n\ts = \"#c2c2c2\"\n\terrs = validate.Var(s, \"hexcolor\")\n\tEqual(t, errs, nil)\n\n\ts = \"fff\"\n\terrs = validate.Var(s, \"hexcolor\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hexcolor\")\n\n\ts = \"fffFF\"\n\terrs = validate.Var(s, \"hexcolor\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hexcolor\")\n\n\ti := true\n\terrs = validate.Var(i, \"hexcolor\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hexcolor\")\n}\n\nfunc TestHexadecimal(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"ff0044\"\n\terrs := validate.Var(s, \"hexadecimal\")\n\tEqual(t, errs, nil)\n\n\ts = \"0xff0044\"\n\terrs = validate.Var(s, \"hexadecimal\")\n\tEqual(t, errs, nil)\n\n\ts = \"0Xff0044\"\n\terrs = validate.Var(s, \"hexadecimal\")\n\tEqual(t, errs, nil)\n\n\ts = \"abcdefg\"\n\terrs = validate.Var(s, \"hexadecimal\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hexadecimal\")\n\n\ti := true\n\terrs = validate.Var(i, \"hexadecimal\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"hexadecimal\")\n}\n\nfunc TestNumber(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"1\"\n\terrs := validate.Var(s, \"number\")\n\tEqual(t, errs, nil)\n\n\ts = \"+1\"\n\terrs = validate.Var(s, \"number\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"number\")\n\n\ts = \"-1\"\n\terrs = validate.Var(s, \"number\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"number\")\n\n\ts = \"1.12\"\n\terrs = validate.Var(s, \"number\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"number\")\n\n\ts = \"+1.12\"\n\terrs = validate.Var(s, \"number\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"number\")\n\n\ts = \"-1.12\"\n\terrs = validate.Var(s, \"number\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"number\")\n\n\ts = \"1.\"\n\terrs = validate.Var(s, \"number\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"number\")\n\n\ts = \"1.o\"\n\terrs = validate.Var(s, \"number\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"number\")\n\n\ti := 1\n\terrs = validate.Var(i, \"number\")\n\tEqual(t, errs, nil)\n}\n\nfunc TestNumeric(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"1\"\n\terrs := validate.Var(s, \"numeric\")\n\tEqual(t, errs, nil)\n\n\ts = \"+1\"\n\terrs = validate.Var(s, \"numeric\")\n\tEqual(t, errs, nil)\n\n\ts = \"-1\"\n\terrs = validate.Var(s, \"numeric\")\n\tEqual(t, errs, nil)\n\n\ts = \"1.12\"\n\terrs = validate.Var(s, \"numeric\")\n\tEqual(t, errs, nil)\n\n\ts = \"+1.12\"\n\terrs = validate.Var(s, \"numeric\")\n\tEqual(t, errs, nil)\n\n\ts = \"-1.12\"\n\terrs = validate.Var(s, \"numeric\")\n\tEqual(t, errs, nil)\n\n\ts = \"1.\"\n\terrs = validate.Var(s, \"numeric\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"numeric\")\n\n\ts = \"1.o\"\n\terrs = validate.Var(s, \"numeric\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"numeric\")\n\n\ti := 1\n\terrs = validate.Var(i, \"numeric\")\n\tEqual(t, errs, nil)\n}\n\nfunc TestBoolean(t *testing.T) {\n\tvalidate := New()\n\n\tb := true\n\terrs := validate.Var(b, \"boolean\")\n\tEqual(t, errs, nil)\n\n\tb = false\n\terrs = validate.Var(b, \"boolean\")\n\tEqual(t, errs, nil)\n\n\ts := \"true\"\n\terrs = validate.Var(s, \"boolean\")\n\tEqual(t, errs, nil)\n\n\ts = \"false\"\n\terrs = validate.Var(s, \"boolean\")\n\tEqual(t, errs, nil)\n\n\ts = \"0\"\n\terrs = validate.Var(s, \"boolean\")\n\tEqual(t, errs, nil)\n\n\ts = \"1\"\n\terrs = validate.Var(s, \"boolean\")\n\tEqual(t, errs, nil)\n\n\ts = \"xyz\"\n\terrs = validate.Var(s, \"boolean\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"boolean\")\n\n\ts = \"1.\"\n\terrs = validate.Var(s, \"boolean\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"boolean\")\n}\n\nfunc TestAlphaNumeric(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"abcd123\"\n\terrs := validate.Var(s, \"alphanum\")\n\tEqual(t, errs, nil)\n\n\ts = \"abc!23\"\n\terrs = validate.Var(s, \"alphanum\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alphanum\")\n\n\terrs = validate.Var(1, \"alphanum\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alphanum\")\n}\n\nfunc TestAlpha(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"abcd\"\n\terrs := validate.Var(s, \"alpha\")\n\tEqual(t, errs, nil)\n\n\ts = \"abc®\"\n\terrs = validate.Var(s, \"alpha\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alpha\")\n\n\ts = \"abc÷\"\n\terrs = validate.Var(s, \"alpha\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alpha\")\n\n\ts = \"abc1\"\n\terrs = validate.Var(s, \"alpha\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alpha\")\n\n\ts = \"this is a test string\"\n\terrs = validate.Var(s, \"alpha\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alpha\")\n\n\terrs = validate.Var(1, \"alpha\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alpha\")\n}\n\nfunc TestAlphaSpace(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"abcd\"\n\terrs := validate.Var(s, \"alphaspace\")\n\tEqual(t, errs, nil)\n\n\ts = \"abc def\"\n\terrs = validate.Var(s, \"alphaspace\")\n\tEqual(t, errs, nil)\n\n\ts = \"  \"\n\terrs = validate.Var(s, \"alphaspace\")\n\tEqual(t, errs, nil)\n\n\ts = \"abc!\"\n\terrs = validate.Var(s, \"alphaspace\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alphaspace\")\n\n\terrs = validate.Var(1, \"alphaspace\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alphaspace\")\n}\n\nfunc TestAlphaNumericSpace(t *testing.T) {\n\tvalidate := New()\n\n\ts := \"abcd 123\"\n\terrs := validate.Var(s, \"alphanumspace\")\n\tEqual(t, errs, nil)\n\n\ts = \"  \"\n\terrs = validate.Var(s, \"alphanumspace\")\n\tEqual(t, errs, nil)\n\n\ts = \"abc123\"\n\terrs = validate.Var(s, \"alphanumspace\")\n\tEqual(t, errs, nil)\n\n\ts = \"123\"\n\terrs = validate.Var(s, \"alphanumspace\")\n\tEqual(t, errs, nil)\n\n\ts = \"abc\"\n\terrs = validate.Var(s, \"alphanumspace\")\n\tEqual(t, errs, nil)\n\n\ts = \"áçć 123\"\n\terrs = validate.Var(s, \"alphanumspace\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alphanumspace\")\n\n\ts = \"日本 123\"\n\terrs = validate.Var(s, \"alphanumspace\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alphanumspace\")\n\n\ts = \"abc!\"\n\terrs = validate.Var(s, \"alphanumspace\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alphanumspace\")\n\n\ts = \"abc\\t123\"\n\terrs = validate.Var(s, \"alphanumspace\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alphanumspace\")\n\n\ts = \"abc\\n123\"\n\terrs = validate.Var(s, \"alphanumspace\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alphanumspace\")\n\n\ts = \"abc-123\"\n\terrs = validate.Var(s, \"alphanumspace\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alphanumspace\")\n\n\ts = \"abc🙂123\"\n\terrs = validate.Var(s, \"alphanumspace\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alphanumspace\")\n\n\terrs = validate.Var(1, \"alphanumspace\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alphanumspace\")\n\n\terrs = validate.Var(1.23, \"alphanumspace\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"\", \"\", \"\", \"\", \"alphanumspace\")\n}\n\nfunc TestStructStringValidation(t *testing.T) {\n\tvalidate := New()\n\n\ttSuccess := &TestString{\n\t\tRequired:  \"Required\",\n\t\tLen:       \"length==10\",\n\t\tMin:       \"min=1\",\n\t\tMax:       \"1234567890\",\n\t\tMinMax:    \"12345\",\n\t\tLt:        \"012345678\",\n\t\tLte:       \"0123456789\",\n\t\tGt:        \"01234567890\",\n\t\tGte:       \"0123456789\",\n\t\tBoolean:   \"true\",\n\t\tOmitEmpty: \"\",\n\t\tSub: &SubTest{\n\t\t\tTest: \"1\",\n\t\t},\n\t\tSubIgnore: &SubTest{\n\t\t\tTest: \"\",\n\t\t},\n\t\tAnonymous: struct {\n\t\t\tA string `validate:\"required\"`\n\t\t}{\n\t\t\tA: \"1\",\n\t\t},\n\t\tIface: &Impl{\n\t\t\tF: \"123\",\n\t\t},\n\t}\n\n\terrs := validate.Struct(tSuccess)\n\tEqual(t, errs, nil)\n\n\ttFail := &TestString{\n\t\tRequired:  \"\",\n\t\tLen:       \"\",\n\t\tMin:       \"\",\n\t\tMax:       \"12345678901\",\n\t\tMinMax:    \"\",\n\t\tLt:        \"0123456789\",\n\t\tLte:       \"01234567890\",\n\t\tGt:        \"1\",\n\t\tGte:       \"1\",\n\t\tOmitEmpty: \"12345678901\",\n\t\tBoolean:   \"nope\",\n\t\tSub: &SubTest{\n\t\t\tTest: \"\",\n\t\t},\n\t\tAnonymous: struct {\n\t\t\tA string `validate:\"required\"`\n\t\t}{\n\t\t\tA: \"\",\n\t\t},\n\t\tIface: &Impl{\n\t\t\tF: \"12\",\n\t\t},\n\t}\n\n\terrs = validate.Struct(tFail)\n\n\t// Assert Top Level\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 14)\n\n\t// Assert Fields\n\tAssertError(t, errs, \"TestString.Required\", \"TestString.Required\", \"Required\", \"Required\", \"required\")\n\tAssertError(t, errs, \"TestString.Len\", \"TestString.Len\", \"Len\", \"Len\", \"len\")\n\tAssertError(t, errs, \"TestString.Min\", \"TestString.Min\", \"Min\", \"Min\", \"min\")\n\tAssertError(t, errs, \"TestString.Max\", \"TestString.Max\", \"Max\", \"Max\", \"max\")\n\tAssertError(t, errs, \"TestString.MinMax\", \"TestString.MinMax\", \"MinMax\", \"MinMax\", \"min\")\n\tAssertError(t, errs, \"TestString.Lt\", \"TestString.Lt\", \"Lt\", \"Lt\", \"lt\")\n\tAssertError(t, errs, \"TestString.Lte\", \"TestString.Lte\", \"Lte\", \"Lte\", \"lte\")\n\tAssertError(t, errs, \"TestString.Gt\", \"TestString.Gt\", \"Gt\", \"Gt\", \"gt\")\n\tAssertError(t, errs, \"TestString.Gte\", \"TestString.Gte\", \"Gte\", \"Gte\", \"gte\")\n\tAssertError(t, errs, \"TestString.OmitEmpty\", \"TestString.OmitEmpty\", \"OmitEmpty\", \"OmitEmpty\", \"max\")\n\tAssertError(t, errs, \"TestString.Boolean\", \"TestString.Boolean\", \"Boolean\", \"Boolean\", \"boolean\")\n\n\t// Nested Struct Field Errs\n\tAssertError(t, errs, \"TestString.Anonymous.A\", \"TestString.Anonymous.A\", \"A\", \"A\", \"required\")\n\tAssertError(t, errs, \"TestString.Sub.Test\", \"TestString.Sub.Test\", \"Test\", \"Test\", \"required\")\n\tAssertError(t, errs, \"TestString.Iface.F\", \"TestString.Iface.F\", \"F\", \"F\", \"len\")\n}\n\nfunc TestStructInt32Validation(t *testing.T) {\n\ttype TestInt32 struct {\n\t\tRequired  int `validate:\"required\"`\n\t\tLen       int `validate:\"len=10\"`\n\t\tMin       int `validate:\"min=1\"`\n\t\tMax       int `validate:\"max=10\"`\n\t\tMinMax    int `validate:\"min=1,max=10\"`\n\t\tLt        int `validate:\"lt=10\"`\n\t\tLte       int `validate:\"lte=10\"`\n\t\tGt        int `validate:\"gt=10\"`\n\t\tGte       int `validate:\"gte=10\"`\n\t\tOmitEmpty int `validate:\"omitempty,min=1,max=10\"`\n\t}\n\n\ttSuccess := &TestInt32{\n\t\tRequired:  1,\n\t\tLen:       10,\n\t\tMin:       1,\n\t\tMax:       10,\n\t\tMinMax:    5,\n\t\tLt:        9,\n\t\tLte:       10,\n\t\tGt:        11,\n\t\tGte:       10,\n\t\tOmitEmpty: 0,\n\t}\n\n\tvalidate := New()\n\terrs := validate.Struct(tSuccess)\n\tEqual(t, errs, nil)\n\n\ttFail := &TestInt32{\n\t\tRequired:  0,\n\t\tLen:       11,\n\t\tMin:       -1,\n\t\tMax:       11,\n\t\tMinMax:    -1,\n\t\tLt:        10,\n\t\tLte:       11,\n\t\tGt:        10,\n\t\tGte:       9,\n\t\tOmitEmpty: 11,\n\t}\n\n\terrs = validate.Struct(tFail)\n\n\t// Assert Top Level\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 10)\n\n\t// Assert Fields\n\tAssertError(t, errs, \"TestInt32.Required\", \"TestInt32.Required\", \"Required\", \"Required\", \"required\")\n\tAssertError(t, errs, \"TestInt32.Len\", \"TestInt32.Len\", \"Len\", \"Len\", \"len\")\n\tAssertError(t, errs, \"TestInt32.Min\", \"TestInt32.Min\", \"Min\", \"Min\", \"min\")\n\tAssertError(t, errs, \"TestInt32.Max\", \"TestInt32.Max\", \"Max\", \"Max\", \"max\")\n\tAssertError(t, errs, \"TestInt32.MinMax\", \"TestInt32.MinMax\", \"MinMax\", \"MinMax\", \"min\")\n\tAssertError(t, errs, \"TestInt32.Lt\", \"TestInt32.Lt\", \"Lt\", \"Lt\", \"lt\")\n\tAssertError(t, errs, \"TestInt32.Lte\", \"TestInt32.Lte\", \"Lte\", \"Lte\", \"lte\")\n\tAssertError(t, errs, \"TestInt32.Gt\", \"TestInt32.Gt\", \"Gt\", \"Gt\", \"gt\")\n\tAssertError(t, errs, \"TestInt32.Gte\", \"TestInt32.Gte\", \"Gte\", \"Gte\", \"gte\")\n\tAssertError(t, errs, \"TestInt32.OmitEmpty\", \"TestInt32.OmitEmpty\", \"OmitEmpty\", \"OmitEmpty\", \"max\")\n}\n\nfunc TestStructUint64Validation(t *testing.T) {\n\tvalidate := New()\n\n\ttSuccess := &TestUint64{\n\t\tRequired:  1,\n\t\tLen:       10,\n\t\tMin:       1,\n\t\tMax:       10,\n\t\tMinMax:    5,\n\t\tOmitEmpty: 0,\n\t}\n\n\terrs := validate.Struct(tSuccess)\n\tEqual(t, errs, nil)\n\n\ttFail := &TestUint64{\n\t\tRequired:  0,\n\t\tLen:       11,\n\t\tMin:       0,\n\t\tMax:       11,\n\t\tMinMax:    0,\n\t\tOmitEmpty: 11,\n\t}\n\n\terrs = validate.Struct(tFail)\n\n\t// Assert Top Level\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 6)\n\n\t// Assert Fields\n\tAssertError(t, errs, \"TestUint64.Required\", \"TestUint64.Required\", \"Required\", \"Required\", \"required\")\n\tAssertError(t, errs, \"TestUint64.Len\", \"TestUint64.Len\", \"Len\", \"Len\", \"len\")\n\tAssertError(t, errs, \"TestUint64.Min\", \"TestUint64.Min\", \"Min\", \"Min\", \"min\")\n\tAssertError(t, errs, \"TestUint64.Max\", \"TestUint64.Max\", \"Max\", \"Max\", \"max\")\n\tAssertError(t, errs, \"TestUint64.MinMax\", \"TestUint64.MinMax\", \"MinMax\", \"MinMax\", \"min\")\n\tAssertError(t, errs, \"TestUint64.OmitEmpty\", \"TestUint64.OmitEmpty\", \"OmitEmpty\", \"OmitEmpty\", \"max\")\n}\n\nfunc TestStructFloat64Validation(t *testing.T) {\n\tvalidate := New()\n\n\ttSuccess := &TestFloat64{\n\t\tRequired:  1,\n\t\tLen:       10,\n\t\tMin:       1,\n\t\tMax:       10,\n\t\tMinMax:    5,\n\t\tOmitEmpty: 0,\n\t}\n\n\terrs := validate.Struct(tSuccess)\n\tEqual(t, errs, nil)\n\n\ttFail := &TestFloat64{\n\t\tRequired:  0,\n\t\tLen:       11,\n\t\tMin:       0,\n\t\tMax:       11,\n\t\tMinMax:    0,\n\t\tOmitEmpty: 11,\n\t}\n\n\terrs = validate.Struct(tFail)\n\n\t// Assert Top Level\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 6)\n\n\t// Assert Fields\n\tAssertError(t, errs, \"TestFloat64.Required\", \"TestFloat64.Required\", \"Required\", \"Required\", \"required\")\n\tAssertError(t, errs, \"TestFloat64.Len\", \"TestFloat64.Len\", \"Len\", \"Len\", \"len\")\n\tAssertError(t, errs, \"TestFloat64.Min\", \"TestFloat64.Min\", \"Min\", \"Min\", \"min\")\n\tAssertError(t, errs, \"TestFloat64.Max\", \"TestFloat64.Max\", \"Max\", \"Max\", \"max\")\n\tAssertError(t, errs, \"TestFloat64.MinMax\", \"TestFloat64.MinMax\", \"MinMax\", \"MinMax\", \"min\")\n\tAssertError(t, errs, \"TestFloat64.OmitEmpty\", \"TestFloat64.OmitEmpty\", \"OmitEmpty\", \"OmitEmpty\", \"max\")\n}\n\nfunc TestStructSliceValidation(t *testing.T) {\n\tvalidate := New()\n\n\ttSuccess := &TestSlice{\n\t\tRequired:  []int{1},\n\t\tLen:       []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},\n\t\tMin:       []int{1, 2},\n\t\tMax:       []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},\n\t\tMinMax:    []int{1, 2, 3, 4, 5},\n\t\tOmitEmpty: nil,\n\t}\n\n\terrs := validate.Struct(tSuccess)\n\tEqual(t, errs, nil)\n\n\ttFail := &TestSlice{\n\t\tRequired:  nil,\n\t\tLen:       []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},\n\t\tMin:       []int{},\n\t\tMax:       []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},\n\t\tMinMax:    []int{},\n\t\tOmitEmpty: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},\n\t}\n\n\terrs = validate.Struct(tFail)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 6)\n\n\t// Assert Field Errors\n\tAssertError(t, errs, \"TestSlice.Required\", \"TestSlice.Required\", \"Required\", \"Required\", \"required\")\n\tAssertError(t, errs, \"TestSlice.Len\", \"TestSlice.Len\", \"Len\", \"Len\", \"len\")\n\tAssertError(t, errs, \"TestSlice.Min\", \"TestSlice.Min\", \"Min\", \"Min\", \"min\")\n\tAssertError(t, errs, \"TestSlice.Max\", \"TestSlice.Max\", \"Max\", \"Max\", \"max\")\n\tAssertError(t, errs, \"TestSlice.MinMax\", \"TestSlice.MinMax\", \"MinMax\", \"MinMax\", \"min\")\n\tAssertError(t, errs, \"TestSlice.OmitEmpty\", \"TestSlice.OmitEmpty\", \"OmitEmpty\", \"OmitEmpty\", \"max\")\n\n\tfe := getError(errs, \"TestSlice.Len\", \"TestSlice.Len\")\n\tNotEqual(t, fe, nil)\n\tEqual(t, fe.Field(), \"Len\")\n\tEqual(t, fe.StructField(), \"Len\")\n\tEqual(t, fe.Namespace(), \"TestSlice.Len\")\n\tEqual(t, fe.StructNamespace(), \"TestSlice.Len\")\n\tEqual(t, fe.Tag(), \"len\")\n\tEqual(t, fe.ActualTag(), \"len\")\n\tEqual(t, fe.Param(), \"10\")\n\tEqual(t, fe.Kind(), reflect.Slice)\n\tEqual(t, fe.Type(), reflect.TypeOf([]int{}))\n\n\t_, ok := fe.Value().([]int)\n\tEqual(t, ok, true)\n}\n\nfunc TestInvalidStruct(t *testing.T) {\n\tvalidate := New()\n\n\ts := &SubTest{\n\t\tTest: \"1\",\n\t}\n\n\terr := validate.Struct(s.Test)\n\tNotEqual(t, err, nil)\n\tEqual(t, err.Error(), \"validator: (nil string)\")\n\n\terr = validate.Struct(nil)\n\tNotEqual(t, err, nil)\n\tEqual(t, err.Error(), \"validator: (nil)\")\n\n\terr = validate.StructPartial(nil, \"SubTest.Test\")\n\tNotEqual(t, err, nil)\n\tEqual(t, err.Error(), \"validator: (nil)\")\n\n\terr = validate.StructExcept(nil, \"SubTest.Test\")\n\tNotEqual(t, err, nil)\n\tEqual(t, err.Error(), \"validator: (nil)\")\n}\n\nfunc TestInvalidValidatorFunction(t *testing.T) {\n\tvalidate := New()\n\n\ts := &SubTest{\n\t\tTest: \"1\",\n\t}\n\n\tPanicMatches(t, func() { _ = validate.Var(s.Test, \"zzxxBadFunction\") }, \"Undefined validation function 'zzxxBadFunction' on field ''\")\n}\n\nfunc TestCustomFieldName(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"schema\"), \",\", 2)[0]\n\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\n\t\treturn name\n\t})\n\n\ttype A struct {\n\t\tB string `schema:\"b\" validate:\"required\"`\n\t\tC string `schema:\"c\" validate:\"required\"`\n\t\tD []bool `schema:\"d\" validate:\"required\"`\n\t\tE string `schema:\"-\" validate:\"required\"`\n\t}\n\n\ta := &A{}\n\n\terr := validate.Struct(a)\n\tNotEqual(t, err, nil)\n\n\terrs := err.(ValidationErrors)\n\tEqual(t, len(errs), 4)\n\tEqual(t, getError(errs, \"A.b\", \"A.B\").Field(), \"b\")\n\tEqual(t, getError(errs, \"A.c\", \"A.C\").Field(), \"c\")\n\tEqual(t, getError(errs, \"A.d\", \"A.D\").Field(), \"d\")\n\tEqual(t, getError(errs, \"A.E\", \"A.E\").Field(), \"E\")\n\n\tv2 := New()\n\terr = v2.Struct(a)\n\tNotEqual(t, err, nil)\n\n\terrs = err.(ValidationErrors)\n\tEqual(t, len(errs), 4)\n\tEqual(t, getError(errs, \"A.B\", \"A.B\").Field(), \"B\")\n\tEqual(t, getError(errs, \"A.C\", \"A.C\").Field(), \"C\")\n\tEqual(t, getError(errs, \"A.D\", \"A.D\").Field(), \"D\")\n\tEqual(t, getError(errs, \"A.E\", \"A.E\").Field(), \"E\")\n}\n\nfunc TestMultipleRecursiveExtractStructCache(t *testing.T) {\n\tvalidate := New()\n\n\ttype Recursive struct {\n\t\tField *string `validate:\"required,len=5,ne=string\"`\n\t}\n\n\tvar test Recursive\n\n\tcurrent := reflect.ValueOf(test)\n\tname := \"Recursive\"\n\tproceed := make(chan struct{})\n\n\tsc := validate.extractStructCache(current, name)\n\tptr := fmt.Sprintf(\"%p\", sc)\n\n\tfor i := 0; i < 100; i++ {\n\t\tgo func() {\n\t\t\t<-proceed\n\t\t\tsc := validate.extractStructCache(current, name)\n\t\t\tEqual(t, ptr, fmt.Sprintf(\"%p\", sc))\n\t\t}()\n\t}\n\n\tclose(proceed)\n}\n\n// Thanks @robbrockbank, see https://github.com/go-playground/validator/issues/249\nfunc TestPointerAndOmitEmpty(t *testing.T) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tMyInt *int `validate:\"omitempty,gte=2,lte=255\"`\n\t}\n\n\tval1 := 0\n\tval2 := 256\n\n\tt1 := Test{MyInt: &val1} // This should fail validation on gte because value is 0\n\tt2 := Test{MyInt: &val2} // This should fail validate on lte because value is 256\n\tt3 := Test{MyInt: nil}   // This should succeed validation because pointer is nil\n\n\terrs := validate.Struct(t1)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.MyInt\", \"Test.MyInt\", \"MyInt\", \"MyInt\", \"gte\")\n\n\terrs = validate.Struct(t2)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"Test.MyInt\", \"Test.MyInt\", \"MyInt\", \"MyInt\", \"lte\")\n\n\terrs = validate.Struct(t3)\n\tEqual(t, errs, nil)\n\n\ttype TestIface struct {\n\t\tMyInt interface{} `validate:\"omitempty,gte=2,lte=255\"`\n\t}\n\n\tti1 := TestIface{MyInt: &val1} // This should fail validation on gte because value is 0\n\tti2 := TestIface{MyInt: &val2} // This should fail validate on lte because value is 256\n\tti3 := TestIface{MyInt: nil}   // This should succeed validation because pointer is nil\n\n\terrs = validate.Struct(ti1)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestIface.MyInt\", \"TestIface.MyInt\", \"MyInt\", \"MyInt\", \"gte\")\n\n\terrs = validate.Struct(ti2)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestIface.MyInt\", \"TestIface.MyInt\", \"MyInt\", \"MyInt\", \"lte\")\n\n\terrs = validate.Struct(ti3)\n\tEqual(t, errs, nil)\n}\n\nfunc TestRequired(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\n\t\treturn name\n\t})\n\n\ttype Test struct {\n\t\tValue interface{} `validate:\"required\"`\n\t}\n\n\tvar test Test\n\n\terr := validate.Struct(test)\n\tNotEqual(t, err, nil)\n\tAssertError(t, err.(ValidationErrors), \"Test.Value\", \"Test.Value\", \"Value\", \"Value\", \"required\")\n}\n\nfunc TestBoolEqual(t *testing.T) {\n\tvalidate := New()\n\n\ttype Test struct {\n\t\tValue bool `validate:\"eq=true\"`\n\t}\n\n\tvar test Test\n\n\terr := validate.Struct(test)\n\tNotEqual(t, err, nil)\n\tAssertError(t, err.(ValidationErrors), \"Test.Value\", \"Test.Value\", \"Value\", \"Value\", \"eq\")\n\n\ttest.Value = true\n\terr = validate.Struct(test)\n\tEqual(t, err, nil)\n}\n\nfunc TestTranslations(t *testing.T) {\n\ten := en.New()\n\tuni := ut.New(en, en, fr.New())\n\n\ttrans, _ := uni.GetTranslator(\"en\")\n\tfr, _ := uni.GetTranslator(\"fr\")\n\n\tvalidate := New()\n\terr := validate.RegisterTranslation(\"required\", trans,\n\t\tfunc(ut ut.Translator) (err error) {\n\t\t\t// using this stype because multiple translation may have to be added for the full translation\n\t\t\tif err = ut.Add(\"required\", \"{0} is a required field\", false); err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treturn\n\t\t}, func(ut ut.Translator, fe FieldError) string {\n\t\t\tt, err := ut.T(fe.Tag(), fe.Field())\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe.(*fieldError))\n\t\t\t\treturn fe.(*fieldError).Error()\n\t\t\t}\n\n\t\t\treturn t\n\t\t})\n\tEqual(t, err, nil)\n\n\terr = validate.RegisterTranslation(\"required\", fr,\n\t\tfunc(ut ut.Translator) (err error) {\n\t\t\t// using this stype because multiple translation may have to be added for the full translation\n\t\t\tif err = ut.Add(\"required\", \"{0} est un champ obligatoire\", false); err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treturn\n\t\t}, func(ut ut.Translator, fe FieldError) string {\n\t\t\tt, transErr := ut.T(fe.Tag(), fe.Field())\n\t\t\tif transErr != nil {\n\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe.(*fieldError))\n\t\t\t\treturn fe.(*fieldError).Error()\n\t\t\t}\n\n\t\t\treturn t\n\t\t})\n\n\tEqual(t, err, nil)\n\n\ttype Test struct {\n\t\tValue interface{} `validate:\"required\"`\n\t}\n\n\tvar test Test\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs := err.(ValidationErrors)\n\tEqual(t, len(errs), 1)\n\n\tfe := errs[0]\n\tEqual(t, fe.Tag(), \"required\")\n\tEqual(t, fe.Namespace(), \"Test.Value\")\n\tEqual(t, fe.Translate(trans), fmt.Sprintf(\"%s is a required field\", fe.Field()))\n\tEqual(t, fe.Translate(fr), fmt.Sprintf(\"%s est un champ obligatoire\", fe.Field()))\n\n\tnl := nl.New()\n\tuni2 := ut.New(nl, nl)\n\ttrans2, _ := uni2.GetTranslator(\"nl\")\n\tEqual(t, fe.Translate(trans2), \"Key: 'Test.Value' Error:Field validation for 'Value' failed on the 'required' tag\")\n\n\tterrs := errs.Translate(trans)\n\tEqual(t, len(terrs), 1)\n\n\tv, ok := terrs[\"Test.Value\"]\n\tEqual(t, ok, true)\n\tEqual(t, v, fmt.Sprintf(\"%s is a required field\", fe.Field()))\n\n\tterrs = errs.Translate(fr)\n\tEqual(t, len(terrs), 1)\n\n\tv, ok = terrs[\"Test.Value\"]\n\tEqual(t, ok, true)\n\tEqual(t, v, fmt.Sprintf(\"%s est un champ obligatoire\", fe.Field()))\n\n\ttype Test2 struct {\n\t\tValue string `validate:\"gt=1\"`\n\t}\n\n\tvar t2 Test2\n\n\terr = validate.Struct(t2)\n\tNotEqual(t, err, nil)\n\n\terrs = err.(ValidationErrors)\n\tEqual(t, len(errs), 1)\n\n\tfe = errs[0]\n\tEqual(t, fe.Tag(), \"gt\")\n\tEqual(t, fe.Namespace(), \"Test2.Value\")\n\tEqual(t, fe.Translate(trans), \"Key: 'Test2.Value' Error:Field validation for 'Value' failed on the 'gt' tag\")\n}\n\nfunc TestTranslationErrors(t *testing.T) {\n\ten := en.New()\n\tuni := ut.New(en, en, fr.New())\n\n\ttrans, _ := uni.GetTranslator(\"en\")\n\terr := trans.Add(\"required\", \"{0} is a required field\", false) // using translator outside of validator also\n\tEqual(t, err, nil)\n\n\tvalidate := New()\n\terr = validate.RegisterTranslation(\"required\", trans,\n\t\tfunc(ut ut.Translator) (err error) {\n\t\t\t// using this stype because multiple translation may have to be added for the full translation\n\t\t\tif err = ut.Add(\"required\", \"{0} is a required field\", false); err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treturn\n\t\t}, func(ut ut.Translator, fe FieldError) string {\n\t\t\tt, err := ut.T(fe.Tag(), fe.Field())\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"warning: error translating FieldError: %#v\", fe.(*fieldError))\n\t\t\t\treturn fe.(*fieldError).Error()\n\t\t\t}\n\n\t\t\treturn t\n\t\t})\n\n\tNotEqual(t, err, nil)\n\tEqual(t, err.Error(), \"error: conflicting key 'required' rule 'Unknown' with text '{0} is a required field' for locale 'en', value being ignored\")\n}\n\nfunc TestStructFiltered(t *testing.T) {\n\tp1 := func(ns []byte) bool {\n\t\tif bytes.HasSuffix(ns, []byte(\"NoTag\")) || bytes.HasSuffix(ns, []byte(\"Required\")) {\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t}\n\n\tp2 := func(ns []byte) bool {\n\t\tif bytes.HasSuffix(ns, []byte(\"SubSlice[0].Test\")) ||\n\t\t\tbytes.HasSuffix(ns, []byte(\"SubSlice[0]\")) ||\n\t\t\tbytes.HasSuffix(ns, []byte(\"SubSlice\")) ||\n\t\t\tbytes.HasSuffix(ns, []byte(\"Sub\")) ||\n\t\t\tbytes.HasSuffix(ns, []byte(\"SubIgnore\")) ||\n\t\t\tbytes.HasSuffix(ns, []byte(\"Anonymous\")) ||\n\t\t\tbytes.HasSuffix(ns, []byte(\"Anonymous.A\")) {\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t}\n\n\tp3 := func(ns []byte) bool {\n\t\treturn !bytes.HasSuffix(ns, []byte(\"SubTest.Test\"))\n\t}\n\n\t// p4 := []string{\n\t// \t\"A\",\n\t// }\n\n\ttPartial := &TestPartial{\n\t\tNoTag:    \"NoTag\",\n\t\tRequired: \"Required\",\n\n\t\tSubSlice: []*SubTest{\n\t\t\t{\n\t\t\t\tTest: \"Required\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tTest: \"Required\",\n\t\t\t},\n\t\t},\n\n\t\tSub: &SubTest{\n\t\t\tTest: \"1\",\n\t\t},\n\t\tSubIgnore: &SubTest{\n\t\t\tTest: \"\",\n\t\t},\n\t\tAnonymous: struct {\n\t\t\tA             string     `validate:\"required\"`\n\t\t\tASubSlice     []*SubTest `validate:\"required,dive\"`\n\t\t\tSubAnonStruct []struct {\n\t\t\t\tTest      string `validate:\"required\"`\n\t\t\t\tOtherTest string `validate:\"required\"`\n\t\t\t} `validate:\"required,dive\"`\n\t\t}{\n\t\t\tA: \"1\",\n\t\t\tASubSlice: []*SubTest{\n\t\t\t\t{\n\t\t\t\t\tTest: \"Required\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tTest: \"Required\",\n\t\t\t\t},\n\t\t\t},\n\n\t\t\tSubAnonStruct: []struct {\n\t\t\t\tTest      string `validate:\"required\"`\n\t\t\t\tOtherTest string `validate:\"required\"`\n\t\t\t}{\n\t\t\t\t{\"Required\", \"RequiredOther\"},\n\t\t\t\t{\"Required\", \"RequiredOther\"},\n\t\t\t},\n\t\t},\n\t}\n\n\tvalidate := New()\n\n\t// the following should all return no errors as everything is valid in\n\t// the default state\n\terrs := validate.StructFilteredCtx(context.Background(), tPartial, p1)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructFiltered(tPartial, p2)\n\tEqual(t, errs, nil)\n\n\t// this isn't really a robust test, but is meant to illustrate the ANON CASE below\n\terrs = validate.StructFiltered(tPartial.SubSlice[0], p3)\n\tEqual(t, errs, nil)\n\n\t// mod tPartial for required field and re-test making sure invalid fields are NOT required:\n\ttPartial.Required = \"\"\n\n\t// inversion and retesting Partial to generate failures:\n\terrs = validate.StructFiltered(tPartial, p1)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestPartial.Required\", \"TestPartial.Required\", \"Required\", \"Required\", \"required\")\n\n\t// reset Required field, and set nested struct\n\ttPartial.Required = \"Required\"\n\ttPartial.Anonymous.A = \"\"\n\n\t// will pass as unset fields is not going to be tested\n\terrs = validate.StructFiltered(tPartial, p1)\n\tEqual(t, errs, nil)\n\n\t// will fail as unset field is tested\n\terrs = validate.StructFiltered(tPartial, p2)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestPartial.Anonymous.A\", \"TestPartial.Anonymous.A\", \"A\", \"A\", \"required\")\n\n\t// reset nested struct and unset struct in slice\n\ttPartial.Anonymous.A = \"Required\"\n\ttPartial.SubSlice[0].Test = \"\"\n\n\t// these will pass as unset item is NOT tested\n\terrs = validate.StructFiltered(tPartial, p1)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructFiltered(tPartial, p2)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestPartial.SubSlice[0].Test\", \"TestPartial.SubSlice[0].Test\", \"Test\", \"Test\", \"required\")\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\n\t// Unset second slice member concurrently to test dive behavior:\n\ttPartial.SubSlice[1].Test = \"\"\n\n\terrs = validate.StructFiltered(tPartial, p1)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructFiltered(tPartial, p2)\n\tNotEqual(t, errs, nil)\n\tEqual(t, len(errs.(ValidationErrors)), 1)\n\tAssertError(t, errs, \"TestPartial.SubSlice[0].Test\", \"TestPartial.SubSlice[0].Test\", \"Test\", \"Test\", \"required\")\n\n\t// reset struct in slice, and unset struct in slice in unset position\n\ttPartial.SubSlice[0].Test = \"Required\"\n\n\t// these will pass as the unset item is NOT tested\n\terrs = validate.StructFiltered(tPartial, p1)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructFiltered(tPartial, p2)\n\tEqual(t, errs, nil)\n\n\ttPartial.SubSlice[1].Test = \"Required\"\n\ttPartial.Anonymous.SubAnonStruct[0].Test = \"\"\n\n\t// these will pass as the unset item is NOT tested\n\terrs = validate.StructFiltered(tPartial, p1)\n\tEqual(t, errs, nil)\n\n\terrs = validate.StructFiltered(tPartial, p2)\n\tEqual(t, errs, nil)\n\n\tdt := time.Now()\n\terr := validate.StructFiltered(&dt, func(ns []byte) bool { return true })\n\tNotEqual(t, err, nil)\n\tEqual(t, err.Error(), \"validator: (nil *time.Time)\")\n}\n\nfunc TestRequiredPtr(t *testing.T) {\n\ttype Test struct {\n\t\tBool *bool `validate:\"required\"`\n\t}\n\n\tvalidate := New()\n\n\tf := false\n\n\ttest := Test{\n\t\tBool: &f,\n\t}\n\n\terr := validate.Struct(test)\n\tEqual(t, err, nil)\n\n\ttr := true\n\n\ttest.Bool = &tr\n\n\terr = validate.Struct(test)\n\tEqual(t, err, nil)\n\n\ttest.Bool = nil\n\n\terr = validate.Struct(test)\n\tNotEqual(t, err, nil)\n\n\terrs, ok := err.(ValidationErrors)\n\tEqual(t, ok, true)\n\tEqual(t, len(errs), 1)\n\tAssertError(t, errs, \"Test.Bool\", \"Test.Bool\", \"Bool\", \"Bool\", \"required\")\n\n\ttype Test2 struct {\n\t\tBool bool `validate:\"required\"`\n\t}\n\n\tvar test2 Test2\n\n\terr = validate.Struct(test2)\n\tNotEqual(t, err, nil)\n\n\terrs, ok = err.(ValidationErrors)\n\tEqual(t, ok, true)\n\tEqual(t, len(errs), 1)\n\tAssertError(t, errs, \"Test2.Bool\", \"Test2.Bool\", \"Bool\", \"Bool\", \"required\")\n\n\ttest2.Bool = true\n\n\terr = validate.Struct(test2)\n\tEqual(t, err, nil)\n\n\ttype Test3 struct {\n\t\tArr []string `validate:\"required\"`\n\t}\n\n\tvar test3 Test3\n\n\terr = validate.Struct(test3)\n\tNotEqual(t, err, nil)\n\n\terrs, ok = err.(ValidationErrors)\n\tEqual(t, ok, true)\n\tEqual(t, len(errs), 1)\n\tAssertError(t, errs, \"Test3.Arr\", \"Test3.Arr\", \"Arr\", \"Arr\", \"required\")\n\n\ttest3.Arr = make([]string, 0)\n\n\terr = validate.Struct(test3)\n\tEqual(t, err, nil)\n\n\ttype Test4 struct {\n\t\tArr *[]string `validate:\"required\"` // I know I know pointer to array, just making sure validation works as expected...\n\t}\n\n\tvar test4 Test4\n\n\terr = validate.Struct(test4)\n\tNotEqual(t, err, nil)\n\n\terrs, ok = err.(ValidationErrors)\n\tEqual(t, ok, true)\n\tEqual(t, len(errs), 1)\n\tAssertError(t, errs, \"Test4.Arr\", \"Test4.Arr\", \"Arr\", \"Arr\", \"required\")\n\n\tarr := make([]string, 0)\n\ttest4.Arr = &arr\n\n\terr = validate.Struct(test4)\n\tEqual(t, err, nil)\n}\n\nfunc TestAlphaUnicodeValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"abc\", true},\n\t\t{\"this is a test string\", false},\n\t\t{\"这是一个测试字符串\", true},\n\t\t{\"123\", false},\n\t\t{\"<>@;.-=\", false},\n\t\t{\"ひらがな・カタカナ、．漢字\", false},\n\t\t{\"あいうえおfoobar\", true},\n\t\t{\"test＠example.com\", false},\n\t\t{\"1234abcDE\", false},\n\t\t{\"ｶﾀｶﾅ\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"alphaunicode\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d Alpha Unicode failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d Alpha Unicode failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"alphaunicode\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d Alpha Unicode failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestAlphanumericUnicodeValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"\", false},\n\t\t{\"abc\", true},\n\t\t{\"this is a test string\", false},\n\t\t{\"这是一个测试字符串\", true},\n\t\t{\"\\u0031\\u0032\\u0033\", true}, // unicode 5\n\t\t{\"123\", true},\n\t\t{\"<>@;.-=\", false},\n\t\t{\"ひらがな・カタカナ、．漢字\", false},\n\t\t{\"あいうえおfoobar\", true},\n\t\t{\"test＠example.com\", false},\n\t\t{\"1234abcDE\", true},\n\t\t{\"ｶﾀｶﾅ\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"alphanumunicode\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d Alphanum Unicode failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d Alphanum Unicode failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"alphanumunicode\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d Alphanum Unicode failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestArrayStructNamespace(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\n\t\treturn name\n\t})\n\n\ttype child struct {\n\t\tName string `json:\"name\" validate:\"required\"`\n\t}\n\tvar input struct {\n\t\tChildren []child `json:\"children\" validate:\"required,gt=0,dive\"`\n\t}\n\tinput.Children = []child{{\"ok\"}, {\"\"}}\n\n\terrs := validate.Struct(input)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 1)\n\tAssertError(t, errs, \"children[1].name\", \"Children[1].Name\", \"name\", \"Name\", \"required\")\n}\n\nfunc TestMapStructNamespace(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\n\t\treturn name\n\t})\n\n\ttype child struct {\n\t\tName string `json:\"name\" validate:\"required\"`\n\t}\n\tvar input struct {\n\t\tChildren map[int]child `json:\"children\" validate:\"required,gt=0,dive\"`\n\t}\n\tinput.Children = map[int]child{\n\t\t0: {Name: \"ok\"},\n\t\t1: {Name: \"\"},\n\t}\n\n\terrs := validate.Struct(input)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 1)\n\tAssertError(t, errs, \"children[1].name\", \"Children[1].Name\", \"name\", \"Name\", \"required\")\n}\n\nfunc TestFieldLevelName(t *testing.T) {\n\ttype Test struct {\n\t\tString string            `validate:\"custom1\"      json:\"json1\"`\n\t\tArray  []string          `validate:\"dive,custom2\" json:\"json2\"`\n\t\tMap    map[string]string `validate:\"dive,custom3\" json:\"json3\"`\n\t\tArray2 []string          `validate:\"custom4\"      json:\"json4\"`\n\t\tMap2   map[string]string `validate:\"custom5\"      json:\"json5\"`\n\t}\n\n\tvar res1, res2, res3, res4, res5, alt1, alt2, alt3, alt4, alt5 string\n\tvalidate := New()\n\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\n\t\treturn name\n\t})\n\terr := validate.RegisterValidation(\"custom1\", func(fl FieldLevel) bool {\n\t\tres1 = fl.FieldName()\n\t\talt1 = fl.StructFieldName()\n\t\treturn true\n\t})\n\tEqual(t, err, nil)\n\n\terr = validate.RegisterValidation(\"custom2\", func(fl FieldLevel) bool {\n\t\tres2 = fl.FieldName()\n\t\talt2 = fl.StructFieldName()\n\t\treturn true\n\t})\n\tEqual(t, err, nil)\n\n\terr = validate.RegisterValidation(\"custom3\", func(fl FieldLevel) bool {\n\t\tres3 = fl.FieldName()\n\t\talt3 = fl.StructFieldName()\n\t\treturn true\n\t})\n\tEqual(t, err, nil)\n\n\terr = validate.RegisterValidation(\"custom4\", func(fl FieldLevel) bool {\n\t\tres4 = fl.FieldName()\n\t\talt4 = fl.StructFieldName()\n\t\treturn true\n\t})\n\tEqual(t, err, nil)\n\n\terr = validate.RegisterValidation(\"custom5\", func(fl FieldLevel) bool {\n\t\tres5 = fl.FieldName()\n\t\talt5 = fl.StructFieldName()\n\t\treturn true\n\t})\n\tEqual(t, err, nil)\n\n\ttest := Test{\n\t\tString: \"test\",\n\t\tArray:  []string{\"1\"},\n\t\tMap:    map[string]string{\"test\": \"test\"},\n\t}\n\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n\tEqual(t, res1, \"json1\")\n\tEqual(t, alt1, \"String\")\n\tEqual(t, res2, \"json2[0]\")\n\tEqual(t, alt2, \"Array[0]\")\n\tEqual(t, res3, \"json3[test]\")\n\tEqual(t, alt3, \"Map[test]\")\n\tEqual(t, res4, \"json4\")\n\tEqual(t, alt4, \"Array2\")\n\tEqual(t, res5, \"json5\")\n\tEqual(t, alt5, \"Map2\")\n}\n\nfunc TestValidateStructRegisterCtx(t *testing.T) {\n\tvar ctxVal string\n\n\tfnCtx := func(ctx context.Context, fl FieldLevel) bool {\n\t\tctxVal = ctx.Value(&ctxVal).(string)\n\t\treturn true\n\t}\n\n\tvar ctxSlVal string\n\tslFn := func(ctx context.Context, sl StructLevel) {\n\t\tctxSlVal = ctx.Value(&ctxSlVal).(string)\n\t}\n\n\ttype Test struct {\n\t\tField string `validate:\"val\"`\n\t}\n\n\tvar tst Test\n\n\tvalidate := New()\n\terr := validate.RegisterValidationCtx(\"val\", fnCtx)\n\tEqual(t, err, nil)\n\n\tvalidate.RegisterStructValidationCtx(slFn, Test{})\n\n\tctx := context.WithValue(context.Background(), &ctxVal, \"testval\")\n\tctx = context.WithValue(ctx, &ctxSlVal, \"slVal\")\n\terrs := validate.StructCtx(ctx, tst)\n\tEqual(t, errs, nil)\n\tEqual(t, ctxVal, \"testval\")\n\tEqual(t, ctxSlVal, \"slVal\")\n}\n\nfunc TestHostnameRFC952Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"test.example.com\", true},\n\t\t{\"example.com\", true},\n\t\t{\"example24.com\", true},\n\t\t{\"test.example24.com\", true},\n\t\t{\"test24.example24.com\", true},\n\t\t{\"example\", true},\n\t\t{\"EXAMPLE\", true},\n\t\t{\"1.foo.com\", false},\n\t\t{\"test.example.com.\", false},\n\t\t{\"example.com.\", false},\n\t\t{\"example24.com.\", false},\n\t\t{\"test.example24.com.\", false},\n\t\t{\"test24.example24.com.\", false},\n\t\t{\"example.\", false},\n\t\t{\"192.168.0.1\", false},\n\t\t{\"email@example.com\", false},\n\t\t{\"2001:cdba:0000:0000:0000:0000:3257:9652\", false},\n\t\t{\"2001:cdba:0:0:0:0:3257:9652\", false},\n\t\t{\"2001:cdba::3257:9652\", false},\n\t\t{\"example..........com\", false},\n\t\t{\"1234\", false},\n\t\t{\"abc1234\", true},\n\t\t{\"example. com\", false},\n\t\t{\"ex ample.com\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"hostname\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d hostname failed Error: %v\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d hostname failed Error: %v\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"hostname\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d hostname failed Error: %v\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestHostnameRFC1123Validation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"test.example.com\", true},\n\t\t{\"example.com\", true},\n\t\t{\"example24.com\", true},\n\t\t{\"test.example24.com\", true},\n\t\t{\"test24.example24.com\", true},\n\t\t{\"example\", true},\n\t\t{\"1.foo.com\", true},\n\t\t{\"test.example.com.\", false},\n\t\t{\"example.com.\", false},\n\t\t{\"example24.com.\", false},\n\t\t{\"test.example24.com.\", false},\n\t\t{\"test24.example24.com.\", false},\n\t\t{\"example.\", false},\n\t\t{\"test_example\", false},\n\t\t{\"192.168.0.1\", true},\n\t\t{\"email@example.com\", false},\n\t\t{\"2001:cdba:0000:0000:0000:0000:3257:9652\", false},\n\t\t{\"2001:cdba:0:0:0:0:3257:9652\", false},\n\t\t{\"2001:cdba::3257:9652\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"hostname_rfc1123\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Hostname: %v failed Error: %v\", test, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Hostname: %v failed Error: %v\", test, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"hostname_rfc1123\" {\n\t\t\t\t\tt.Fatalf(\"Hostname: %v failed Error: %v\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestHostnameRFC1123AliasValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"test.example.com\", true},\n\t\t{\"example.com\", true},\n\t\t{\"example24.com\", true},\n\t\t{\"test.example24.com\", true},\n\t\t{\"test24.example24.com\", true},\n\t\t{\"example\", true},\n\t\t{\"1.foo.com\", true},\n\t\t{\"test.example.com.\", false},\n\t\t{\"example.com.\", false},\n\t\t{\"example24.com.\", false},\n\t\t{\"test.example24.com.\", false},\n\t\t{\"test24.example24.com.\", false},\n\t\t{\"example.\", false},\n\t\t{\"test_example\", false},\n\t\t{\"192.168.0.1\", true},\n\t\t{\"email@example.com\", false},\n\t\t{\"2001:cdba:0000:0000:0000:0000:3257:9652\", false},\n\t\t{\"2001:cdba:0:0:0:0:3257:9652\", false},\n\t\t{\"2001:cdba::3257:9652\", false},\n\t}\n\n\tvalidate := New()\n\tvalidate.RegisterAlias(\"hostname\", \"hostname_rfc1123\")\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"hostname\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d hostname failed Error: %v\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d hostname failed Error: %v\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"hostname\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d hostname failed Error: %v\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestFQDNValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"test.example.com\", true},\n\t\t{\"example.com\", true},\n\t\t{\"example24.com\", true},\n\t\t{\"test.example24.com\", true},\n\t\t{\"test24.example24.com\", true},\n\t\t{\"test.example.com.\", true},\n\t\t{\"example.com.\", true},\n\t\t{\"example24.com.\", true},\n\t\t{\"test.example24.com.\", true},\n\t\t{\"test24.example24.com.\", true},\n\t\t{\"24.example24.com\", true},\n\t\t{\"test.24.example.com\", true},\n\t\t{\"test24.example24.com..\", false},\n\t\t{\"example\", false},\n\t\t{\"192.168.0.1\", false},\n\t\t{\"email@example.com\", false},\n\t\t{\"2001:cdba:0000:0000:0000:0000:3257:9652\", false},\n\t\t{\"2001:cdba:0:0:0:0:3257:9652\", false},\n\t\t{\"2001:cdba::3257:9652\", false},\n\t\t{\"\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"fqdn\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d fqdn failed Error: %v\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d fqdn failed Error: %v\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"fqdn\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d fqdn failed Error: %v\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIsDefault(t *testing.T) {\n\tvalidate := New()\n\n\ttype Inner struct {\n\t\tString string `validate:\"isdefault\"`\n\t}\n\ttype Test struct {\n\t\tString string `validate:\"isdefault\"`\n\t\tInner  *Inner `validate:\"isdefault\"`\n\t}\n\n\tvar tt Test\n\n\terrs := validate.Struct(tt)\n\tEqual(t, errs, nil)\n\n\ttt.Inner = &Inner{String: \"\"}\n\terrs = validate.Struct(tt)\n\tNotEqual(t, errs, nil)\n\n\tfe := errs.(ValidationErrors)[0]\n\tEqual(t, fe.Field(), \"Inner\")\n\tEqual(t, fe.Namespace(), \"Test.Inner\")\n\tEqual(t, fe.Tag(), \"isdefault\")\n\n\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\t\treturn name\n\t})\n\n\ttype Inner2 struct {\n\t\tString string `validate:\"isdefault\"`\n\t}\n\n\ttype Test2 struct {\n\t\tInner Inner2 `validate:\"isdefault\" json:\"inner\"`\n\t}\n\n\tvar t2 Test2\n\terrs = validate.Struct(t2)\n\tEqual(t, errs, nil)\n\n\tt2.Inner.String = \"Changed\"\n\terrs = validate.Struct(t2)\n\tNotEqual(t, errs, nil)\n\n\tfe = errs.(ValidationErrors)[0]\n\tEqual(t, fe.Field(), \"inner\")\n\tEqual(t, fe.Namespace(), \"Test2.inner\")\n\tEqual(t, fe.Tag(), \"isdefault\")\n}\n\nfunc TestUniqueValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    interface{}\n\t\texpected bool\n\t}{\n\t\t// Arrays\n\t\t{[2]string{\"a\", \"b\"}, true},\n\t\t{[2]int{1, 2}, true},\n\t\t{[2]float64{1, 2}, true},\n\t\t{[2]interface{}{\"a\", \"b\"}, true},\n\t\t{[2]interface{}{\"a\", 1}, true},\n\t\t{[2]float64{1, 1}, false},\n\t\t{[2]int{1, 1}, false},\n\t\t{[2]string{\"a\", \"a\"}, false},\n\t\t{[2]interface{}{\"a\", \"a\"}, false},\n\t\t{[4]interface{}{\"a\", 1, \"b\", 1}, false},\n\t\t{[2]*string{stringPtr(\"a\"), stringPtr(\"b\")}, true},\n\t\t{[2]*int{intPtr(1), intPtr(2)}, true},\n\t\t{[2]*float64{float64Ptr(1), float64Ptr(2)}, true},\n\t\t{[2]*string{stringPtr(\"a\"), stringPtr(\"a\")}, false},\n\t\t{[2]*float64{float64Ptr(1), float64Ptr(1)}, false},\n\t\t{[2]*int{intPtr(1), intPtr(1)}, false},\n\t\t// Slices\n\t\t{[]string{\"a\", \"b\"}, true},\n\t\t{[]int{1, 2}, true},\n\t\t{[]float64{1, 2}, true},\n\t\t{[]interface{}{\"a\", \"b\"}, true},\n\t\t{[]interface{}{\"a\", 1}, true},\n\t\t{[]float64{1, 1}, false},\n\t\t{[]int{1, 1}, false},\n\t\t{[]string{\"a\", \"a\"}, false},\n\t\t{[]interface{}{\"a\", \"a\"}, false},\n\t\t{[]interface{}{\"a\", 1, \"b\", 1}, false},\n\t\t{[]*string{stringPtr(\"a\"), stringPtr(\"b\")}, true},\n\t\t{[]*int{intPtr(1), intPtr(2)}, true},\n\t\t{[]*float64{float64Ptr(1), float64Ptr(2)}, true},\n\t\t{[]*string{stringPtr(\"a\"), stringPtr(\"a\")}, false},\n\t\t{[]*float64{float64Ptr(1), float64Ptr(1)}, false},\n\t\t{[]*int{intPtr(1), intPtr(1)}, false},\n\t\t// Maps\n\t\t{map[string]string{\"one\": \"a\", \"two\": \"b\"}, true},\n\t\t{map[string]int{\"one\": 1, \"two\": 2}, true},\n\t\t{map[string]float64{\"one\": 1, \"two\": 2}, true},\n\t\t{map[string]interface{}{\"one\": \"a\", \"two\": \"b\"}, true},\n\t\t{map[string]interface{}{\"one\": \"a\", \"two\": 1}, true},\n\t\t{map[string]float64{\"one\": 1, \"two\": 1}, false},\n\t\t{map[string]int{\"one\": 1, \"two\": 1}, false},\n\t\t{map[string]string{\"one\": \"a\", \"two\": \"a\"}, false},\n\t\t{map[string]interface{}{\"one\": \"a\", \"two\": \"a\"}, false},\n\t\t{map[string]interface{}{\"one\": \"a\", \"two\": 1, \"three\": \"b\", \"four\": 1}, false},\n\t\t{map[string]*string{\"one\": stringPtr(\"a\"), \"two\": stringPtr(\"a\")}, false},\n\t\t{map[string]*string{\"one\": stringPtr(\"a\"), \"two\": stringPtr(\"b\")}, true},\n\t\t{map[string]*int{\"one\": intPtr(1), \"two\": intPtr(1)}, false},\n\t\t{map[string]*int{\"one\": intPtr(1), \"two\": intPtr(2)}, true},\n\t\t{map[string]*float64{\"one\": float64Ptr(1.1), \"two\": float64Ptr(1.1)}, false},\n\t\t{map[string]*float64{\"one\": float64Ptr(1.1), \"two\": float64Ptr(1.2)}, true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"unique\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d unique failed Error: %v\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d unique failed Error: %v\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"unique\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d unique failed Error: %v\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tPanicMatches(t, func() { _ = validate.Var(1.0, \"unique\") }, \"Bad field type float64\")\n\n\tt.Run(\"struct\", func(t *testing.T) {\n\t\ttests := []struct {\n\t\t\tparam    interface{}\n\t\t\texpected bool\n\t\t}{\n\t\t\t{struct {\n\t\t\t\tA string `validate:\"unique=B\"`\n\t\t\t\tB string\n\t\t\t}{A: \"abc\", B: \"bcd\"}, true},\n\t\t\t{struct {\n\t\t\t\tA string `validate:\"unique=B\"`\n\t\t\t\tB string\n\t\t\t}{A: \"abc\", B: \"abc\"}, false},\n\t\t}\n\t\tvalidate := New()\n\n\t\tfor i, test := range tests {\n\t\t\terrs := validate.Struct(test.param)\n\t\t\tif test.expected {\n\t\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\t\tt.Fatalf(\"Index: %d unique failed Error: %v\", i, errs)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif IsEqual(errs, nil) {\n\t\t\t\t\tt.Fatalf(\"Index: %d unique failed Error: %v\", i, errs)\n\t\t\t\t} else {\n\t\t\t\t\tval := getError(errs, \"A\", \"A\")\n\t\t\t\t\tif val.Tag() != \"unique\" {\n\t\t\t\t\t\tt.Fatalf(\"Index: %d unique failed Error: %v\", i, errs)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n}\n\nfunc TestUniqueValidationStructSlice(t *testing.T) {\n\ttestStructs := []struct {\n\t\tA string\n\t\tB string\n\t}{\n\t\t{A: \"one\", B: \"two\"},\n\t\t{A: \"one\", B: \"three\"},\n\t}\n\n\ttests := []struct {\n\t\ttarget   interface{}\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{testStructs, \"unique\", true},\n\t\t{testStructs, \"unique=A\", false},\n\t\t{testStructs, \"unique=B\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.target, test.param)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d unique failed Error: %v\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d unique failed Error: %v\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"unique\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d unique failed Error: %v\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tPanicMatches(t, func() { _ = validate.Var(testStructs, \"unique=C\") }, \"Bad field name C\")\n}\n\nfunc TestUniqueValidationStructPtrSlice(t *testing.T) {\n\ttestStructs := []*struct {\n\t\tA *string\n\t\tB *string\n\t}{\n\t\t{A: stringPtr(\"one\"), B: stringPtr(\"two\")},\n\t\t{A: stringPtr(\"one\"), B: stringPtr(\"three\")},\n\t\t{},\n\t}\n\n\ttests := []struct {\n\t\ttarget   interface{}\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{testStructs, \"unique\", true},\n\t\t{testStructs, \"unique=A\", false},\n\t\t{testStructs, \"unique=B\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.target, test.param)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d unique failed Error: %v\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d unique failed Error: %v\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"unique\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d unique failed Error: %v\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tPanicMatches(t, func() { _ = validate.Var(testStructs, \"unique=C\") }, \"Bad field name C\")\n}\n\nfunc TestUniqueValidationNilPtrSlice(t *testing.T) {\n\tvalidate := New()\n\n\ttype Inner struct {\n\t\tName string\n\t}\n\n\tt.Run(\"unique_field_single_nil_ptr\", func(t *testing.T) {\n\t\t// A single nil element should not panic and should pass (it's unique by itself)\n\t\ts := struct {\n\t\t\tF1 []*Inner `validate:\"unique=Name\"`\n\t\t}{F1: []*Inner{nil}}\n\t\terrs := validate.Struct(s)\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"single nil element should pass unique=Name validation, got: %v\", errs)\n\t\t}\n\t})\n\n\tt.Run(\"unique_field_duplicate_nil_ptrs\", func(t *testing.T) {\n\t\t// Two nil elements should not panic and should fail (not unique)\n\t\ts := struct {\n\t\t\tF1 []*Inner `validate:\"unique=Name\"`\n\t\t}{F1: []*Inner{nil, nil}}\n\t\terrs := validate.Struct(s)\n\t\tif errs == nil {\n\t\t\tt.Fatal(\"duplicate nil elements should fail unique=Name validation\")\n\t\t}\n\t})\n\n\tt.Run(\"unique_field_nil_and_non_nil\", func(t *testing.T) {\n\t\t// One nil and one non-nil should pass (they are different)\n\t\ts := struct {\n\t\t\tF1 []*Inner `validate:\"unique=Name\"`\n\t\t}{F1: []*Inner{nil, {Name: \"abc\"}}}\n\t\terrs := validate.Struct(s)\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"nil and non-nil elements should pass unique=Name validation, got: %v\", errs)\n\t\t}\n\t})\n\n\tt.Run(\"unique_no_param_single_nil_ptr\", func(t *testing.T) {\n\t\t// A single nil element without param should not panic\n\t\ts := struct {\n\t\t\tF1 []*Inner `validate:\"unique\"`\n\t\t}{F1: []*Inner{nil}}\n\t\terrs := validate.Struct(s)\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"single nil element should pass unique validation, got: %v\", errs)\n\t\t}\n\t})\n\n\tt.Run(\"unique_no_param_duplicate_nil_ptrs\", func(t *testing.T) {\n\t\t// Two nil elements without param should fail\n\t\ts := struct {\n\t\t\tF1 []*Inner `validate:\"unique\"`\n\t\t}{F1: []*Inner{nil, nil}}\n\t\terrs := validate.Struct(s)\n\t\tif errs == nil {\n\t\t\tt.Fatal(\"duplicate nil elements should fail unique validation\")\n\t\t}\n\t})\n\n\tt.Run(\"unique_no_param_nil_and_non_nil\", func(t *testing.T) {\n\t\t// One nil and one non-nil should pass\n\t\ts := struct {\n\t\t\tF1 []*Inner `validate:\"unique\"`\n\t\t}{F1: []*Inner{nil, {Name: \"abc\"}}}\n\t\terrs := validate.Struct(s)\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"nil and non-nil elements should pass unique validation, got: %v\", errs)\n\t\t}\n\t})\n\n\tt.Run(\"unique_map_nil_values\", func(t *testing.T) {\n\t\t// Map with nil pointer values should not panic\n\t\tm := map[string]*string{\"one\": nil, \"two\": nil}\n\t\terrs := validate.Var(m, \"unique\")\n\t\tif errs == nil {\n\t\t\tt.Fatal(\"duplicate nil map values should fail unique validation\")\n\t\t}\n\t})\n\n\tt.Run(\"unique_map_single_nil_value\", func(t *testing.T) {\n\t\tm := map[string]*string{\"one\": nil}\n\t\terrs := validate.Var(m, \"unique\")\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"single nil map value should pass unique validation, got: %v\", errs)\n\t\t}\n\t})\n\n\tt.Run(\"unique_map_nil_and_non_nil\", func(t *testing.T) {\n\t\ta := \"hello\"\n\t\tm := map[string]*string{\"one\": nil, \"two\": &a}\n\t\terrs := validate.Var(m, \"unique\")\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"nil and non-nil map values should pass unique validation, got: %v\", errs)\n\t\t}\n\t})\n\n\tt.Run(\"unique_slice_with_nil_and_zero_value_struct\", func(t *testing.T) {\n\t\ts := []*Inner{nil, {Name: \"\"}}\n\t\terrs := validate.Var(s, \"unique\")\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"nil and zero value struct should pass unique validation, got: %v\", errs)\n\t\t}\n\t})\n}\n\nfunc TestHTMLValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"<html>\", true},\n\t\t{\"<script>\", true},\n\t\t{\"<stillworks>\", true},\n\t\t{\"</html\", false},\n\t\t{\"</script>\", true},\n\t\t{\"<//script>\", false},\n\t\t{\"<123nonsense>\", false},\n\t\t{\"test\", false},\n\t\t{\"&example\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"html\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d html failed Error: %v\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d html failed Error: %v\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"html\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d html failed Error: %v\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestHTMLEncodedValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"&#x3c;\", true},\n\t\t{\"&#xaf;\", true},\n\t\t{\"&#x00;\", true},\n\t\t{\"&#xf0;\", true},\n\t\t{\"&#x3c\", true},\n\t\t{\"&#xaf\", true},\n\t\t{\"&#x00\", true},\n\t\t{\"&#xf0\", true},\n\t\t{\"&#ab\", true},\n\t\t{\"&lt;\", true},\n\t\t{\"&gt;\", true},\n\t\t{\"&quot;\", true},\n\t\t{\"&amp;\", true},\n\t\t{\"#x0a\", false},\n\t\t{\"&x00\", false},\n\t\t{\"&#x1z\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"html_encoded\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d html_encoded failed Error: %v\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d html_encoded failed Error: %v\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"html_encoded\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d html_encoded failed Error: %v\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestURLEncodedValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"%20\", true},\n\t\t{\"%af\", true},\n\t\t{\"%ff\", true},\n\t\t{\"<%az\", false},\n\t\t{\"%test%\", false},\n\t\t{\"a%b\", false},\n\t\t{\"1%2\", false},\n\t\t{\"%%a%%\", false},\n\t\t{\"hello\", true},\n\t\t{\"\", true},\n\t\t{\"+\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"url_encoded\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d url_encoded failed Error: %v\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d url_encoded failed Error: %v\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"url_encoded\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d url_encoded failed Error: %v\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestKeys(t *testing.T) {\n\ttype Test struct {\n\t\tTest1 map[string]string `validate:\"gt=0,dive,keys,eq=testkey,endkeys,eq=testval\" json:\"test1\"`\n\t\tTest2 map[int]int       `validate:\"gt=0,dive,keys,eq=3,endkeys,eq=4\"             json:\"test2\"`\n\t\tTest3 map[int]int       `validate:\"gt=0,dive,keys,eq=3,endkeys\"                  json:\"test3\"`\n\t}\n\n\tvar tst Test\n\n\tvalidate := New()\n\terr := validate.Struct(tst)\n\tNotEqual(t, err, nil)\n\tEqual(t, len(err.(ValidationErrors)), 3)\n\tAssertError(t, err.(ValidationErrors), \"Test.Test1\", \"Test.Test1\", \"Test1\", \"Test1\", \"gt\")\n\tAssertError(t, err.(ValidationErrors), \"Test.Test2\", \"Test.Test2\", \"Test2\", \"Test2\", \"gt\")\n\tAssertError(t, err.(ValidationErrors), \"Test.Test3\", \"Test.Test3\", \"Test3\", \"Test3\", \"gt\")\n\n\ttst.Test1 = map[string]string{\n\t\t\"testkey\": \"testval\",\n\t}\n\n\ttst.Test2 = map[int]int{\n\t\t3: 4,\n\t}\n\n\ttst.Test3 = map[int]int{\n\t\t3: 4,\n\t}\n\n\terr = validate.Struct(tst)\n\tEqual(t, err, nil)\n\n\ttst.Test1[\"badtestkey\"] = \"badtestvalue\"\n\ttst.Test2[10] = 11\n\n\terr = validate.Struct(tst)\n\tNotEqual(t, err, nil)\n\n\terrs := err.(ValidationErrors)\n\n\tEqual(t, len(errs), 4)\n\n\tAssertDeepError(t, errs, \"Test.Test1[badtestkey]\", \"Test.Test1[badtestkey]\", \"Test1[badtestkey]\", \"Test1[badtestkey]\", \"eq\", \"eq\")\n\tAssertDeepError(t, errs, \"Test.Test1[badtestkey]\", \"Test.Test1[badtestkey]\", \"Test1[badtestkey]\", \"Test1[badtestkey]\", \"eq\", \"eq\")\n\tAssertDeepError(t, errs, \"Test.Test2[10]\", \"Test.Test2[10]\", \"Test2[10]\", \"Test2[10]\", \"eq\", \"eq\")\n\tAssertDeepError(t, errs, \"Test.Test2[10]\", \"Test.Test2[10]\", \"Test2[10]\", \"Test2[10]\", \"eq\", \"eq\")\n\n\ttype Test2 struct {\n\t\tNestedKeys map[[1]string]string `validate:\"gt=0,dive,keys,dive,eq=innertestkey,endkeys,eq=outertestval\"`\n\t}\n\n\tvar tst2 Test2\n\n\terr = validate.Struct(tst2)\n\tNotEqual(t, err, nil)\n\tEqual(t, len(err.(ValidationErrors)), 1)\n\tAssertError(t, err.(ValidationErrors), \"Test2.NestedKeys\", \"Test2.NestedKeys\", \"NestedKeys\", \"NestedKeys\", \"gt\")\n\n\ttst2.NestedKeys = map[[1]string]string{\n\t\t{\"innertestkey\"}: \"outertestval\",\n\t}\n\n\terr = validate.Struct(tst2)\n\tEqual(t, err, nil)\n\n\ttst2.NestedKeys[[1]string{\"badtestkey\"}] = \"badtestvalue\"\n\n\terr = validate.Struct(tst2)\n\tNotEqual(t, err, nil)\n\n\terrs = err.(ValidationErrors)\n\n\tEqual(t, len(errs), 2)\n\tAssertDeepError(t, errs, \"Test2.NestedKeys[[badtestkey]][0]\", \"Test2.NestedKeys[[badtestkey]][0]\", \"NestedKeys[[badtestkey]][0]\", \"NestedKeys[[badtestkey]][0]\", \"eq\", \"eq\")\n\tAssertDeepError(t, errs, \"Test2.NestedKeys[[badtestkey]]\", \"Test2.NestedKeys[[badtestkey]]\", \"NestedKeys[[badtestkey]]\", \"NestedKeys[[badtestkey]]\", \"eq\", \"eq\")\n\n\t// test bad tag definitions\n\n\tPanicMatches(t, func() { _ = validate.Var(map[string]string{\"key\": \"val\"}, \"endkeys,dive,eq=val\") }, \"'endkeys' tag encountered without a corresponding 'keys' tag\")\n\tPanicMatches(t, func() { _ = validate.Var(1, \"keys,eq=1,endkeys\") }, \"'keys' tag must be immediately preceded by the 'dive' tag\")\n\n\t// test custom tag name\n\tvalidate = New()\n\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\t\treturn name\n\t})\n\n\terr = validate.Struct(tst)\n\tNotEqual(t, err, nil)\n\n\terrs = err.(ValidationErrors)\n\n\tEqual(t, len(errs), 4)\n\n\tAssertDeepError(t, errs, \"Test.test1[badtestkey]\", \"Test.Test1[badtestkey]\", \"test1[badtestkey]\", \"Test1[badtestkey]\", \"eq\", \"eq\")\n\tAssertDeepError(t, errs, \"Test.test1[badtestkey]\", \"Test.Test1[badtestkey]\", \"test1[badtestkey]\", \"Test1[badtestkey]\", \"eq\", \"eq\")\n\tAssertDeepError(t, errs, \"Test.test2[10]\", \"Test.Test2[10]\", \"test2[10]\", \"Test2[10]\", \"eq\", \"eq\")\n\tAssertDeepError(t, errs, \"Test.test2[10]\", \"Test.Test2[10]\", \"test2[10]\", \"Test2[10]\", \"eq\", \"eq\")\n}\n\n// Thanks @adrian-sgn specific test for your specific scenario\nfunc TestKeysCustomValidation(t *testing.T) {\n\ttype LangCode string\n\ttype Label map[LangCode]string\n\n\ttype TestMapStructPtr struct {\n\t\tLabel Label `validate:\"dive,keys,lang_code,endkeys,required\"`\n\t}\n\n\tvalidate := New()\n\terr := validate.RegisterValidation(\"lang_code\", func(fl FieldLevel) bool {\n\t\tvalidLangCodes := map[LangCode]struct{}{\n\t\t\t\"en\": {},\n\t\t\t\"es\": {},\n\t\t\t\"pt\": {},\n\t\t}\n\n\t\t_, ok := validLangCodes[fl.Field().Interface().(LangCode)]\n\t\treturn ok\n\t})\n\tEqual(t, err, nil)\n\n\tlabel := Label{\n\t\t\"en\":  \"Good morning!\",\n\t\t\"pt\":  \"\",\n\t\t\"es\":  \"¡Buenos días!\",\n\t\t\"xx\":  \"Bad key\",\n\t\t\"xxx\": \"\",\n\t}\n\n\terr = validate.Struct(TestMapStructPtr{label})\n\tNotEqual(t, err, nil)\n\n\terrs := err.(ValidationErrors)\n\tEqual(t, len(errs), 4)\n\n\tAssertDeepError(t, errs, \"TestMapStructPtr.Label[xx]\", \"TestMapStructPtr.Label[xx]\", \"Label[xx]\", \"Label[xx]\", \"lang_code\", \"lang_code\")\n\tAssertDeepError(t, errs, \"TestMapStructPtr.Label[pt]\", \"TestMapStructPtr.Label[pt]\", \"Label[pt]\", \"Label[pt]\", \"required\", \"required\")\n\tAssertDeepError(t, errs, \"TestMapStructPtr.Label[xxx]\", \"TestMapStructPtr.Label[xxx]\", \"Label[xxx]\", \"Label[xxx]\", \"lang_code\", \"lang_code\")\n\tAssertDeepError(t, errs, \"TestMapStructPtr.Label[xxx]\", \"TestMapStructPtr.Label[xxx]\", \"Label[xxx]\", \"Label[xxx]\", \"required\", \"required\")\n\n\t// find specific error\n\n\tvar e FieldError\n\tfor _, e = range errs {\n\t\tif e.Namespace() == \"TestMapStructPtr.Label[xxx]\" {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tEqual(t, e.Param(), \"\")\n\tEqual(t, e.Value().(LangCode), LangCode(\"xxx\"))\n\n\tfor _, e = range errs {\n\t\tif e.Namespace() == \"TestMapStructPtr.Label[xxx]\" && e.Tag() == \"required\" {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tEqual(t, e.Param(), \"\")\n\tEqual(t, e.Value().(string), \"\")\n}\n\nfunc TestKeyOrs(t *testing.T) {\n\ttype Test struct {\n\t\tTest1 map[string]string `validate:\"gt=0,dive,keys,eq=testkey|eq=testkeyok,endkeys,eq=testval\" json:\"test1\"`\n\t}\n\n\tvar tst Test\n\n\tvalidate := New()\n\terr := validate.Struct(tst)\n\tNotEqual(t, err, nil)\n\tEqual(t, len(err.(ValidationErrors)), 1)\n\tAssertError(t, err.(ValidationErrors), \"Test.Test1\", \"Test.Test1\", \"Test1\", \"Test1\", \"gt\")\n\n\ttst.Test1 = map[string]string{\n\t\t\"testkey\": \"testval\",\n\t}\n\n\terr = validate.Struct(tst)\n\tEqual(t, err, nil)\n\n\ttst.Test1[\"badtestkey\"] = \"badtestval\"\n\n\terr = validate.Struct(tst)\n\tNotEqual(t, err, nil)\n\n\terrs := err.(ValidationErrors)\n\n\tEqual(t, len(errs), 2)\n\n\tAssertDeepError(t, errs, \"Test.Test1[badtestkey]\", \"Test.Test1[badtestkey]\", \"Test1[badtestkey]\", \"Test1[badtestkey]\", \"eq=testkey|eq=testkeyok\", \"eq=testkey|eq=testkeyok\")\n\tAssertDeepError(t, errs, \"Test.Test1[badtestkey]\", \"Test.Test1[badtestkey]\", \"Test1[badtestkey]\", \"Test1[badtestkey]\", \"eq\", \"eq\")\n\n\tvalidate.RegisterAlias(\"okkey\", \"eq=testkey|eq=testkeyok\")\n\n\ttype Test2 struct {\n\t\tTest1 map[string]string `validate:\"gt=0,dive,keys,okkey,endkeys,eq=testval\" json:\"test1\"`\n\t}\n\n\tvar tst2 Test2\n\n\terr = validate.Struct(tst2)\n\tNotEqual(t, err, nil)\n\tEqual(t, len(err.(ValidationErrors)), 1)\n\tAssertError(t, err.(ValidationErrors), \"Test2.Test1\", \"Test2.Test1\", \"Test1\", \"Test1\", \"gt\")\n\n\ttst2.Test1 = map[string]string{\n\t\t\"testkey\": \"testval\",\n\t}\n\n\terr = validate.Struct(tst2)\n\tEqual(t, err, nil)\n\n\ttst2.Test1[\"badtestkey\"] = \"badtestval\"\n\n\terr = validate.Struct(tst2)\n\tNotEqual(t, err, nil)\n\n\terrs = err.(ValidationErrors)\n\n\tEqual(t, len(errs), 2)\n\n\tAssertDeepError(t, errs, \"Test2.Test1[badtestkey]\", \"Test2.Test1[badtestkey]\", \"Test1[badtestkey]\", \"Test1[badtestkey]\", \"okkey\", \"eq=testkey|eq=testkeyok\")\n\tAssertDeepError(t, errs, \"Test2.Test1[badtestkey]\", \"Test2.Test1[badtestkey]\", \"Test1[badtestkey]\", \"Test1[badtestkey]\", \"eq\", \"eq\")\n}\n\nfunc TestStructLevelValidationsPointerPassing(t *testing.T) {\n\tv1 := New()\n\tv1.RegisterStructValidation(StructValidationTestStruct, &TestStruct{})\n\n\ttst := &TestStruct{\n\t\tString: \"good value\",\n\t}\n\n\terrs := v1.Struct(tst)\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"TestStruct.StringVal\", \"TestStruct.String\", \"StringVal\", \"String\", \"badvalueteststruct\")\n}\n\nfunc TestDirValidation(t *testing.T) {\n\tvalidate := New()\n\n\ttests := []struct {\n\t\ttitle    string\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"existing dir\", \"testdata\", true},\n\t\t{\"existing self dir\", \".\", true},\n\t\t{\"existing parent dir\", \"..\", true},\n\t\t{\"empty dir\", \"\", false},\n\t\t{\"missing dir\", \"non_existing_testdata\", false},\n\t\t{\"a file not a directory\", filepath.Join(\"testdata\", \"a.go\"), false},\n\t}\n\n\tfor _, test := range tests {\n\t\terrs := validate.Var(test.param, \"dir\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Test: '%s' failed Error: %s\", test.title, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Test: '%s' failed Error: %s\", test.title, errs)\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var(2, \"dir\")\n\t}, \"Bad field type int\")\n}\n\nfunc TestDirPathValidation(t *testing.T) {\n\tvalidate := New()\n\n\ttests := []struct {\n\t\ttitle    string\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"empty dirpath\", \"\", false},\n\t\t{\"valid dirpath - exists\", \"testdata\", true},\n\t\t{\"valid dirpath - explicit\", \"testdatanoexist\" + string(os.PathSeparator), true},\n\t\t{\"invalid dirpath\", \"testdata\\000\" + string(os.PathSeparator), false},\n\t\t{\"file, not a dirpath\", filepath.Join(\"testdata\", \"a.go\"), false},\n\t}\n\n\tfor _, test := range tests {\n\t\terrs := validate.Var(test.param, \"dirpath\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Test: '%s' failed Error: %s\", test.title, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Test: '%s' failed Error: %s\", test.title, errs)\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var(6, \"filepath\")\n\t}, \"Bad field type int\")\n}\n\nfunc TestStartsWithValidation(t *testing.T) {\n\ttests := []struct {\n\t\tValue       string `validate:\"startswith=(/^ヮ^)/*:・ﾟ✧\"`\n\t\tTag         string\n\t\tExpectedNil bool\n\t}{\n\t\t{Value: \"(/^ヮ^)/*:・ﾟ✧ glitter\", Tag: \"startswith=(/^ヮ^)/*:・ﾟ✧\", ExpectedNil: true},\n\t\t{Value: \"abcd\", Tag: \"startswith=(/^ヮ^)/*:・ﾟ✧\", ExpectedNil: false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, s := range tests {\n\t\terrs := validate.Var(s.Value, s.Tag)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\n\t\terrs = validate.Struct(s)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\t}\n}\n\nfunc TestEndsWithValidation(t *testing.T) {\n\ttests := []struct {\n\t\tValue       string `validate:\"endswith=(/^ヮ^)/*:・ﾟ✧\"`\n\t\tTag         string\n\t\tExpectedNil bool\n\t}{\n\t\t{Value: \"glitter (/^ヮ^)/*:・ﾟ✧\", Tag: \"endswith=(/^ヮ^)/*:・ﾟ✧\", ExpectedNil: true},\n\t\t{Value: \"(/^ヮ^)/*:・ﾟ✧ glitter\", Tag: \"endswith=(/^ヮ^)/*:・ﾟ✧\", ExpectedNil: false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, s := range tests {\n\t\terrs := validate.Var(s.Value, s.Tag)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\n\t\terrs = validate.Struct(s)\n\n\t\tif (s.ExpectedNil && errs != nil) || (!s.ExpectedNil && errs == nil) {\n\t\t\tt.Fatalf(\"Index: %d failed Error: %s\", i, errs)\n\t\t}\n\t}\n}\n\nfunc TestRequiredIf(t *testing.T) {\n\ttype Inner struct {\n\t\tField *string\n\t}\n\n\tfieldVal := \"test\"\n\ttest := struct {\n\t\tInner   *Inner\n\t\tFieldE  string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string            `validate:\"required_if=FieldE test\" json:\"field_er\"`\n\t\tField1  string            `validate:\"omitempty\" json:\"field_1\"`\n\t\tField2  *string           `validate:\"required_if=Field1 test\" json:\"field_2\"`\n\t\tField3  map[string]string `validate:\"required_if=Field2 test\" json:\"field_3\"`\n\t\tField4  interface{}       `validate:\"required_if=Field3 1\" json:\"field_4\"`\n\t\tField5  int               `validate:\"required_if=Inner.Field test\" json:\"field_5\"`\n\t\tField6  uint              `validate:\"required_if=Field5 1\" json:\"field_6\"`\n\t\tField7  float32           `validate:\"required_if=Field6 1\" json:\"field_7\"`\n\t\tField8  float64           `validate:\"required_if=Field7 1.0\" json:\"field_8\"`\n\t\tField9  Inner             `validate:\"required_if=Field1 test\" json:\"field_9\"`\n\t\tField10 *Inner            `validate:\"required_if=Field1 test\" json:\"field_10\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: 2,\n\t}\n\n\tvalidate := New()\n\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest2 := struct {\n\t\tInner   *Inner\n\t\tInner2  *Inner\n\t\tFieldE  string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string            `validate:\"required_if=FieldE test\" json:\"field_er\"`\n\t\tField1  string            `validate:\"omitempty\" json:\"field_1\"`\n\t\tField2  *string           `validate:\"required_if=Field1 test\" json:\"field_2\"`\n\t\tField3  map[string]string `validate:\"required_if=Field2 test\" json:\"field_3\"`\n\t\tField4  interface{}       `validate:\"required_if=Field2 test\" json:\"field_4\"`\n\t\tField5  string            `validate:\"required_if=Field3 1\" json:\"field_5\"`\n\t\tField6  string            `validate:\"required_if=Inner.Field test\" json:\"field_6\"`\n\t\tField7  string            `validate:\"required_if=Inner2.Field test\" json:\"field_7\"`\n\t\tField8  Inner             `validate:\"required_if=Field2 test\" json:\"field_8\"`\n\t\tField9  *Inner            `validate:\"required_if=Field2 test\" json:\"field_9\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField2: &fieldVal,\n\t}\n\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 5)\n\tAssertError(t, errs, \"Field3\", \"Field3\", \"Field3\", \"Field3\", \"required_if\")\n\tAssertError(t, errs, \"Field4\", \"Field4\", \"Field4\", \"Field4\", \"required_if\")\n\tAssertError(t, errs, \"Field6\", \"Field6\", \"Field6\", \"Field6\", \"required_if\")\n\tAssertError(t, errs, \"Field8\", \"Field8\", \"Field8\", \"Field8\", \"required_if\")\n\tAssertError(t, errs, \"Field9\", \"Field9\", \"Field9\", \"Field9\", \"required_if\")\n\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Errorf(\"test3 should have panicked!\")\n\t\t}\n\t}()\n\n\ttest3 := struct {\n\t\tInner  *Inner\n\t\tField1 string `validate:\"required_if=Inner.Field\" json:\"field_1\"`\n\t}{\n\t\tInner: &Inner{Field: &fieldVal},\n\t}\n\t_ = validate.Struct(test3)\n}\n\nfunc TestRequiredIfDuplicateParams(t *testing.T) {\n\tvalidate := New()\n\n\tPanicMatches(t, func() {\n\t\ttype TestStruct struct {\n\t\t\tField1 string `validate:\"required_if=Field2 value1 Field2 value2\"`\n\t\t\tField2 string\n\t\t}\n\t\ttest := TestStruct{\n\t\t\tField1: \"\",\n\t\t\tField2: \"value1\",\n\t\t}\n\t\t_ = validate.Struct(test)\n\t}, \"Duplicate param Field2 for required_if Field1\")\n\n\tPanicMatches(t, func() {\n\t\ttype TestStruct struct {\n\t\t\tField1 string `validate:\"required_if=Field2 val1 Field3 val2 Field2 val3\"`\n\t\t\tField2 string\n\t\t\tField3 string\n\t\t}\n\t\ttest := TestStruct{\n\t\t\tField1: \"\",\n\t\t\tField2: \"val1\",\n\t\t\tField3: \"val2\",\n\t\t}\n\t\t_ = validate.Struct(test)\n\t}, \"Duplicate param Field2 for required_if Field1\")\n\n\ttype TestStruct struct {\n\t\tField1 string `validate:\"required_if=Field2 val1 Field3 val2\"`\n\t\tField2 string\n\t\tField3 string\n\t}\n\ttest := TestStruct{\n\t\tField1: \"\",\n\t\tField2: \"val1\",\n\t\tField3: \"val2\",\n\t}\n\terrs := validate.Struct(test)\n\tNotEqual(t, errs, nil)\n}\n\nfunc TestRequiredUnless(t *testing.T) {\n\ttype Inner struct {\n\t\tField *string\n\t}\n\n\tfieldVal := \"test\"\n\ttest := struct {\n\t\tInner   *Inner\n\t\tFieldE  string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string            `validate:\"required_unless=FieldE test\" json:\"field_er\"`\n\t\tField1  string            `validate:\"omitempty\" json:\"field_1\"`\n\t\tField2  *string           `validate:\"required_unless=Field1 test\" json:\"field_2\"`\n\t\tField3  map[string]string `validate:\"required_unless=Field2 test\" json:\"field_3\"`\n\t\tField4  interface{}       `validate:\"required_unless=Field3 1\" json:\"field_4\"`\n\t\tField5  int               `validate:\"required_unless=Inner.Field test\" json:\"field_5\"`\n\t\tField6  uint              `validate:\"required_unless=Field5 2\" json:\"field_6\"`\n\t\tField7  float32           `validate:\"required_unless=Field6 0\" json:\"field_7\"`\n\t\tField8  float64           `validate:\"required_unless=Field7 0.0\" json:\"field_8\"`\n\t\tField9  bool              `validate:\"omitempty\" json:\"field_9\"`\n\t\tField10 string            `validate:\"required_unless=Field9 true\" json:\"field_10\"`\n\t\tField11 Inner             `validate:\"required_unless=Field9 true\" json:\"field_11\"`\n\t\tField12 *Inner            `validate:\"required_unless=Field9 true\" json:\"field_12\"`\n\t}{\n\t\tFieldE: \"test\",\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: 2,\n\t\tField9: true,\n\t}\n\n\tvalidate := New()\n\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest2 := struct {\n\t\tInner   *Inner\n\t\tInner2  *Inner\n\t\tFieldE  string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string            `validate:\"required_unless=FieldE test\" json:\"field_er\"`\n\t\tField1  string            `validate:\"omitempty\" json:\"field_1\"`\n\t\tField2  *string           `validate:\"required_unless=Field1 test\" json:\"field_2\"`\n\t\tField3  map[string]string `validate:\"required_unless=Field2 test\" json:\"field_3\"`\n\t\tField4  interface{}       `validate:\"required_unless=Field2 test\" json:\"field_4\"`\n\t\tField5  string            `validate:\"required_unless=Field3 0\" json:\"field_5\"`\n\t\tField6  string            `validate:\"required_unless=Inner.Field test\" json:\"field_6\"`\n\t\tField7  string            `validate:\"required_unless=Inner2.Field test\" json:\"field_7\"`\n\t\tField8  bool              `validate:\"omitempty\" json:\"field_8\"`\n\t\tField9  string            `validate:\"required_unless=Field8 true\" json:\"field_9\"`\n\t\tField10 Inner             `validate:\"required_unless=Field9 true\" json:\"field_10\"`\n\t\tField11 *Inner            `validate:\"required_unless=Field9 true\" json:\"field_11\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tFieldE: \"test\",\n\t\tField1: \"test\",\n\t}\n\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 6)\n\tAssertError(t, errs, \"Field3\", \"Field3\", \"Field3\", \"Field3\", \"required_unless\")\n\tAssertError(t, errs, \"Field4\", \"Field4\", \"Field4\", \"Field4\", \"required_unless\")\n\tAssertError(t, errs, \"Field7\", \"Field7\", \"Field7\", \"Field7\", \"required_unless\")\n\tAssertError(t, errs, \"Field9\", \"Field9\", \"Field9\", \"Field9\", \"required_unless\")\n\tAssertError(t, errs, \"Field10\", \"Field10\", \"Field10\", \"Field10\", \"required_unless\")\n\tAssertError(t, errs, \"Field11\", \"Field11\", \"Field11\", \"Field11\", \"required_unless\")\n\n\tPanicMatches(t, func() {\n\t\ttest3 := struct {\n\t\t\tInner  *Inner\n\t\t\tField1 string `validate:\"required_unless=Inner.Field\" json:\"field_1\"`\n\t\t}{\n\t\t\tInner: &Inner{Field: &fieldVal},\n\t\t}\n\t\t_ = validate.Struct(test3)\n\t}, \"Bad param number for required_unless Field1\")\n\n\ttype DuplicateStruct struct {\n\t\tField1 string `validate:\"required_unless=Field2 value1 Field2 value2\"`\n\t\tField2 string\n\t}\n\ttest4 := DuplicateStruct{\n\t\tField1: \"\",\n\t\tField2: \"value1\",\n\t}\n\terrs = validate.Struct(test4)\n\tEqual(t, errs, nil)\n\n\ttest5 := DuplicateStruct{\n\t\tField1: \"\",\n\t\tField2: \"value2\",\n\t}\n\terrs = validate.Struct(test5)\n\tEqual(t, errs, nil)\n\n\ttest6 := DuplicateStruct{\n\t\tField1: \"\",\n\t\tField2: \"value3\",\n\t}\n\terrs = validate.Struct(test6)\n\tNotEqual(t, errs, nil)\n\n\ttest7 := struct {\n\t\tField1 int\n\t\tField2 string `validate:\"required_unless=Field1 1 Field1 2\"`\n\t\tField3 int\n\t\tField4 string `validate:\"required_unless=Field3 1 Field3 2\"`\n\t}{\n\t\tField1: 1,\n\t\tField3: 3,\n\t}\n\n\terrs = validate.Struct(test7)\n\tNotEqual(t, errs, nil)\n\n\tAssertError(t, errs, \"Field4\", \"Field4\", \"Field4\", \"Field4\", \"required_unless\")\n}\n\nfunc TestSkipUnless(t *testing.T) {\n\ttype Inner struct {\n\t\tField *string\n\t}\n\n\tfieldVal := \"test1\"\n\ttest := struct {\n\t\tInner   *Inner\n\t\tFieldE  string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string            `validate:\"skip_unless=FieldE test\" json:\"field_er\"`\n\t\tField1  string            `validate:\"omitempty\" json:\"field_1\"`\n\t\tField2  *string           `validate:\"skip_unless=Field1 test\" json:\"field_2\"`\n\t\tField3  map[string]string `validate:\"skip_unless=Field2 test\" json:\"field_3\"`\n\t\tField4  interface{}       `validate:\"skip_unless=Field3 1\" json:\"field_4\"`\n\t\tField5  int               `validate:\"skip_unless=Inner.Field test\" json:\"field_5\"`\n\t\tField6  uint              `validate:\"skip_unless=Field5 2\" json:\"field_6\"`\n\t\tField7  float32           `validate:\"skip_unless=Field6 1\" json:\"field_7\"`\n\t\tField8  float64           `validate:\"skip_unless=Field7 1.0\" json:\"field_8\"`\n\t\tField9  bool              `validate:\"omitempty\" json:\"field_9\"`\n\t\tField10 string            `validate:\"skip_unless=Field9 false\" json:\"field_10\"`\n\t\tField11 Inner             `validate:\"skip_unless=Field9 false\" json:\"field_11\"`\n\t\tField12 *Inner            `validate:\"skip_unless=Field9 false\" json:\"field_12\"`\n\t}{\n\t\tFieldE: \"test1\",\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: 3,\n\t\tField9: true,\n\t}\n\n\tvalidate := New()\n\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest2 := struct {\n\t\tInner   *Inner\n\t\tInner2  *Inner\n\t\tFieldE  string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string            `validate:\"skip_unless=FieldE test\" json:\"field_er\"`\n\t\tField1  string            `validate:\"omitempty\" json:\"field_1\"`\n\t\tField2  *string           `validate:\"skip_unless=Field1 test\" json:\"field_2\"`\n\t\tField3  map[string]string `validate:\"skip_unless=Field2 test\" json:\"field_3\"`\n\t\tField4  interface{}       `validate:\"skip_unless=Field2 test\" json:\"field_4\"`\n\t\tField5  string            `validate:\"skip_unless=Field3 0\" json:\"field_5\"`\n\t\tField6  string            `validate:\"skip_unless=Inner.Field test\" json:\"field_6\"`\n\t\tField7  string            `validate:\"skip_unless=Inner2.Field test\" json:\"field_7\"`\n\t\tField8  bool              `validate:\"omitempty\" json:\"field_8\"`\n\t\tField9  string            `validate:\"skip_unless=Field8 true\" json:\"field_9\"`\n\t\tField10 Inner             `validate:\"skip_unless=Field8 false\" json:\"field_10\"`\n\t\tField11 *Inner            `validate:\"skip_unless=Field8 false\" json:\"field_11\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tFieldE: \"test1\",\n\t\tField1: \"test1\",\n\t}\n\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 3)\n\tAssertError(t, errs, \"Field5\", \"Field5\", \"Field5\", \"Field5\", \"skip_unless\")\n\tAssertError(t, errs, \"Field10\", \"Field10\", \"Field10\", \"Field10\", \"skip_unless\")\n\tAssertError(t, errs, \"Field11\", \"Field11\", \"Field11\", \"Field11\", \"skip_unless\")\n\n\ttest3 := struct {\n\t\tInner  *Inner\n\t\tField1 string `validate:\"skip_unless=Inner.Field\" json:\"field_1\"`\n\t}{\n\t\tInner: &Inner{Field: &fieldVal},\n\t}\n\tPanicMatches(t, func() {\n\t\t_ = validate.Struct(test3)\n\t}, \"Bad param number for skip_unless Field1\")\n\n\ttest4 := struct {\n\t\tInner  *Inner\n\t\tField1 string `validate:\"skip_unless=Inner.Field test1\" json:\"field_1\"`\n\t}{\n\t\tInner: &Inner{Field: &fieldVal},\n\t}\n\terrs = validate.Struct(test4)\n\tNotEqual(t, errs, nil)\n\n\tve = errs.(ValidationErrors)\n\tEqual(t, len(ve), 1)\n\tAssertError(t, errs, \"Field1\", \"Field1\", \"Field1\", \"Field1\", \"skip_unless\")\n}\n\nfunc TestRequiredWith(t *testing.T) {\n\ttype Inner struct {\n\t\tField *string\n\t}\n\n\tfieldVal := \"test\"\n\ttest := struct {\n\t\tInner   *Inner\n\t\tFieldE  string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string            `validate:\"required_with=FieldE\" json:\"field_er\"`\n\t\tField1  string            `validate:\"omitempty\" json:\"field_1\"`\n\t\tField2  *string           `validate:\"required_with=Field1\" json:\"field_2\"`\n\t\tField3  map[string]string `validate:\"required_with=Field2\" json:\"field_3\"`\n\t\tField4  interface{}       `validate:\"required_with=Field3\" json:\"field_4\"`\n\t\tField5  string            `validate:\"required_with=Field\" json:\"field_5\"`\n\t\tField6  Inner             `validate:\"required_with=Field2\" json:\"field_6\"`\n\t\tField7  *Inner            `validate:\"required_with=Field2\" json:\"field_7\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t\tField6: Inner{Field: &fieldVal},\n\t\tField7: &Inner{Field: &fieldVal},\n\t}\n\n\tvalidate := New()\n\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest2 := struct {\n\t\tInner   *Inner\n\t\tInner2  *Inner\n\t\tFieldE  string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string            `validate:\"required_with=FieldE\" json:\"field_er\"`\n\t\tField1  string            `validate:\"omitempty\" json:\"field_1\"`\n\t\tField2  *string           `validate:\"required_with=Field1\" json:\"field_2\"`\n\t\tField3  map[string]string `validate:\"required_with=Field2\" json:\"field_3\"`\n\t\tField4  interface{}       `validate:\"required_with=Field2\" json:\"field_4\"`\n\t\tField5  string            `validate:\"required_with=Field3\" json:\"field_5\"`\n\t\tField6  string            `validate:\"required_with=Inner.Field\" json:\"field_6\"`\n\t\tField7  string            `validate:\"required_with=Inner2.Field\" json:\"field_7\"`\n\t\tField8  Inner             `validate:\"required_with=Field2\" json:\"field_8\"`\n\t\tField9  *Inner            `validate:\"required_with=Field2\" json:\"field_9\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField2: &fieldVal,\n\t}\n\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 5)\n\tAssertError(t, errs, \"Field3\", \"Field3\", \"Field3\", \"Field3\", \"required_with\")\n\tAssertError(t, errs, \"Field4\", \"Field4\", \"Field4\", \"Field4\", \"required_with\")\n\tAssertError(t, errs, \"Field6\", \"Field6\", \"Field6\", \"Field6\", \"required_with\")\n\tAssertError(t, errs, \"Field8\", \"Field8\", \"Field8\", \"Field8\", \"required_with\")\n\tAssertError(t, errs, \"Field9\", \"Field9\", \"Field9\", \"Field9\", \"required_with\")\n}\n\nfunc TestExcludedWith(t *testing.T) {\n\ttype Inner struct {\n\t\tFieldE string\n\t\tField  *string\n\t}\n\n\tfieldVal := \"test\"\n\ttest := struct {\n\t\tInner  *Inner\n\t\tInner2 *Inner\n\t\tField  string            `validate:\"omitempty\" json:\"field\"`\n\t\tFieldE string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 string            `validate:\"excluded_with=FieldE\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"excluded_with=FieldE\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"excluded_with=FieldE\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"excluded_with=FieldE\" json:\"field_4\"`\n\t\tField5 string            `validate:\"excluded_with=Inner.FieldE\" json:\"field_5\"`\n\t\tField6 string            `validate:\"excluded_with=Inner2.FieldE\" json:\"field_6\"`\n\t\tField7 Inner             `validate:\"excluded_with=FieldE\" json:\"field_7\"`\n\t\tField8 *Inner            `validate:\"excluded_with=FieldE\" json:\"field_8\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField1: fieldVal,\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t\tField6: \"test\",\n\t}\n\n\tvalidate := New()\n\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest2 := struct {\n\t\tInner  *Inner\n\t\tInner2 *Inner\n\t\tField  string            `validate:\"omitempty\" json:\"field\"`\n\t\tFieldE string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 string            `validate:\"excluded_with=Field\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"excluded_with=Field\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"excluded_with=Field\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"excluded_with=Field\" json:\"field_4\"`\n\t\tField5 string            `validate:\"excluded_with=Inner.Field\" json:\"field_5\"`\n\t\tField6 string            `validate:\"excluded_with=Inner2.Field\" json:\"field_6\"`\n\t\tField7 Inner             `validate:\"excluded_with=Field\" json:\"field_7\"`\n\t\tField8 *Inner            `validate:\"excluded_with=Field\" json:\"field_8\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField:  \"populated\",\n\t\tField1: fieldVal,\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t\tField6: \"test\",\n\t\tField7: Inner{FieldE: \"potato\"},\n\t\tField8: &Inner{FieldE: \"potato\"},\n\t}\n\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 7)\n\tfor i := 1; i <= 7; i++ {\n\t\t// accounting for field 7 & 8 failures, 6 skipped because no failure\n\t\tif i > 5 {\n\t\t\ti++\n\t\t}\n\t\tname := fmt.Sprintf(\"Field%d\", i)\n\t\tAssertError(t, errs, name, name, name, name, \"excluded_with\")\n\t}\n\n\ttest3 := struct {\n\t\tInner  *Inner\n\t\tInner2 *Inner\n\t\tField  string            `validate:\"omitempty\" json:\"field\"`\n\t\tFieldE string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 string            `validate:\"excluded_with=FieldE\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"excluded_with=FieldE\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"excluded_with=FieldE\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"excluded_with=FieldE\" json:\"field_4\"`\n\t\tField5 string            `validate:\"excluded_with=Inner.FieldE\" json:\"field_5\"`\n\t\tField6 string            `validate:\"excluded_with=Inner2.FieldE\" json:\"field_6\"`\n\t\tField7 Inner             `validate:\"excluded_with=FieldE\" json:\"field_7\"`\n\t\tField8 *Inner            `validate:\"excluded_with=FieldE\" json:\"field_8\"`\n\t}{\n\t\tInner:  &Inner{FieldE: \"populated\"},\n\t\tInner2: &Inner{FieldE: \"populated\"},\n\t\tFieldE: \"populated\",\n\t}\n\n\tvalidate = New()\n\n\terrs = validate.Struct(test3)\n\tEqual(t, errs, nil)\n}\n\nfunc TestExcludedWithout(t *testing.T) {\n\ttype Inner struct {\n\t\tFieldE string\n\t\tField  *string\n\t}\n\n\tfieldVal := \"test\"\n\ttest := struct {\n\t\tInner  *Inner\n\t\tInner2 *Inner\n\t\tField  string            `validate:\"omitempty\" json:\"field\"`\n\t\tFieldE string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 string            `validate:\"excluded_without=Field\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"excluded_without=Field\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"excluded_without=Field\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"excluded_without=Field\" json:\"field_4\"`\n\t\tField5 string            `validate:\"excluded_without=Inner.Field\" json:\"field_5\"`\n\t\tField6 Inner             `validate:\"excluded_without=Field\" json:\"field_6\"`\n\t\tField7 *Inner            `validate:\"excluded_without=Field\" json:\"field_7\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField:  \"populated\",\n\t\tField1: fieldVal,\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t\tField6: Inner{FieldE: \"potato\"},\n\t\tField7: &Inner{FieldE: \"potato\"},\n\t}\n\n\tvalidate := New()\n\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest2 := struct {\n\t\tInner  *Inner\n\t\tInner2 *Inner\n\t\tField  string            `validate:\"omitempty\" json:\"field\"`\n\t\tFieldE string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 string            `validate:\"excluded_without=FieldE\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"excluded_without=FieldE\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"excluded_without=FieldE\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"excluded_without=FieldE\" json:\"field_4\"`\n\t\tField5 string            `validate:\"excluded_without=Inner.FieldE\" json:\"field_5\"`\n\t\tField6 string            `validate:\"excluded_without=Inner2.FieldE\" json:\"field_6\"`\n\t\tField7 Inner             `validate:\"excluded_without=FieldE\" json:\"field_7\"`\n\t\tField8 *Inner            `validate:\"excluded_without=FieldE\" json:\"field_8\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField1: fieldVal,\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t\tField6: \"test\",\n\t\tField7: Inner{FieldE: \"potato\"},\n\t\tField8: &Inner{FieldE: \"potato\"},\n\t}\n\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 8)\n\tfor i := 1; i <= 8; i++ {\n\t\tname := fmt.Sprintf(\"Field%d\", i)\n\t\tAssertError(t, errs, name, name, name, name, \"excluded_without\")\n\t}\n\n\ttest3 := struct {\n\t\tInner  *Inner\n\t\tInner2 *Inner\n\t\tField  string            `validate:\"omitempty\" json:\"field\"`\n\t\tFieldE string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 string            `validate:\"excluded_without=Field\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"excluded_without=Field\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"excluded_without=Field\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"excluded_without=Field\" json:\"field_4\"`\n\t\tField5 string            `validate:\"excluded_without=Inner.Field\" json:\"field_5\"`\n\t\tField6 Inner             `validate:\"excluded_without=Field\" json:\"field_6\"`\n\t\tField7 *Inner            `validate:\"excluded_without=Field\" json:\"field_7\"`\n\t}{\n\t\tInner: &Inner{Field: &fieldVal},\n\t\tField: \"populated\",\n\t}\n\n\tvalidate = New()\n\n\terrs = validate.Struct(test3)\n\tEqual(t, errs, nil)\n}\n\nfunc TestExcludedWithAll(t *testing.T) {\n\ttype Inner struct {\n\t\tFieldE string\n\t\tField  *string\n\t}\n\n\tfieldVal := \"test\"\n\ttest := struct {\n\t\tInner  *Inner\n\t\tInner2 *Inner\n\t\tField  string            `validate:\"omitempty\" json:\"field\"`\n\t\tFieldE string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 string            `validate:\"excluded_with_all=FieldE Field\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"excluded_with_all=FieldE Field\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"excluded_with_all=FieldE Field\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"excluded_with_all=FieldE Field\" json:\"field_4\"`\n\t\tField5 string            `validate:\"excluded_with_all=Inner.FieldE\" json:\"field_5\"`\n\t\tField6 string            `validate:\"excluded_with_all=Inner2.FieldE\" json:\"field_6\"`\n\t\tField7 Inner             `validate:\"excluded_with_all=FieldE Field\" json:\"field_7\"`\n\t\tField8 *Inner            `validate:\"excluded_with_all=FieldE Field\" json:\"field_8\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField:  fieldVal,\n\t\tField1: fieldVal,\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t\tField6: \"test\",\n\t\tField7: Inner{FieldE: \"potato\"},\n\t\tField8: &Inner{FieldE: \"potato\"},\n\t}\n\n\tvalidate := New()\n\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest2 := struct {\n\t\tInner  *Inner\n\t\tInner2 *Inner\n\t\tField  string            `validate:\"omitempty\" json:\"field\"`\n\t\tFieldE string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 string            `validate:\"excluded_with_all=Field FieldE\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"excluded_with_all=Field FieldE\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"excluded_with_all=Field FieldE\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"excluded_with_all=Field FieldE\" json:\"field_4\"`\n\t\tField5 string            `validate:\"excluded_with_all=Inner.Field\" json:\"field_5\"`\n\t\tField6 string            `validate:\"excluded_with_all=Inner2.Field\" json:\"field_6\"`\n\t\tField7 Inner             `validate:\"excluded_with_all=Field FieldE\" json:\"field_7\"`\n\t\tField8 *Inner            `validate:\"excluded_with_all=Field FieldE\" json:\"field_8\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField:  \"populated\",\n\t\tFieldE: \"populated\",\n\t\tField1: fieldVal,\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t\tField6: \"test\",\n\t\tField7: Inner{FieldE: \"potato\"},\n\t\tField8: &Inner{FieldE: \"potato\"},\n\t}\n\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 7)\n\tfor i := 1; i <= 7; i++ {\n\t\t// accounting for no err for field 6\n\t\tif i > 5 {\n\t\t\ti++\n\t\t}\n\t\tname := fmt.Sprintf(\"Field%d\", i)\n\t\tAssertError(t, errs, name, name, name, name, \"excluded_with_all\")\n\t}\n\n\ttest3 := struct {\n\t\tInner  *Inner\n\t\tInner2 *Inner\n\t\tField  string            `validate:\"omitempty\" json:\"field\"`\n\t\tFieldE string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 string            `validate:\"excluded_with_all=FieldE Field\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"excluded_with_all=FieldE Field\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"excluded_with_all=FieldE Field\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"excluded_with_all=FieldE Field\" json:\"field_4\"`\n\t\tField5 string            `validate:\"excluded_with_all=Inner.FieldE\" json:\"field_5\"`\n\t\tField6 string            `validate:\"excluded_with_all=Inner2.FieldE\" json:\"field_6\"`\n\t\tField7 Inner             `validate:\"excluded_with_all=Field FieldE\" json:\"field_7\"`\n\t\tField8 *Inner            `validate:\"excluded_with_all=Field FieldE\" json:\"field_8\"`\n\t}{\n\t\tInner:  &Inner{FieldE: \"populated\"},\n\t\tInner2: &Inner{FieldE: \"populated\"},\n\t\tField:  \"populated\",\n\t\tFieldE: \"populated\",\n\t}\n\n\tvalidate = New()\n\n\terrs = validate.Struct(test3)\n\tEqual(t, errs, nil)\n}\n\nfunc TestExcludedWithoutAll(t *testing.T) {\n\ttype Inner struct {\n\t\tFieldE string\n\t\tField  *string\n\t}\n\n\tfieldVal := \"test\"\n\ttest := struct {\n\t\tInner  *Inner\n\t\tInner2 *Inner\n\t\tField  string            `validate:\"omitempty\" json:\"field\"`\n\t\tFieldE string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 string            `validate:\"excluded_without_all=Field FieldE\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"excluded_without_all=Field FieldE\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"excluded_without_all=Field FieldE\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"excluded_without_all=Field FieldE\" json:\"field_4\"`\n\t\tField5 string            `validate:\"excluded_without_all=Inner.Field Inner2.Field\" json:\"field_5\"`\n\t\tField6 Inner             `validate:\"excluded_without_all=Field FieldE\" json:\"field_6\"`\n\t\tField7 *Inner            `validate:\"excluded_without_all=Field FieldE\" json:\"field_7\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tInner2: &Inner{Field: &fieldVal},\n\t\tField:  \"populated\",\n\t\tField1: fieldVal,\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t\tField6: Inner{FieldE: \"potato\"},\n\t\tField7: &Inner{FieldE: \"potato\"},\n\t}\n\n\tvalidate := New()\n\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest2 := struct {\n\t\tInner  *Inner\n\t\tInner2 *Inner\n\t\tField  string            `validate:\"omitempty\" json:\"field\"`\n\t\tFieldE string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 string            `validate:\"excluded_without_all=FieldE Field\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"excluded_without_all=FieldE Field\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"excluded_without_all=FieldE Field\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"excluded_without_all=FieldE Field\" json:\"field_4\"`\n\t\tField5 string            `validate:\"excluded_without_all=Inner.FieldE\" json:\"field_5\"`\n\t\tField6 string            `validate:\"excluded_without_all=Inner2.FieldE\" json:\"field_6\"`\n\t\tField7 Inner             `validate:\"excluded_without_all=Field FieldE\" json:\"field_7\"`\n\t\tField8 *Inner            `validate:\"excluded_without_all=Field FieldE\" json:\"field_8\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField1: fieldVal,\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t\tField6: \"test\",\n\t\tField7: Inner{FieldE: \"potato\"},\n\t\tField8: &Inner{FieldE: \"potato\"},\n\t}\n\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 8)\n\tfor i := 1; i <= 8; i++ {\n\t\tname := fmt.Sprintf(\"Field%d\", i)\n\t\tAssertError(t, errs, name, name, name, name, \"excluded_without_all\")\n\t}\n\n\ttest3 := struct {\n\t\tInner  *Inner\n\t\tInner2 *Inner\n\t\tField  string            `validate:\"omitempty\" json:\"field\"`\n\t\tFieldE string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 string            `validate:\"excluded_without_all=Field FieldE\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"excluded_without_all=Field FieldE\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"excluded_without_all=Field FieldE\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"excluded_without_all=Field FieldE\" json:\"field_4\"`\n\t\tField5 string            `validate:\"excluded_without_all=Inner.Field Inner2.Field\" json:\"field_5\"`\n\t\tField6 Inner             `validate:\"excluded_without_all=Field FieldE\" json:\"field_6\"`\n\t\tField7 *Inner            `validate:\"excluded_without_all=Field FieldE\" json:\"field_7\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tInner2: &Inner{Field: &fieldVal},\n\t\tField:  \"populated\",\n\t\tFieldE: \"populated\",\n\t}\n\n\tvalidate = New()\n\n\terrs = validate.Struct(test3)\n\tEqual(t, errs, nil)\n}\n\nfunc TestRequiredWithAll(t *testing.T) {\n\ttype Inner struct {\n\t\tField *string\n\t}\n\n\tfieldVal := \"test\"\n\ttest := struct {\n\t\tInner   *Inner\n\t\tFieldE  string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string            `validate:\"required_with_all=FieldE\" json:\"field_er\"`\n\t\tField1  string            `validate:\"omitempty\" json:\"field_1\"`\n\t\tField2  *string           `validate:\"required_with_all=Field1\" json:\"field_2\"`\n\t\tField3  map[string]string `validate:\"required_with_all=Field2\" json:\"field_3\"`\n\t\tField4  interface{}       `validate:\"required_with_all=Field3\" json:\"field_4\"`\n\t\tField5  string            `validate:\"required_with_all=Inner.Field\" json:\"field_5\"`\n\t\tField6  Inner             `validate:\"required_with_all=Field1 Field2\" json:\"field_6\"`\n\t\tField7  *Inner            `validate:\"required_with_all=Field1 Field2\" json:\"field_7\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField1: \"test_field1\",\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t\tField6: Inner{Field: &fieldVal},\n\t\tField7: &Inner{Field: &fieldVal},\n\t}\n\n\tvalidate := New()\n\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest2 := struct {\n\t\tInner   *Inner\n\t\tInner2  *Inner\n\t\tFieldE  string            `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string            `validate:\"required_with_all=FieldE\" json:\"field_er\"`\n\t\tField1  string            `validate:\"omitempty\" json:\"field_1\"`\n\t\tField2  *string           `validate:\"required_with_all=Field1\" json:\"field_2\"`\n\t\tField3  map[string]string `validate:\"required_with_all=Field2\" json:\"field_3\"`\n\t\tField4  interface{}       `validate:\"required_with_all=Field1 FieldE\" json:\"field_4\"`\n\t\tField5  string            `validate:\"required_with_all=Inner.Field Field2\" json:\"field_5\"`\n\t\tField6  string            `validate:\"required_with_all=Inner2.Field Field2\" json:\"field_6\"`\n\t\tField7  Inner             `validate:\"required_with_all=Inner.Field Field2\" json:\"field_7\"`\n\t\tField8  *Inner            `validate:\"required_with_all=Inner.Field Field2\" json:\"field_8\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField2: &fieldVal,\n\t}\n\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 4)\n\tAssertError(t, errs, \"Field3\", \"Field3\", \"Field3\", \"Field3\", \"required_with_all\")\n\tAssertError(t, errs, \"Field5\", \"Field5\", \"Field5\", \"Field5\", \"required_with_all\")\n\tAssertError(t, errs, \"Field7\", \"Field7\", \"Field7\", \"Field7\", \"required_with_all\")\n\tAssertError(t, errs, \"Field8\", \"Field8\", \"Field8\", \"Field8\", \"required_with_all\")\n}\n\nfunc TestRequiredWithout(t *testing.T) {\n\ttype Inner struct {\n\t\tField *string\n\t}\n\n\tfieldVal := \"test\"\n\ttest := struct {\n\t\tInner  *Inner\n\t\tField1 string            `validate:\"omitempty\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"required_without=Field1\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"required_without=Field2\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"required_without=Field3\" json:\"field_4\"`\n\t\tField5 string            `validate:\"required_without=Field3\" json:\"field_5\"`\n\t\tField6 Inner             `validate:\"required_without=Field1\" json:\"field_6\"`\n\t\tField7 *Inner            `validate:\"required_without=Field1\" json:\"field_7\"`\n\t}{\n\t\tInner:  &Inner{Field: &fieldVal},\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t\tField6: Inner{Field: &fieldVal},\n\t\tField7: &Inner{Field: &fieldVal},\n\t}\n\n\tvalidate := New()\n\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest2 := struct {\n\t\tInner   *Inner\n\t\tInner2  *Inner\n\t\tField1  string            `json:\"field_1\"`\n\t\tField2  *string           `validate:\"required_without=Field1\" json:\"field_2\"`\n\t\tField3  map[string]string `validate:\"required_without=Field2\" json:\"field_3\"`\n\t\tField4  interface{}       `validate:\"required_without=Field3\" json:\"field_4\"`\n\t\tField5  string            `validate:\"required_without=Field3\" json:\"field_5\"`\n\t\tField6  string            `validate:\"required_without=Field1\" json:\"field_6\"`\n\t\tField7  string            `validate:\"required_without=Inner.Field\" json:\"field_7\"`\n\t\tField8  string            `validate:\"required_without=Inner.Field\" json:\"field_8\"`\n\t\tField9  Inner             `validate:\"required_without=Field1\" json:\"field_9\"`\n\t\tField10 *Inner            `validate:\"required_without=Field1\" json:\"field_10\"`\n\t}{\n\t\tInner:  &Inner{},\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t}\n\n\terrs = validate.Struct(&test2)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 6)\n\tAssertError(t, errs, \"Field2\", \"Field2\", \"Field2\", \"Field2\", \"required_without\")\n\tAssertError(t, errs, \"Field6\", \"Field6\", \"Field6\", \"Field6\", \"required_without\")\n\tAssertError(t, errs, \"Field7\", \"Field7\", \"Field7\", \"Field7\", \"required_without\")\n\tAssertError(t, errs, \"Field8\", \"Field8\", \"Field8\", \"Field8\", \"required_without\")\n\tAssertError(t, errs, \"Field9\", \"Field9\", \"Field9\", \"Field9\", \"required_without\")\n\tAssertError(t, errs, \"Field10\", \"Field10\", \"Field10\", \"Field10\", \"required_without\")\n\n\ttest3 := struct {\n\t\tField1 *string `validate:\"required_without=Field2,omitempty,min=1\" json:\"field_1\"`\n\t\tField2 *string `validate:\"required_without=Field1,omitempty,min=1\" json:\"field_2\"`\n\t}{\n\t\tField1: &fieldVal,\n\t}\n\n\terrs = validate.Struct(&test3)\n\tEqual(t, errs, nil)\n\n\ttest4 := struct {\n\t\tField1 string `validate:\"required_without=Field2 Field3,omitempty,min=1\" json:\"field_1\"`\n\t\tField2 string `json:\"field_2\"`\n\t\tField3 string `json:\"field_3\"`\n\t}{\n\t\tField1: \"test\",\n\t}\n\n\terrs = validate.Struct(&test4)\n\tEqual(t, errs, nil)\n\n\ttest5 := struct {\n\t\tField1 string `validate:\"required_without=Field2 Field3,omitempty,min=1\" json:\"field_1\"`\n\t\tField2 string `json:\"field_2\"`\n\t\tField3 string `json:\"field_3\"`\n\t}{\n\t\tField3: \"test\",\n\t}\n\n\terrs = validate.Struct(&test5)\n\tNotEqual(t, errs, nil)\n\n\tve = errs.(ValidationErrors)\n\tEqual(t, len(ve), 1)\n\tAssertError(t, errs, \"Field1\", \"Field1\", \"Field1\", \"Field1\", \"required_without\")\n}\n\nfunc TestRequiredWithoutAll(t *testing.T) {\n\ttype nested struct {\n\t\tvalue string\n\t}\n\tfieldVal := \"test\"\n\ttest := struct {\n\t\tField1 string            `validate:\"omitempty\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"required_without_all=Field1\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"required_without_all=Field2\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"required_without_all=Field3\" json:\"field_4\"`\n\t\tField5 string            `validate:\"required_without_all=Field3\" json:\"field_5\"`\n\t\tField6 nested            `validate:\"required_without_all=Field1\" json:\"field_6\"`\n\t\tField7 *nested           `validate:\"required_without_all=Field1\" json:\"field_7\"`\n\t}{\n\t\tField1: \"\",\n\t\tField2: &fieldVal,\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t\tField6: nested{\"potato\"},\n\t\tField7: &nested{\"potato\"},\n\t}\n\n\tvalidate := New()\n\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest2 := struct {\n\t\tField1 string            `validate:\"omitempty\" json:\"field_1\"`\n\t\tField2 *string           `validate:\"required_without_all=Field1\" json:\"field_2\"`\n\t\tField3 map[string]string `validate:\"required_without_all=Field2\" json:\"field_3\"`\n\t\tField4 interface{}       `validate:\"required_without_all=Field3\" json:\"field_4\"`\n\t\tField5 string            `validate:\"required_without_all=Field3\" json:\"field_5\"`\n\t\tField6 string            `validate:\"required_without_all=Field1 Field3\" json:\"field_6\"`\n\t\tField7 nested            `validate:\"required_without_all=Field1\" json:\"field_7\"`\n\t\tField8 *nested           `validate:\"required_without_all=Field1\" json:\"field_8\"`\n\t}{\n\t\tField3: map[string]string{\"key\": \"val\"},\n\t\tField4: \"test\",\n\t\tField5: \"test\",\n\t}\n\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 3)\n\tAssertError(t, errs, \"Field2\", \"Field2\", \"Field2\", \"Field2\", \"required_without_all\")\n\tAssertError(t, errs, \"Field7\", \"Field7\", \"Field7\", \"Field7\", \"required_without_all\")\n\tAssertError(t, errs, \"Field8\", \"Field8\", \"Field8\", \"Field8\", \"required_without_all\")\n}\n\nfunc TestExcludedIf(t *testing.T) {\n\tvalidate := New()\n\ttype Inner struct {\n\t\tField *string\n\t}\n\n\tshouldExclude := \"exclude\"\n\tshouldNotExclude := \"dontExclude\"\n\n\ttest1 := struct {\n\t\tFieldE  string  `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER *string `validate:\"excluded_if=FieldE exclude\" json:\"field_er\"`\n\t}{\n\t\tFieldE: shouldExclude,\n\t}\n\terrs := validate.Struct(test1)\n\tEqual(t, errs, nil)\n\n\ttest2 := struct {\n\t\tFieldE  string `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string `validate:\"excluded_if=FieldE exclude\" json:\"field_er\"`\n\t}{\n\t\tFieldE:  shouldExclude,\n\t\tFieldER: \"set\",\n\t}\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 1)\n\tAssertError(t, errs, \"FieldER\", \"FieldER\", \"FieldER\", \"FieldER\", \"excluded_if\")\n\n\ttest3 := struct {\n\t\tFieldE  string `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldF  string `validate:\"omitempty\" json:\"field_f\"`\n\t\tFieldER string `validate:\"excluded_if=FieldE exclude FieldF exclude\" json:\"field_er\"`\n\t}{\n\t\tFieldE:  shouldExclude,\n\t\tFieldF:  shouldExclude,\n\t\tFieldER: \"set\",\n\t}\n\terrs = validate.Struct(test3)\n\tNotEqual(t, errs, nil)\n\tve = errs.(ValidationErrors)\n\tEqual(t, len(ve), 1)\n\tAssertError(t, errs, \"FieldER\", \"FieldER\", \"FieldER\", \"FieldER\", \"excluded_if\")\n\n\ttest4 := struct {\n\t\tFieldE  string `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldF  string `validate:\"omitempty\" json:\"field_f\"`\n\t\tFieldER string `validate:\"excluded_if=FieldE exclude FieldF exclude\" json:\"field_er\"`\n\t}{\n\t\tFieldE:  shouldExclude,\n\t\tFieldF:  shouldNotExclude,\n\t\tFieldER: \"set\",\n\t}\n\terrs = validate.Struct(test4)\n\tEqual(t, errs, nil)\n\n\ttest5 := struct {\n\t\tFieldE  string `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string `validate:\"excluded_if=FieldE exclude\" json:\"field_er\"`\n\t}{\n\t\tFieldE: shouldNotExclude,\n\t}\n\terrs = validate.Struct(test5)\n\tEqual(t, errs, nil)\n\n\ttest6 := struct {\n\t\tFieldE  string `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string `validate:\"excluded_if=FieldE exclude\" json:\"field_er\"`\n\t}{\n\t\tFieldE:  shouldNotExclude,\n\t\tFieldER: \"set\",\n\t}\n\terrs = validate.Struct(test6)\n\tEqual(t, errs, nil)\n\n\ttest7 := struct {\n\t\tInner  *Inner\n\t\tFieldE string `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 int    `validate:\"excluded_if=Inner.Field exclude\" json:\"field_1\"`\n\t}{\n\t\tInner: &Inner{Field: &shouldExclude},\n\t}\n\terrs = validate.Struct(test7)\n\tEqual(t, errs, nil)\n\n\ttest8 := struct {\n\t\tInner  *Inner\n\t\tFieldE string `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 int    `validate:\"excluded_if=Inner.Field exclude\" json:\"field_1\"`\n\t}{\n\t\tInner:  &Inner{Field: &shouldExclude},\n\t\tField1: 1,\n\t}\n\terrs = validate.Struct(test8)\n\tNotEqual(t, errs, nil)\n\tve = errs.(ValidationErrors)\n\tEqual(t, len(ve), 1)\n\tAssertError(t, errs, \"Field1\", \"Field1\", \"Field1\", \"Field1\", \"excluded_if\")\n\n\ttest9 := struct {\n\t\tInner  *Inner\n\t\tFieldE string `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 int    `validate:\"excluded_if=Inner.Field exclude\" json:\"field_1\"`\n\t}{\n\t\tInner: &Inner{Field: &shouldNotExclude},\n\t}\n\terrs = validate.Struct(test9)\n\tEqual(t, errs, nil)\n\n\ttest10 := struct {\n\t\tInner  *Inner\n\t\tFieldE string `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 int    `validate:\"excluded_if=Inner.Field exclude\" json:\"field_1\"`\n\t}{\n\t\tInner:  &Inner{Field: &shouldNotExclude},\n\t\tField1: 1,\n\t}\n\terrs = validate.Struct(test10)\n\tEqual(t, errs, nil)\n\n\ttest11 := struct {\n\t\tField1 bool\n\t\tField2 *string `validate:\"excluded_if=Field1 false\"`\n\t}{\n\t\tField1: false,\n\t\tField2: nil,\n\t}\n\terrs = validate.Struct(test11)\n\tEqual(t, errs, nil)\n\n\ttest12 := struct {\n\t\tField1 bool\n\t\tField2 *string `validate:\"excluded_if=Field1 !Field1\"`\n\t}{\n\t\tField1: true,\n\t\tField2: nil,\n\t}\n\terrs = validate.Struct(test12)\n\tEqual(t, errs, nil)\n\t// Checks number of params in struct tag is correct\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Errorf(\"panicTest should have panicked!\")\n\t\t}\n\t}()\n\tfieldVal := \"panicTest\"\n\tpanicTest := struct {\n\t\tInner  *Inner\n\t\tField1 string `validate:\"excluded_if=Inner.Field\" json:\"field_1\"`\n\t}{\n\t\tInner: &Inner{Field: &fieldVal},\n\t}\n\t_ = validate.Struct(panicTest)\n}\n\nfunc TestExcludedUnless(t *testing.T) {\n\tvalidate := New()\n\ttype Inner struct {\n\t\tField *string\n\t}\n\n\tfieldVal := \"test\"\n\ttest := struct {\n\t\tFieldE  string `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string `validate:\"excluded_unless=FieldE test\" json:\"field_er\"`\n\t}{\n\t\tFieldE:  \"test\",\n\t\tFieldER: \"filled\",\n\t}\n\terrs := validate.Struct(test)\n\tEqual(t, errs, nil)\n\n\ttest2 := struct {\n\t\tFieldE  string `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string `validate:\"excluded_unless=FieldE test\" json:\"field_er\"`\n\t}{\n\t\tFieldE:  \"notest\",\n\t\tFieldER: \"filled\",\n\t}\n\terrs = validate.Struct(test2)\n\tNotEqual(t, errs, nil)\n\tve := errs.(ValidationErrors)\n\tEqual(t, len(ve), 1)\n\tAssertError(t, errs, \"FieldER\", \"FieldER\", \"FieldER\", \"FieldER\", \"excluded_unless\")\n\n\t// test5 and test6: excluded_unless has no effect if FieldER is left blank\n\ttest5 := struct {\n\t\tFieldE  string `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string `validate:\"excluded_unless=FieldE test\" json:\"field_er\"`\n\t}{\n\t\tFieldE: \"test\",\n\t}\n\terrs = validate.Struct(test5)\n\tEqual(t, errs, nil)\n\n\ttest6 := struct {\n\t\tFieldE  string `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string `validate:\"excluded_unless=FieldE test\" json:\"field_er\"`\n\t}{\n\t\tFieldE: \"notest\",\n\t}\n\terrs = validate.Struct(test6)\n\tEqual(t, errs, nil)\n\n\tshouldError := \"notest\"\n\ttest3 := struct {\n\t\tInner  *Inner\n\t\tField1 string `validate:\"excluded_unless=Inner.Field test\" json:\"field_1\"`\n\t}{\n\t\tInner:  &Inner{Field: &shouldError},\n\t\tField1: \"filled\",\n\t}\n\terrs = validate.Struct(test3)\n\tNotEqual(t, errs, nil)\n\tve = errs.(ValidationErrors)\n\tEqual(t, len(ve), 1)\n\tAssertError(t, errs, \"Field1\", \"Field1\", \"Field1\", \"Field1\", \"excluded_unless\")\n\n\tshouldPass := \"test\"\n\ttest4 := struct {\n\t\tInner  *Inner\n\t\tFieldE string `validate:\"omitempty\" json:\"field_e\"`\n\t\tField1 string `validate:\"excluded_unless=Inner.Field test\" json:\"field_1\"`\n\t}{\n\t\tInner:  &Inner{Field: &shouldPass},\n\t\tField1: \"filled\",\n\t}\n\terrs = validate.Struct(test4)\n\tEqual(t, errs, nil)\n\n\t// test7 and test8: excluded_unless has no effect if FieldER is left blank\n\ttest7 := struct {\n\t\tInner   *Inner\n\t\tFieldE  string `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string `validate:\"excluded_unless=Inner.Field test\" json:\"field_er\"`\n\t}{\n\t\tFieldE: \"test\",\n\t}\n\terrs = validate.Struct(test7)\n\tEqual(t, errs, nil)\n\n\ttest8 := struct {\n\t\tFieldE  string `validate:\"omitempty\" json:\"field_e\"`\n\t\tFieldER string `validate:\"excluded_unless=Inner.Field test\" json:\"field_er\"`\n\t}{\n\t\tFieldE: \"test\",\n\t}\n\terrs = validate.Struct(test8)\n\tEqual(t, errs, nil)\n\n\t// Checks number of params in struct tag is correct\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Errorf(\"panicTest should have panicked!\")\n\t\t}\n\t}()\n\tpanicTest := struct {\n\t\tInner  *Inner\n\t\tField1 string `validate:\"excluded_unless=Inner.Field\" json:\"field_1\"`\n\t}{\n\t\tInner: &Inner{Field: &fieldVal},\n\t}\n\t_ = validate.Struct(panicTest)\n\n\ttest9 := struct {\n\t\tField1 int\n\t\tField2 string `validate:\"excluded_unless=Field1 1 Field1 2\"`\n\t\tField3 int\n\t\tField4 string `validate:\"excluded_unless=Field3 1 Field3 2\"`\n\t}{\n\t\tField1: 1,\n\t\tField2: \"foo\",\n\t\tField3: 3,\n\t\tField4: \"foo\",\n\t}\n\n\terrs = validate.Struct(test9)\n\tNotEqual(t, errs, nil)\n\n\tve = errs.(ValidationErrors)\n\tEqual(t, len(ve), 1)\n\n\tAssertError(t, errs, \"Field4\", \"Field4\", \"Field4\", \"Field4\", \"excluded_unless\")\n}\n\nfunc TestLookup(t *testing.T) {\n\ttype Lookup struct {\n\t\tFieldA *string `json:\"fieldA,omitempty\" validate:\"required_without=FieldB\"`\n\t\tFieldB *string `json:\"fieldB,omitempty\" validate:\"required_without=FieldA\"`\n\t}\n\n\tfieldAValue := \"1232\"\n\tlookup := Lookup{\n\t\tFieldA: &fieldAValue,\n\t\tFieldB: nil,\n\t}\n\tEqual(t, New().Struct(lookup), nil)\n}\n\nfunc TestAbilityToValidateNils(t *testing.T) {\n\ttype TestStruct struct {\n\t\tTest *string `validate:\"nil\"`\n\t}\n\n\tts := TestStruct{}\n\tval := New()\n\tfn := func(fl FieldLevel) bool {\n\t\treturn fl.Field().Kind() == reflect.Ptr && fl.Field().IsNil()\n\t}\n\n\terr := val.RegisterValidation(\"nil\", fn, true)\n\tEqual(t, err, nil)\n\n\terrs := val.Struct(ts)\n\tEqual(t, errs, nil)\n\n\tstr := \"string\"\n\tts.Test = &str\n\n\terrs = val.Struct(ts)\n\tNotEqual(t, errs, nil)\n}\n\nfunc TestRequiredWithoutPointers(t *testing.T) {\n\ttype Lookup struct {\n\t\tFieldA *bool `json:\"fieldA,omitempty\" validate:\"required_without=FieldB\"`\n\t\tFieldB *bool `json:\"fieldB,omitempty\" validate:\"required_without=FieldA\"`\n\t}\n\n\tb := true\n\tlookup := Lookup{\n\t\tFieldA: &b,\n\t\tFieldB: nil,\n\t}\n\n\tval := New()\n\terrs := val.Struct(lookup)\n\tEqual(t, errs, nil)\n\n\tb = false\n\tlookup = Lookup{\n\t\tFieldA: &b,\n\t\tFieldB: nil,\n\t}\n\terrs = val.Struct(lookup)\n\tEqual(t, errs, nil)\n}\n\nfunc TestRequiredWithoutAllPointers(t *testing.T) {\n\ttype Lookup struct {\n\t\tFieldA *bool `json:\"fieldA,omitempty\" validate:\"required_without_all=FieldB\"`\n\t\tFieldB *bool `json:\"fieldB,omitempty\" validate:\"required_without_all=FieldA\"`\n\t}\n\n\tb := true\n\tlookup := Lookup{\n\t\tFieldA: &b,\n\t\tFieldB: nil,\n\t}\n\n\tval := New()\n\terrs := val.Struct(lookup)\n\tEqual(t, errs, nil)\n\n\tb = false\n\tlookup = Lookup{\n\t\tFieldA: &b,\n\t\tFieldB: nil,\n\t}\n\terrs = val.Struct(lookup)\n\tEqual(t, errs, nil)\n}\n\nfunc TestGetTag(t *testing.T) {\n\tvar tag string\n\n\ttype Test struct {\n\t\tString string `validate:\"mytag\"`\n\t}\n\n\tval := New()\n\t_ = val.RegisterValidation(\"mytag\", func(fl FieldLevel) bool {\n\t\ttag = fl.GetTag()\n\t\treturn true\n\t})\n\n\tvar test Test\n\terrs := val.Struct(test)\n\tEqual(t, errs, nil)\n\tEqual(t, tag, \"mytag\")\n}\n\nfunc TestJSONValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    interface{}\n\t\texpected bool\n\t}{\n\t\t{`foo`, false},\n\t\t{`}{`, false},\n\t\t{`{]`, false},\n\t\t{`{}`, true},\n\t\t{`{\"foo\":\"bar\"}`, true},\n\t\t{`{\"foo\":\"bar\",\"bar\":{\"baz\":[\"qux\"]}}`, true},\n\t\t{`{\"foo\": 3 \"bar\": 4}`, false},\n\t\t{`{\"foo\": 3 ,\"bar\": 4`, false},\n\t\t{`{foo\": 3, \"bar\": 4}`, false},\n\t\t{`foo`, false},\n\t\t{`1`, true},\n\t\t{`true`, true},\n\t\t{`null`, true},\n\t\t{`\"null\"`, true},\n\t\t{json.RawMessage(`foo`), false},\n\t\t{json.RawMessage(`}{`), false},\n\t\t{json.RawMessage(`{]`), false},\n\t\t{json.RawMessage(`{}`), true},\n\t\t{json.RawMessage(`{\"foo\":\"bar\"}`), true},\n\t\t{json.RawMessage(`{\"foo\":\"bar\",\"bar\":{\"baz\":[\"qux\"]}}`), true},\n\t\t{json.RawMessage(`{\"foo\": 3 \"bar\": 4}`), false},\n\t\t{json.RawMessage(`{\"foo\": 3 ,\"bar\": 4`), false},\n\t\t{json.RawMessage(`{foo\": 3, \"bar\": 4}`), false},\n\t\t{json.RawMessage(`foo`), false},\n\t\t{json.RawMessage(`1`), true},\n\t\t{json.RawMessage(`true`), true},\n\t\t{json.RawMessage(`null`), true},\n\t\t{json.RawMessage(`\"null\"`), true},\n\t\t{[]byte(`foo`), false},\n\t\t{[]byte(`}{`), false},\n\t\t{[]byte(`{]`), false},\n\t\t{[]byte(`{}`), true},\n\t\t{[]byte(`{\"foo\":\"bar\"}`), true},\n\t\t{[]byte(`{\"foo\":\"bar\",\"bar\":{\"baz\":[\"qux\"]}}`), true},\n\t\t{[]byte(`{\"foo\": 3 \"bar\": 4}`), false},\n\t\t{[]byte(`{\"foo\": 3 ,\"bar\": 4`), false},\n\t\t{[]byte(`{foo\": 3, \"bar\": 4}`), false},\n\t\t{[]byte(`foo`), false},\n\t\t{[]byte(`1`), true},\n\t\t{[]byte(`true`), true},\n\t\t{[]byte(`null`), true},\n\t\t{[]byte(`\"null\"`), true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"json\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d json failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d json failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"json\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d json failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var(2, \"json\")\n\t}, \"Bad field type int\")\n}\n\nfunc TestJWTValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{\"eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiZ29waGVyIn0.O_bROM_szPq9qBql-XDHMranHwP48ODdoLICWzqBr_U\", true},\n\t\t{\"acb123-_.def456-_.ghi789-_\", true},\n\t\t{\"eyJhbGciOiJOT05FIn0.e30.\", true},\n\t\t{\"eyJhbGciOiJOT05FIn0.e30.\\n\", false},\n\t\t{\"\\x00.\\x00.\\x00\", false},\n\t\t{\"\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"jwt\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d jwt failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d jwt failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"jwt\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d jwt failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc Test_hostnameport_validator(t *testing.T) {\n\ttype Host struct {\n\t\tAddr string `validate:\"hostname_port\"`\n\t}\n\n\ttype testInput struct {\n\t\tdata     string\n\t\texpected bool\n\t}\n\ttestData := []testInput{\n\t\t{\"bad..domain.name:234\", false},\n\t\t{\"extra.dot.com.\", false},\n\t\t{\"localhost:1234\", true},\n\t\t{\"192.168.1.1:1234\", true},\n\t\t{\":1234\", true},\n\t\t{\"domain.com:1334\", true},\n\t\t{\"this.domain.com:234\", true},\n\t\t{\"domain:75000\", false},\n\t\t{\"missing.port\", false},\n\t}\n\tfor _, td := range testData {\n\t\th := Host{Addr: td.data}\n\t\tv := New()\n\t\terr := v.Struct(h)\n\t\tif td.expected != (err == nil) {\n\t\t\tt.Fatalf(\"Test failed for data: %v Error: %v\", td.data, err)\n\t\t}\n\t}\n}\n\nfunc Test_port_validator(t *testing.T) {\n\ttype Host struct {\n\t\tPort uint32 `validate:\"port\"`\n\t}\n\n\ttype testInput struct {\n\t\tdata     uint32\n\t\texpected bool\n\t}\n\ttestData := []testInput{\n\t\t{0, false},\n\t\t{1, true},\n\t\t{65535, true},\n\t\t{65536, false},\n\t\t{65538, false},\n\t}\n\tfor _, td := range testData {\n\t\th := Host{Port: td.data}\n\t\tv := New()\n\t\terr := v.Struct(h)\n\t\tif td.expected != (err == nil) {\n\t\t\tt.Fatalf(\"Test failed for data: %v Error: %v\", td.data, err)\n\t\t}\n\t}\n}\n\nfunc TestLowercaseValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{`abcdefg`, true},\n\t\t{`Abcdefg`, false},\n\t\t{\"\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"lowercase\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d lowercase failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d lowercase failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"lowercase\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d lowercase failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var(2, \"lowercase\")\n\t}, \"Bad field type int\")\n}\n\nfunc TestUppercaseValidation(t *testing.T) {\n\ttests := []struct {\n\t\tparam    string\n\t\texpected bool\n\t}{\n\t\t{`ABCDEFG`, true},\n\t\t{`aBCDEFG`, false},\n\t\t{\"\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.param, \"uppercase\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d uppercase failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d uppercase failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"uppercase\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d uppercase failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var(2, \"uppercase\")\n\t}, \"Bad field type int\")\n}\n\nfunc TestDatetimeValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"datetime=2006-01-02\"`\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t{\"2008-02-01\", `datetime=2006-01-02`, true},\n\t\t{\"2008-Feb-01\", `datetime=2006-01-02`, false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, test.tag)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d datetime failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d datetime failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"datetime\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d datetime failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var(2, \"datetime\")\n\t}, \"Bad field type int\")\n}\n\nfunc TestIsIso3166Alpha2Validation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"iso3166_1_alpha2\"`\n\t\texpected bool\n\t}{\n\t\t{\"PL\", true},\n\t\t{\"POL\", false},\n\t\t{\"AA\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, \"iso3166_1_alpha2\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_1_alpha2 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_1_alpha2 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIsIso3166Alpha2EUValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"iso3166_1_alpha2_eu\"`\n\t\texpected bool\n\t}{\n\t\t{\"SE\", true},\n\t\t{\"UK\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, \"iso3166_1_alpha2_eu\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_1_alpha2_eu failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_1_alpha2_eu failed Error: %s\", i, errs)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIsIso31662Validation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"iso3166_2\"`\n\t\texpected bool\n\t}{\n\t\t{\"US-FL\", true},\n\t\t{\"US-F\", false},\n\t\t{\"US\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, \"iso3166_2\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_2 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_2 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIsIso3166Alpha3Validation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"iso3166_1_alpha3\"`\n\t\texpected bool\n\t}{\n\t\t{\"POL\", true},\n\t\t{\"PL\", false},\n\t\t{\"AAA\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, \"iso3166_1_alpha3\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_1_alpha3 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_1_alpha3 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIsIso3166Alpha3EUValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"iso3166_1_alpha3_eu\"`\n\t\texpected bool\n\t}{\n\t\t{\"POL\", true},\n\t\t{\"SWE\", true},\n\t\t{\"UNK\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, \"iso3166_1_alpha3_eu\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_1_alpha3_eu failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_1_alpha3_eu failed Error: %s\", i, errs)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIsIso3166AlphaNumericValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    interface{}\n\t\texpected bool\n\t}{\n\t\t{248, true},\n\t\t{\"248\", true},\n\t\t{0, false},\n\t\t{1, false},\n\t\t{\"1\", false},\n\t\t{\"invalid_int\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, \"iso3166_1_alpha_numeric\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_1_alpha_numeric failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_1_alpha_numeric failed Error: %s\", i, errs)\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var([]string{\"1\"}, \"iso3166_1_alpha_numeric\")\n\t}, \"Bad field type []string\")\n}\n\nfunc TestIsIso3166AlphaNumericEUValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    interface{}\n\t\texpected bool\n\t}{\n\t\t{752, true}, // Sweden\n\t\t{\"752\", true},\n\t\t{826, false}, // UK\n\t\t{\"826\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, \"iso3166_1_alpha_numeric_eu\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_1_alpha_numeric_eu failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso3166_1_alpha_numeric_eu failed Error: %s\", i, errs)\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var([]string{\"1\"}, \"iso3166_1_alpha_numeric_eu\")\n\t}, \"Bad field type []string\")\n}\n\nfunc TestCountryCodeValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    interface{}\n\t\texpected bool\n\t}{\n\t\t{248, true},\n\t\t{0, false},\n\t\t{1, false},\n\t\t{\"POL\", true},\n\t\t{\"NO\", true},\n\t\t{\"248\", true},\n\t\t{\"1\", false},\n\t\t{\"0\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, \"country_code\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d country_code failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d country_code failed Error: %s\", i, errs)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestEUCountryCodeValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    interface{}\n\t\texpected bool\n\t}{\n\t\t{724, true},\n\t\t{0, false},\n\t\t{1, false},\n\t\t{\"POL\", true},\n\t\t{\"NO\", false},\n\t\t{\"724\", true},\n\t\t{\"1\", false},\n\t\t{\"0\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, \"eu_country_code\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d eu_country_code failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d eu_country_code failed Error: %s\", i, errs)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIsIso4217Validation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"iso4217\"`\n\t\texpected bool\n\t}{\n\t\t{\"TRY\", true},\n\t\t{\"EUR\", true},\n\t\t{\"USA\", false},\n\t\t{\"SLE\", true},\n\t\t{\"SLL\", false},\n\t\t{\"VED\", true},\n\t\t{\"XCG\", true},\n\t\t{\"ZWG\", true},\n\t\t{\"ANG\", false},\n\t\t{\"CUC\", false},\n\t\t{\"HRK\", false},\n\t\t{\"ZWL\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, \"iso4217\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso4217 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso4217 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestIsIso4217NumericValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    int `validate:\"iso4217_numeric\"`\n\t\texpected bool\n\t}{\n\t\t{8, true},\n\t\t{12, true},\n\t\t{13, false},\n\t\t{925, true},\n\t\t{694, false},\n\t\t{924, true},\n\t\t{926, true},\n\t\t{532, true},\n\t\t{191, false},\n\t\t{931, false},\n\t\t{932, false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, \"iso4217_numeric\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso4217 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d iso4217 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestTimeZoneValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"timezone\"`\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t// systems may have different time zone database, some systems time zone are case insensitive\n\t\t{\"America/New_York\", `timezone`, true},\n\t\t{\"UTC\", `timezone`, true},\n\t\t{\"\", `timezone`, false},\n\t\t{\"Local\", `timezone`, false},\n\t\t{\"Unknown\", `timezone`, false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, test.tag)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d time zone failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d time zone failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"timezone\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d time zone failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var(2, \"timezone\")\n\t}, \"Bad field type int\")\n}\n\nfunc TestDurationType(t *testing.T) {\n\ttests := []struct {\n\t\tname    string\n\t\ts       interface{} // struct\n\t\tsuccess bool\n\t}{\n\t\t{\n\t\t\tname: \"valid duration string pass\",\n\t\t\ts: struct {\n\t\t\t\tValue time.Duration `validate:\"gte=500ns\"`\n\t\t\t}{\n\t\t\t\tValue: time.Second,\n\t\t\t},\n\t\t\tsuccess: true,\n\t\t},\n\t\t{\n\t\t\tname: \"valid duration int pass\",\n\t\t\ts: struct {\n\t\t\t\tValue time.Duration `validate:\"gte=500\"`\n\t\t\t}{\n\t\t\t\tValue: time.Second,\n\t\t\t},\n\t\t\tsuccess: true,\n\t\t},\n\t}\n\n\tvalidate := New()\n\n\tfor _, tc := range tests {\n\t\ttc := tc\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tt.Parallel()\n\n\t\t\terrs := validate.Struct(tc.s)\n\t\t\tif tc.success {\n\t\t\t\tEqual(t, errs, nil)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tNotEqual(t, errs, nil)\n\t\t})\n\t}\n}\n\nfunc TestBCP47LanguageTagValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"bcp47_language_tag\"`\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t{\"en-US\", \"bcp47_language_tag\", true},\n\t\t{\"en_GB\", \"bcp47_language_tag\", true},\n\t\t{\"es\", \"bcp47_language_tag\", true},\n\t\t{\"English\", \"bcp47_language_tag\", false},\n\t\t{\"ESES\", \"bcp47_language_tag\", false},\n\t\t{\"az-Cyrl-AZ\", \"bcp47_language_tag\", true},\n\t\t{\"en-029\", \"bcp47_language_tag\", true},\n\t\t{\"xog\", \"bcp47_language_tag\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, test.tag)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d locale failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d locale failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"bcp47_language_tag\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d locale failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tPanicMatches(t, func() {\n\t\t_ = validate.Var(2, \"bcp47_language_tag\")\n\t}, \"Bad field type int\")\n}\n\nfunc TestBicIso2014FormatValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"bic_iso_9362_2014\"`\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t{\"SBICKEN1345\", \"bic_iso_9362_2014\", true},\n\t\t{\"SBICKEN1\", \"bic_iso_9362_2014\", true},\n\t\t{\"SBICKENY\", \"bic_iso_9362_2014\", true},\n\t\t{\"SBICKEN1YYP\", \"bic_iso_9362_2014\", true},\n\t\t{\"SBIC23NXXX\", \"bic_iso_9362_2014\", false},\n\t\t{\"S23CKENXXXX\", \"bic_iso_9362_2014\", false},\n\t\t{\"SBICKENXX\", \"bic_iso_9362_2014\", false},\n\t\t{\"SBICKENXX9\", \"bic_iso_9362_2014\", false},\n\t\t{\"SBICKEN13458\", \"bic_iso_9362_2014\", false},\n\t\t{\"SBICKEN\", \"bic_iso_9362_2014\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, test.tag)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d bic_iso_9362_2014 failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d bic_iso_9362_2014 failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"bic_iso_9362_2014\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d bic_iso_9362_2014 failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestBicIso2022FormatValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"bic\"`\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t{\"SBICKEN1345\", \"bic\", true},\n\t\t{\"SBICKEN1\", \"bic\", true},\n\t\t{\"SBICKENY\", \"bic\", true},\n\t\t{\"SBICKEN1YYP\", \"bic\", true},\n\t\t{\"E097AEXX\", \"bic\", true}, // valid under https://www.iso.org/standard/84108.html\n\t\t{\"SBIC23NXXX\", \"bic\", false},\n\t\t{\"S23CKENXXXX\", \"bic\", true},\n\t\t{\"SBICKENXX\", \"bic\", false},\n\t\t{\"SBICKENXX9\", \"bic\", false},\n\t\t{\"SBICKEN13458\", \"bic\", false},\n\t\t{\"SBICKEN\", \"bic\", false},\n\t\t{\"DEUTDEFF\", \"bic\", true},    // 8-char classic (Germany)\n\t\t{\"DEUTDEFF500\", \"bic\", true}, // 11-char with numeric branch\n\t\t{\"A1B2US33\", \"bic\", true},    // digits allowed in 4!c (bank code)\n\t\t{\"1234US33\", \"bic\", true},    // all digits in 4!c (2022)\n\t\t{\"ZZZ1USAA\", \"bic\", true},    // mixed alnum bank + alnum location\n\t\t{\"AB12AE00\", \"bic\", true},    // UAE 8-char\n\t\t{\"AB12AE009Z9\", \"bic\", true}, // UAE 11-char with mixed branch\n\t\t{\"WG11US335AB\", \"bic\", true}, // example-style with digits in branch\n\t\t{\"BNPAFRPP\", \"bic\", true},    // France (BNP Paribas style)\n\t\t{\"BOFAUS3NXXX\", \"bic\", true}, // US with default XXX branch\n\t\t{\"HSBCHKHHXXX\", \"bic\", true}, // Hong Kong, default branch\n\t\t{\"NEDSZAJJ\", \"bic\", true},    // South Africa 8-char\n\t\t{\"BARCGB22\", \"bic\", true},    // GB 8-char\n\t\t{\"BARCGB22XXX\", \"bic\", true}, // GB 11-char with XXX branch\n\t\t{\"0000GB00\", \"bic\", true},    // 4!c all digits + 2!c all digits (allowed)\n\t\t{\"A1B2GB00XXX\", \"bic\", true}, // valid 11-char with numeric location and XXX\n\t\t{\"TATRAEBX\", \"bic\", true},    // UAE 8-char\n\t\t{\"TATRSABX\", \"bic\", true},    // Saudi 8-char\n\t\t{\"TATREGBX\", \"bic\", true},    // Egypt 8-char\n\t\t{\"TATRBHBX\", \"bic\", true},    // Bahrain 8-char\n\n\t\t{\"DEUTDEFFF\", \"bic\", false},    // 9-char (invalid length)\n\t\t{\"DEUTDEFF5\", \"bic\", false},    // 9-char (invalid length)\n\t\t{\"DEUTDE\", \"bic\", false},       // 6-char (invalid length)\n\t\t{\"DEUTDEFF50\", \"bic\", false},   // 10-char (invalid length)\n\t\t{\"DEUTDEFF5000\", \"bic\", false}, // 12-char (invalid length)\n\t\t{\"deUTDEFF\", \"bic\", false},     // lowercase not allowed\n\t\t{\"DEUTDEfF\", \"bic\", false},     // lowercase in location\n\t\t{\"DEU@DEFF\", \"bic\", false},     // special char in bank\n\t\t{\"ABCD12FF\", \"bic\", false},     // digits in 2!a country (invalid)\n\t\t{\"ABCDDE1-\", \"bic\", false},     // hyphen in location\n\t\t{\"ABCDDE1_\", \"bic\", false},     // underscore in location\n\t\t{\"ABCDDE١٢\", \"bic\", false},     // non-ASCII digits in location\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, test.tag)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d bic failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d bic failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"bic\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d bic failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestSemverFormatValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"semver\"`\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t{\"1.2.3\", \"semver\", true},\n\t\t{\"10.20.30\", \"semver\", true},\n\t\t{\"1.1.2-prerelease+meta\", \"semver\", true},\n\t\t{\"1.1.2+meta\", \"semver\", true},\n\t\t{\"1.1.2+meta-valid\", \"semver\", true},\n\t\t{\"1.0.0-alpha\", \"semver\", true},\n\t\t{\"1.0.0-alpha.1\", \"semver\", true},\n\t\t{\"1.0.0-alpha.beta\", \"semver\", true},\n\t\t{\"1.0.0-alpha.beta.1\", \"semver\", true},\n\t\t{\"1.0.0-alpha0.valid\", \"semver\", true},\n\t\t{\"1.0.0-alpha.0valid\", \"semver\", true},\n\t\t{\"1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay\", \"semver\", true},\n\t\t{\"1.0.0-rc.1+build.1\", \"semver\", true},\n\t\t{\"1.0.0-rc.1+build.123\", \"semver\", true},\n\t\t{\"1.2.3-beta\", \"semver\", true},\n\t\t{\"1.2.3-DEV-SNAPSHOT\", \"semver\", true},\n\t\t{\"1.2.3-SNAPSHOT-123\", \"semver\", true},\n\t\t{\"2.0.0+build.1848\", \"semver\", true},\n\t\t{\"2.0.1-alpha.1227\", \"semver\", true},\n\t\t{\"1.0.0-alpha+beta\", \"semver\", true},\n\t\t{\"1.2.3----RC-SNAPSHOT.12.9.1--.12+788\", \"semver\", true},\n\t\t{\"1.2.3----R-S.12.9.1--.12+meta\", \"semver\", true},\n\t\t{\"1.2.3----RC-SNAPSHOT.12.9.1--.12\", \"semver\", true},\n\t\t{\"1.0.0+0.build.1-rc.10000aaa-kk-0.1\", \"semver\", true},\n\t\t{\"99999999999999999999999.999999999999999999.99999999999999999\", \"semver\", true},\n\t\t{\"1.0.0-0A.is.legal\", \"semver\", true},\n\t\t{\"1\", \"semver\", false},\n\t\t{\"1.2\", \"semver\", false},\n\t\t{\"1.2.3-0123\", \"semver\", false},\n\t\t{\"1.2.3-0123.0123\", \"semver\", false},\n\t\t{\"1.1.2+.123\", \"semver\", false},\n\t\t{\"+invalid\", \"semver\", false},\n\t\t{\"-invalid\", \"semver\", false},\n\t\t{\"-invalid+invalid\", \"semver\", false},\n\t\t{\"alpha\", \"semver\", false},\n\t\t{\"alpha.beta.1\", \"semver\", false},\n\t\t{\"alpha.1\", \"semver\", false},\n\t\t{\"1.0.0-alpha_beta\", \"semver\", false},\n\t\t{\"1.0.0-alpha_beta\", \"semver\", false},\n\t\t{\"1.0.0-alpha...1\", \"semver\", false},\n\t\t{\"01.1.1\", \"semver\", false},\n\t\t{\"1.01.1\", \"semver\", false},\n\t\t{\"1.1.01\", \"semver\", false},\n\t\t{\"1.2\", \"semver\", false},\n\t\t{\"1.2.Dev\", \"semver\", false},\n\t\t{\"1.2.3.Dev\", \"semver\", false},\n\t\t{\"1.2-SNAPSHOT\", \"semver\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, test.tag)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d semver failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d semver failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"semver\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d semver failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestCveFormatValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"cve\"`\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t{\"CVE-1999-0001\", \"cve\", true},\n\t\t{\"CVE-1998-0001\", \"cve\", false},\n\t\t{\"CVE-2000-0001\", \"cve\", true},\n\t\t{\"CVE-2222-0001\", \"cve\", true},\n\t\t{\"2222-0001\", \"cve\", false},\n\t\t{\"-2222-0001\", \"cve\", false},\n\t\t{\"CVE22220001\", \"cve\", false},\n\t\t{\"CVE-2222-000001\", \"cve\", false},\n\t\t{\"CVE-2222-100001\", \"cve\", true},\n\t\t{\"CVE-2222-99999999999\", \"cve\", true},\n\t\t{\"CVE-3000-0001\", \"cve\", false},\n\t\t{\"CVE-1999-0000\", \"cve\", false},\n\t\t{\"CVE-2099-0000\", \"cve\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, test.tag)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d cve failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d cve failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"cve\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d cve failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestRFC1035LabelFormatValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"dns_rfc1035_label\"`\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t{\"abc\", \"dns_rfc1035_label\", true},\n\t\t{\"abc-\", \"dns_rfc1035_label\", false},\n\t\t{\"abc-123\", \"dns_rfc1035_label\", true},\n\t\t{\"ABC\", \"dns_rfc1035_label\", false},\n\t\t{\"ABC-123\", \"dns_rfc1035_label\", false},\n\t\t{\"abc-abc\", \"dns_rfc1035_label\", true},\n\t\t{\"ABC-ABC\", \"dns_rfc1035_label\", false},\n\t\t{\"123-abc\", \"dns_rfc1035_label\", false},\n\t\t{\"\", \"dns_rfc1035_label\", false},\n\t\t{\"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk\", \"dns_rfc1035_label\", true},\n\t\t{\"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl\", \"dns_rfc1035_label\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, test.tag)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d dns_rfc1035_label failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d dns_rfc1035_label failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"dns_rfc1035_label\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d dns_rfc1035_label failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestPostCodeByIso3166Alpha2(t *testing.T) {\n\ttests := map[string][]struct {\n\t\tvalue    string\n\t\texpected bool\n\t}{\n\t\t\"VN\": {\n\t\t\t{\"ABC\", false},\n\t\t\t{\"700000\", true},\n\t\t\t{\"A1\", false},\n\t\t},\n\t\t\"GB\": {\n\t\t\t{\"EC1A 1BB\", true},\n\t\t\t{\"CF10 1B1H\", false},\n\t\t},\n\t\t\"VI\": {\n\t\t\t{\"00803\", true},\n\t\t\t{\"1234567\", false},\n\t\t},\n\t\t\"LC\": {\n\t\t\t// not support regexp for post code\n\t\t\t{\"123456\", false},\n\t\t},\n\t\t\"XX\": {\n\t\t\t// not support country\n\t\t\t{\"123456\", false},\n\t\t},\n\t}\n\n\tvalidate := New()\n\n\tfor cc, ccTests := range tests {\n\t\tfor i, test := range ccTests {\n\t\t\terrs := validate.Var(test.value, fmt.Sprintf(\"postcode_iso3166_alpha2=%s\", cc))\n\n\t\t\tif test.expected {\n\t\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\t\tt.Fatalf(\"Index: %d postcode_iso3166_alpha2=%s failed Error: %s\", i, cc, errs)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif IsEqual(errs, nil) {\n\t\t\t\t\tt.Fatalf(\"Index: %d postcode_iso3166_alpha2=%s failed Error: %s\", i, cc, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestPostCodeByIso3166Alpha2Field(t *testing.T) {\n\ttests := []struct {\n\t\tValue       string `validate:\"postcode_iso3166_alpha2_field=CountryCode\"`\n\t\tCountryCode interface{}\n\t\texpected    bool\n\t}{\n\t\t{\"ABC\", \"VN\", false},\n\t\t{\"700000\", \"VN\", true},\n\t\t{\"A1\", \"VN\", false},\n\t\t{\"EC1A 1BB\", \"GB\", true},\n\t\t{\"CF10 1B1H\", \"GB\", false},\n\t\t{\"00803\", \"VI\", true},\n\t\t{\"1234567\", \"VI\", false},\n\t\t{\"123456\", \"LC\", false}, // not support regexp for post code\n\t\t{\"123456\", \"XX\", false}, // not support country\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Struct(test)\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d postcode_iso3166_alpha2_field=CountryCode failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d postcode_iso3166_alpha2_field=CountryCode failed Error: %s\", i, errs)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestPostCodeByIso3166Alpha2Field_WrongField(t *testing.T) {\n\ttype test struct {\n\t\tValue        string `validate:\"postcode_iso3166_alpha2_field=CountryCode\"`\n\t\tCountryCode1 interface{}\n\t\texpected     bool\n\t}\n\n\terrs := New().Struct(test{\"ABC\", \"VN\", false})\n\tNotEqual(t, nil, errs)\n}\n\nfunc TestPostCodeByIso3166Alpha2Field_MissingParam(t *testing.T) {\n\ttype test struct {\n\t\tValue        string `validate:\"postcode_iso3166_alpha2_field=\"`\n\t\tCountryCode1 interface{}\n\t\texpected     bool\n\t}\n\n\terrs := New().Struct(test{\"ABC\", \"VN\", false})\n\tNotEqual(t, nil, errs)\n}\n\nfunc TestPostCodeByIso3166Alpha2Field_InvalidKind(t *testing.T) {\n\ttype test struct {\n\t\tValue       string `validate:\"postcode_iso3166_alpha2_field=CountryCode\"`\n\t\tCountryCode interface{}\n\t\texpected    bool\n\t}\n\tdefer func() { _ = recover() }()\n\n\t_ = New().Struct(test{\"ABC\", 123, false})\n\tt.Errorf(\"Didn't panic as expected\")\n}\n\nfunc TestValidate_ValidateMapCtx(t *testing.T) {\n\ttype args struct {\n\t\tdata  map[string]interface{}\n\t\trules map[string]interface{}\n\t}\n\ttests := []struct {\n\t\tname string\n\t\targs args\n\t\twant int\n\t}{\n\t\t{\n\t\t\tname: \"test nested map in slice\",\n\t\t\targs: args{\n\t\t\t\tdata: map[string]interface{}{\n\t\t\t\t\t\"Test_A\": map[string]interface{}{\n\t\t\t\t\t\t\"Test_B\": \"Test_B\",\n\t\t\t\t\t\t\"Test_C\": []map[string]interface{}{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"Test_D\": \"Test_D\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Test_E\": map[string]interface{}{\n\t\t\t\t\t\t\t\"Test_F\": \"Test_F\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trules: map[string]interface{}{\n\t\t\t\t\t\"Test_A\": map[string]interface{}{\n\t\t\t\t\t\t\"Test_B\": \"min=2\",\n\t\t\t\t\t\t\"Test_C\": map[string]interface{}{\n\t\t\t\t\t\t\t\"Test_D\": \"min=2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Test_E\": map[string]interface{}{\n\t\t\t\t\t\t\t\"Test_F\": \"min=2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: 0,\n\t\t},\n\n\t\t{\n\t\t\tname: \"test nested map error\",\n\t\t\targs: args{\n\t\t\t\tdata: map[string]interface{}{\n\t\t\t\t\t\"Test_A\": map[string]interface{}{\n\t\t\t\t\t\t\"Test_B\": \"Test_B\",\n\t\t\t\t\t\t\"Test_C\": []interface{}{\"Test_D\"},\n\t\t\t\t\t\t\"Test_E\": map[string]interface{}{\n\t\t\t\t\t\t\t\"Test_F\": \"Test_F\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Test_G\": \"Test_G\",\n\t\t\t\t\t\t\"Test_I\": []map[string]interface{}{\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"Test_J\": \"Test_J\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trules: map[string]interface{}{\n\t\t\t\t\t\"Test_A\": map[string]interface{}{\n\t\t\t\t\t\t\"Test_B\": \"min=2\",\n\t\t\t\t\t\t\"Test_C\": map[string]interface{}{\n\t\t\t\t\t\t\t\"Test_D\": \"min=2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Test_E\": map[string]interface{}{\n\t\t\t\t\t\t\t\"Test_F\": \"min=100\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Test_G\": map[string]interface{}{\n\t\t\t\t\t\t\t\"Test_H\": \"min=2\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Test_I\": map[string]interface{}{\n\t\t\t\t\t\t\t\"Test_J\": \"min=100\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: 1,\n\t\t},\n\t}\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tvalidate := New()\n\t\t\tif got := validate.ValidateMapCtx(context.Background(), tt.args.data, tt.args.rules); len(got) != tt.want {\n\t\t\t\tt.Errorf(\"ValidateMapCtx() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestValidate_ValidateMapCtxWithKeys(t *testing.T) {\n\ttype args struct {\n\t\tdata   map[string]interface{}\n\t\trules  map[string]interface{}\n\t\terrors map[string]interface{}\n\t}\n\ttests := []struct {\n\t\tname string\n\t\targs args\n\t\twant int\n\t}{\n\t\t{\n\t\t\tname: \"test invalid email\",\n\t\t\targs: args{\n\t\t\t\tdata: map[string]interface{}{\n\t\t\t\t\t\"email\": \"emailaddress\",\n\t\t\t\t},\n\t\t\t\trules: map[string]interface{}{\n\t\t\t\t\t\"email\": \"required,email\",\n\t\t\t\t},\n\t\t\t\terrors: map[string]interface{}{\n\t\t\t\t\t\"email\": \"Key: 'email' Error:Field validation for 'email' failed on the 'email' tag\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: 1,\n\t\t},\n\t\t{\n\t\t\tname: \"test multiple errors with capitalized keys\",\n\t\t\targs: args{\n\t\t\t\tdata: map[string]interface{}{\n\t\t\t\t\t\"Email\": \"emailaddress\",\n\t\t\t\t\t\"Age\":   15,\n\t\t\t\t},\n\t\t\t\trules: map[string]interface{}{\n\t\t\t\t\t\"Email\": \"required,email\",\n\t\t\t\t\t\"Age\":   \"number,gt=16\",\n\t\t\t\t},\n\t\t\t\terrors: map[string]interface{}{\n\t\t\t\t\t\"Email\": \"Key: 'Email' Error:Field validation for 'Email' failed on the 'email' tag\",\n\t\t\t\t\t\"Age\":   \"Key: 'Age' Error:Field validation for 'Age' failed on the 'gt' tag\",\n\t\t\t\t},\n\t\t\t},\n\t\t\twant: 2,\n\t\t},\n\t\t{\n\t\t\tname: \"test valid map data\",\n\t\t\targs: args{\n\t\t\t\tdata: map[string]interface{}{\n\t\t\t\t\t\"email\": \"email@example.com\",\n\t\t\t\t\t\"age\":   17,\n\t\t\t\t},\n\t\t\t\trules: map[string]interface{}{\n\t\t\t\t\t\"email\": \"required,email\",\n\t\t\t\t\t\"age\":   \"number,gt=16\",\n\t\t\t\t},\n\t\t\t\terrors: map[string]interface{}{},\n\t\t\t},\n\t\t\twant: 0,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tvalidate := New()\n\t\t\terrs := validate.ValidateMapCtx(context.Background(), tt.args.data, tt.args.rules)\n\t\t\tNotEqual(t, errs, nil)\n\t\t\tEqual(t, len(errs), tt.want)\n\t\t\tfor key, err := range errs {\n\t\t\t\tEqual(t, err.(ValidationErrors)[0].Error(), tt.args.errors[key])\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TestValidateMapWithCrossFieldValidators tests that cross-field validators\n// like required_if, required_unless, etc. don't panic when used with ValidateMap.\n// This is a regression test for issue #893.\n//\n// Note: With ValidateMap, cross-field lookups return \"not found\" since there's no\n// struct context. Validators handle this by using their defaultNotFoundValue:\n// - required_if: condition not met (returns false) → field not required\n// - required_unless: condition not met (returns false) → field required\n// - excluded_if: condition not met (returns false) → field not excluded\n// - excluded_unless: condition not met (returns false) → field must be excluded\nfunc TestValidateMapWithCrossFieldValidators(t *testing.T) {\n\tvalidate := New()\n\n\t// Test required_if - should not panic\n\t// Cross-field lookup returns not found → condition not met → field not required\n\tdata := map[string]interface{}{\n\t\t\"name\": \"hello\",\n\t\t\"id\":   123,\n\t}\n\trules := map[string]interface{}{\n\t\t\"name\": \"required_if=id 345\",\n\t\t\"id\":   \"required\",\n\t}\n\terrs := validate.ValidateMap(data, rules)\n\tEqual(t, len(errs), 0)\n\n\t// Test required_unless - should not panic\n\t// Cross-field lookup returns not found → condition not met → field required\n\t// Since name has a value, validation passes\n\trules2 := map[string]interface{}{\n\t\t\"name\": \"required_unless=id 345\",\n\t\t\"id\":   \"required\",\n\t}\n\terrs = validate.ValidateMap(data, rules2)\n\tEqual(t, len(errs), 0)\n\n\t// Test excluded_if - should not panic\n\t// Cross-field lookup returns not found → condition not met → field not excluded\n\trules3 := map[string]interface{}{\n\t\t\"name\": \"excluded_if=id 123\",\n\t\t\"id\":   \"required\",\n\t}\n\terrs = validate.ValidateMap(data, rules3)\n\tEqual(t, len(errs), 0)\n\n\t// Test excluded_unless - should not panic\n\t// Cross-field lookup returns not found → condition not met → field must be excluded\n\t// Since name has a value, validation FAILS (this is expected behavior)\n\trules4 := map[string]interface{}{\n\t\t\"name\": \"excluded_unless=id 123\",\n\t\t\"id\":   \"required\",\n\t}\n\terrs = validate.ValidateMap(data, rules4)\n\tEqual(t, len(errs), 1) // Fails because name has value but condition can't be verified\n\n\t// Test excluded_unless with empty value - should pass since field is excluded\n\tdataEmpty := map[string]interface{}{\n\t\t\"name\": \"\",\n\t\t\"id\":   123,\n\t}\n\terrs = validate.ValidateMap(dataEmpty, rules4)\n\tEqual(t, len(errs), 0)\n\n\t// Test with empty name - required_if condition not met, so empty is ok\n\tdata2 := map[string]interface{}{\n\t\t\"name\": \"\",\n\t\t\"id\":   123,\n\t}\n\terrs = validate.ValidateMap(data2, rules)\n\tEqual(t, len(errs), 0)\n}\n\nfunc TestValidate_VarWithKey(t *testing.T) {\n\tvalidate := New()\n\terrs := validate.VarWithKey(\"email\", \"invalidemail\", \"required,email\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"email\", \"email\", \"email\", \"email\", \"email\")\n\n\terrs = validate.VarWithKey(\"email\", \"email@example.com\", \"required,email\")\n\tEqual(t, errs, nil)\n}\n\nfunc TestValidate_VarWithKeyCtx(t *testing.T) {\n\tvalidate := New()\n\terrs := validate.VarWithKeyCtx(context.Background(), \"age\", 15, \"required,gt=16\")\n\tNotEqual(t, errs, nil)\n\tAssertError(t, errs, \"age\", \"age\", \"age\", \"age\", \"gt\")\n\n\terrs = validate.VarWithKey(\"age\", 17, \"required,gt=16\")\n\tEqual(t, errs, nil)\n}\n\nfunc TestMongoDBObjectIDFormatValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"mongodb\"`\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t{\"507f191e810c19729de860ea\", \"mongodb\", true},\n\t\t{\"507f191e810c19729de860eG\", \"mongodb\", false},\n\t\t{\"M07f191e810c19729de860eG\", \"mongodb\", false},\n\t\t{\"07f191e810c19729de860ea\", \"mongodb\", false},\n\t\t{\"507f191e810c19729de860e\", \"mongodb\", false},\n\t\t{\"507f191e810c19729de860ea4\", \"mongodb\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, test.tag)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d mongodb failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d mongodb failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"mongodb\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d mongodb failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestMongoDBConnectionStringFormatValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"mongodb_connection_string\"`\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t{\"mongodb://username:password@server.example.com:20017/database?replicaSet=test&connectTimeoutMS=300000&ssl=true\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb+srv://username:password@server.example.com:20017/database?replicaSet=test&connectTimeoutMS=300000&ssl=true\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb+srv://username:password@server.example.com:20017,server.example.com,server.example.com:20017/database?replicaSet=test&connectTimeoutMS=300000&ssl=true\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb+srv://username:password@server.example.com:20017,server.example.com,server.example.com:20017?replicaSet=test&connectTimeoutMS=300000&ssl=true\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb://username:password@server.example.com:20017,server.example.com,server.example.com:20017/database?replicaSet=test&connectTimeoutMS=300000&ssl=true\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb://localhost\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb://localhost:27017\", \"mongodb_connection_string\", true},\n\t\t{\"localhost\", \"mongodb_connection_string\", false},\n\t\t{\"mongodb://\", \"mongodb_connection_string\", false},\n\t\t{\"mongodb+srv://\", \"mongodb_connection_string\", false},\n\t\t{\"mongodbsrv://localhost\", \"mongodb_connection_string\", false},\n\t\t{\"mongodb+srv://localhost\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb+srv://localhost:27017\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb+srv://localhost?replicaSet=test\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb+srv://localhost:27017?replicaSet=test\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb+srv://localhost:27017?\", \"mongodb_connection_string\", false},\n\t\t{\"mongodb+srv://localhost:27017?replicaSet\", \"mongodb_connection_string\", false},\n\t\t{\"mongodb+srv://localhost/database\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb+srv://localhost:27017/database\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb+srv://username@localhost\", \"mongodb_connection_string\", false},\n\t\t{\"mongodb+srv://username:password@localhost\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb+srv://username:password@localhost:27017\", \"mongodb_connection_string\", true},\n\t\t{\"mongodb+srv://username:password@localhost:27017,192.0.0.7,192.0.0.9:27018,server.example.com\", \"mongodb_connection_string\", true},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, test.tag)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d mongodb_connection_string failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d mongodb_connection_string failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"mongodb_connection_string\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d mongodb_connection_string failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestSpiceDBValueFormatValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t// Must be an asterisk OR a string containing alphanumeric characters and a restricted set a special symbols: _ | / - = +\n\t\t{\"*\", \"spicedb=id\", true},\n\t\t{`azAZ09_|/-=+`, \"spicedb=id\", true},\n\t\t{`a*`, \"spicedb=id\", false},\n\t\t{`/`, \"spicedb=id\", true},\n\t\t{\"*\", \"spicedb\", true},\n\n\t\t// Must begin and end with a lowercase letter, may also contain numbers and underscores between, min length 3, max length 64\n\t\t{\"a\", \"spicedb=permission\", false},\n\t\t{\"1\", \"spicedb=permission\", false},\n\t\t{\"a1\", \"spicedb=permission\", false},\n\t\t{\"a_b\", \"spicedb=permission\", true},\n\t\t{\"A_b\", \"spicedb=permission\", false},\n\t\t{\"a_B\", \"spicedb=permission\", false},\n\t\t{\"abcdefghijklmnopqrstuvwxyz_0123456789_abcdefghijklmnopqrstuvwxyz\", \"spicedb=permission\", true},\n\t\t{\"abcdefghijklmnopqrstuvwxyz_01234_56789_abcdefghijklmnopqrstuvwxyz\", \"spicedb=permission\", false},\n\n\t\t// Object types follow the same rules as permissions for the type name plus an optional prefix up to 63 characters with a /\n\t\t{\"a\", \"spicedb=type\", false},\n\t\t{\"1\", \"spicedb=type\", false},\n\t\t{\"a1\", \"spicedb=type\", false},\n\t\t{\"a_b\", \"spicedb=type\", true},\n\t\t{\"A_b\", \"spicedb=type\", false},\n\t\t{\"a_B\", \"spicedb=type\", false},\n\t\t{\"abcdefghijklmnopqrstuvwxyz_0123456789_abcdefghijklmnopqrstuvwxyz\", \"spicedb=type\", true},\n\t\t{\"abcdefghijklmnopqrstuvwxyz_01234_56789_abcdefghijklmnopqrstuvwxyz\", \"spicedb=type\", false},\n\n\t\t{`a_b/a`, \"spicedb=type\", false},\n\t\t{`a_b/1`, \"spicedb=type\", false},\n\t\t{`a_b/a1`, \"spicedb=type\", false},\n\t\t{`a_b/a_b`, \"spicedb=type\", true},\n\t\t{`a_b/A_b`, \"spicedb=type\", false},\n\t\t{`a_b/a_B`, \"spicedb=type\", false},\n\t\t{`a_b/abcdefghijklmnopqrstuvwxyz_0123456789_abcdefghijklmnopqrstuvwxyz`, \"spicedb=type\", true},\n\t\t{`a_b/abcdefghijklmnopqrstuvwxyz_01234_56789_abcdefghijklmnopqrstuvwxyz`, \"spicedb=type\", false},\n\n\t\t{`a/a_b`, \"spicedb=type\", false},\n\t\t{`1/a_b`, \"spicedb=type\", false},\n\t\t{`a1/a_b`, \"spicedb=type\", false},\n\t\t{`a_b/a_b`, \"spicedb=type\", true},\n\t\t{`A_b/a_b`, \"spicedb=type\", false},\n\t\t{`a_B/a_b`, \"spicedb=type\", false},\n\t\t{`abcdefghijklmnopqrstuvwxyz_0123456789_abcdefghijklmnopqrstuvwxy/a_b`, \"spicedb=type\", true},\n\t\t{`abcdefghijklmnopqrstuvwxyz_0123456789_abcdefghijklmnopqrstuvwxyz/a_b`, \"spicedb=type\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, test.tag)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d spicedb failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d spicedb - expected error but there was none.\", i)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"spicedb\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d spicedb failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestCreditCardFormatValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"credit_card\"`\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t{\"586824160825533338\", \"credit_card\", true},\n\t\t{\"586824160825533328\", \"credit_card\", false},\n\t\t{\"4624748233249780\", \"credit_card\", true},\n\t\t{\"4624748233349780\", \"credit_card\", false},\n\t\t{\"378282246310005\", \"credit_card\", true},\n\t\t{\"378282146310005\", \"credit_card\", false},\n\t\t{\"4624 7482 3324 9780\", \"credit_card\", true},\n\t\t{\"4624 7482 3324  9780\", \"credit_card\", false},\n\t\t{\"4624 7482 3324 978A\", \"credit_card\", false},\n\t\t{\"4624 7482 332\", \"credit_card\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, test.tag)\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d credit_card failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d credit_card failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"credit_card\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d credit_card failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestLuhnChecksumValidation(t *testing.T) {\n\ttestsUint := []struct {\n\t\tvalue    interface{} `validate:\"luhn_checksum\"` // the type is interface{} because the luhn_checksum works on both strings and numbers\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t{uint64(586824160825533338), \"luhn_checksum\", true}, // credit card numbers are just special cases of numbers with luhn checksum\n\t\t{int64(586824160825533338), \"luhn_checksum\", true},\n\t\t{\"586824160825533338\", \"luhn_checksum\", true},\n\t\t{uint64(586824160825533328), \"luhn_checksum\", false},\n\t\t{int64(586824160825533328), \"luhn_checksum\", false},\n\t\t{\"586824160825533328\", \"luhn_checksum\", false},\n\t\t{int64(10000000116), \"luhn_checksum\", true}, // but there may be shorter numbers (11 digits)\n\t\t{\"10000000116\", \"luhn_checksum\", true},\n\t\t{int64(10000000117), \"luhn_checksum\", false},\n\t\t{\"10000000117\", \"luhn_checksum\", false},\n\t\t{uint64(12345678123456789011), \"luhn_checksum\", true}, // or longer numbers (19 digits)\n\t\t{\"12345678123456789011\", \"luhn_checksum\", true},\n\t\t{1, \"luhn_checksum\", false}, // single digits (checksum only) are not allowed\n\t\t{\"1\", \"luhn_checksum\", false},\n\t\t{-10, \"luhn_checksum\", false}, // negative ints are not allowed\n\t\t{\"abcdefghijklmnop\", \"luhn_checksum\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range testsUint {\n\t\terrs := validate.Var(test.value, test.tag)\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d luhn_checksum failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d luhn_checksum failed Error: %s\", i, errs)\n\t\t\t} else {\n\t\t\t\tval := getError(errs, \"\", \"\")\n\t\t\t\tif val.Tag() != \"luhn_checksum\" {\n\t\t\t\t\tt.Fatalf(\"Index: %d luhn_checksum failed Error: %s\", i, errs)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestMultiOrOperatorGroup(t *testing.T) {\n\ttests := []struct {\n\t\tValue    int `validate:\"eq=1|gte=5,eq=1|lt=7\"`\n\t\texpected bool\n\t}{\n\t\t{1, true}, {2, false}, {5, true}, {6, true}, {8, false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Struct(test)\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d multi_group_of_OR_operators failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d multi_group_of_OR_operators should have errs\", i)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestCronExpressionValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"cron\"`\n\t\ttag      string\n\t\texpected bool\n\t}{\n\t\t{\"0 0 12 * * ?\", \"cron\", true},\n\t\t{\"0 15 10 ? * *\", \"cron\", true},\n\t\t{\"0 15 10 * * ?\", \"cron\", true},\n\t\t{\"0 15 10 * * ? 2005\", \"cron\", true},\n\t\t{\"0 15 10 ? * 6L\", \"cron\", true},\n\t\t{\"0 15 10 ? * 6L 2002-2005\", \"cron\", true},\n\t\t{\"*/20 * * * *\", \"cron\", true},\n\t\t{\"0 15 10 ? * MON-FRI\", \"cron\", true},\n\t\t{\"0 15 10 ? * 6#3\", \"cron\", true},\n\t\t{\"0 */15 * * *\", \"cron\", true},\n\t\t{\"wrong\", \"cron\", false},\n\t}\n\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, test.tag)\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(`Index: %d cron \"%s\" failed Error: %s`, i, test.value, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(`Index: %d cron \"%s\" should have errs`, i, test.value)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestNestedStructValidation(t *testing.T) {\n\tvalidator := New(WithRequiredStructEnabled())\n\n\tt.Run(\"required\", func(t *testing.T) {\n\t\ttype (\n\t\t\tvalue struct {\n\t\t\t\tField string\n\t\t\t}\n\t\t\ttopLevel struct {\n\t\t\t\tNested value `validate:\"required\"`\n\t\t\t}\n\t\t)\n\n\t\tvar validationErrs ValidationErrors\n\t\tif errs := validator.Struct(topLevel{}); errs != nil {\n\t\t\tvalidationErrs = errs.(ValidationErrors)\n\t\t}\n\n\t\tEqual(t, 1, len(validationErrs))\n\t\tAssertError(t, validationErrs, \"topLevel.Nested\", \"topLevel.Nested\", \"Nested\", \"Nested\", \"required\")\n\n\t\tEqual(t, validator.Struct(topLevel{value{\"potato\"}}), nil)\n\t})\n\n\tt.Run(\"omitempty\", func(t *testing.T) {\n\t\ttype (\n\t\t\tvalue struct {\n\t\t\t\tField string\n\t\t\t}\n\t\t\ttopLevel struct {\n\t\t\t\tNested value `validate:\"omitempty,required\"`\n\t\t\t}\n\t\t)\n\n\t\terrs := validator.Struct(topLevel{})\n\t\tEqual(t, errs, nil)\n\t})\n\n\tt.Run(\"excluded_if\", func(t *testing.T) {\n\t\ttype (\n\t\t\tvalue struct {\n\t\t\t\tField string\n\t\t\t}\n\t\t\ttopLevel struct {\n\t\t\t\tField  string\n\t\t\t\tNested value `validate:\"excluded_if=Field potato\"`\n\t\t\t}\n\t\t)\n\n\t\terrs := validator.Struct(topLevel{Field: \"test\", Nested: value{\"potato\"}})\n\t\tEqual(t, errs, nil)\n\n\t\terrs = validator.Struct(topLevel{Field: \"potato\"})\n\t\tEqual(t, errs, nil)\n\n\t\terrs = validator.Struct(topLevel{Field: \"potato\", Nested: value{\"potato\"}})\n\t\tAssertError(t, errs, \"topLevel.Nested\", \"topLevel.Nested\", \"Nested\", \"Nested\", \"excluded_if\")\n\t})\n\n\tt.Run(\"excluded_unless\", func(t *testing.T) {\n\t\ttype (\n\t\t\tvalue struct {\n\t\t\t\tField string\n\t\t\t}\n\t\t\ttopLevel struct {\n\t\t\t\tField  string\n\t\t\t\tNested value `validate:\"excluded_unless=Field potato\"`\n\t\t\t}\n\t\t)\n\n\t\terrs := validator.Struct(topLevel{Field: \"test\"})\n\t\tEqual(t, errs, nil)\n\n\t\terrs = validator.Struct(topLevel{Field: \"potato\", Nested: value{\"potato\"}})\n\t\tEqual(t, errs, nil)\n\n\t\terrs = validator.Struct(topLevel{Field: \"test\", Nested: value{\"potato\"}})\n\t\tAssertError(t, errs, \"topLevel.Nested\", \"topLevel.Nested\", \"Nested\", \"Nested\", \"excluded_unless\")\n\t})\n\n\tt.Run(\"nonComparableField\", func(t *testing.T) {\n\t\ttype (\n\t\t\tvalue struct {\n\t\t\t\tField []string\n\t\t\t}\n\t\t\ttopLevel struct {\n\t\t\t\tNested value `validate:\"required\"`\n\t\t\t}\n\t\t)\n\n\t\terrs := validator.Struct(topLevel{value{[]string{}}})\n\t\tEqual(t, errs, nil)\n\t})\n\n\ttype (\n\t\tveggyBasket struct {\n\t\t\tRoot   string\n\t\t\tSquash string `validate:\"required\"`\n\t\t}\n\t\ttestErr struct {\n\t\t\tpath string\n\t\t\ttag  string\n\t\t}\n\t\ttest struct {\n\t\t\tname  string\n\t\t\terr   testErr\n\t\t\tvalue veggyBasket\n\t\t}\n\t)\n\n\tif err := validator.RegisterValidation(\"veggy\", func(f FieldLevel) bool {\n\t\tv, ok := f.Field().Interface().(veggyBasket)\n\t\tif !ok || v.Root != \"potato\" {\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t}); err != nil {\n\t\tt.Fatal(fmt.Errorf(\"failed to register potato tag: %w\", err))\n\t}\n\n\ttests := []test{\n\t\t{\n\t\t\tname:  \"valid\",\n\t\t\tvalue: veggyBasket{\"potato\", \"zucchini\"},\n\t\t}, {\n\t\t\tname:  \"failedCustomTag\",\n\t\t\tvalue: veggyBasket{\"zucchini\", \"potato\"},\n\t\t\terr:   testErr{\"topLevel.VeggyBasket\", \"veggy\"},\n\t\t}, {\n\t\t\tname:  \"failedInnerField\",\n\t\t\tvalue: veggyBasket{\"potato\", \"\"},\n\t\t\terr:   testErr{\"topLevel.VeggyBasket.Squash\", \"required\"},\n\t\t}, {\n\t\t\tname:  \"customTagFailurePriorityCheck\",\n\t\t\tvalue: veggyBasket{\"zucchini\", \"\"},\n\t\t\terr:   testErr{\"topLevel.VeggyBasket\", \"veggy\"},\n\t\t},\n\t}\n\n\tevaluateTest := func(tt test, errs error) {\n\t\tif tt.err != (testErr{}) && errs != nil {\n\t\t\tEqual(t, len(errs.(ValidationErrors)), 1)\n\n\t\t\tsegments := strings.Split(tt.err.path, \".\")\n\t\t\tfieldName := segments[len(segments)-1]\n\t\t\tAssertError(t, errs, tt.err.path, tt.err.path, fieldName, fieldName, tt.err.tag)\n\t\t}\n\n\t\tshouldFail := tt.err != (testErr{})\n\t\thasFailed := errs != nil\n\t\tif shouldFail != hasFailed {\n\t\t\tt.Fatalf(\"expected failure %v, got: %v with errs: %v\", shouldFail, hasFailed, errs)\n\t\t}\n\t}\n\n\tfor _, tt := range tests {\n\t\ttype topLevel struct {\n\t\t\tVeggyBasket veggyBasket `validate:\"veggy\"`\n\t\t}\n\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tevaluateTest(tt, validator.Struct(topLevel{tt.value}))\n\t\t})\n\t}\n\n\t// Also test on struct pointers\n\tfor _, tt := range tests {\n\t\ttype topLevel struct {\n\t\t\tVeggyBasket *veggyBasket `validate:\"veggy\"`\n\t\t}\n\n\t\tt.Run(tt.name+\"Ptr\", func(t *testing.T) {\n\t\t\tevaluateTest(tt, validator.Struct(topLevel{&tt.value}))\n\t\t})\n\t}\n}\n\nfunc TestTimeRequired(t *testing.T) {\n\tvalidate := New()\n\tvalidate.RegisterTagNameFunc(func(fld reflect.StructField) string {\n\t\tname := strings.SplitN(fld.Tag.Get(\"json\"), \",\", 2)[0]\n\n\t\tif name == \"-\" {\n\t\t\treturn \"\"\n\t\t}\n\n\t\treturn name\n\t})\n\n\ttype TestTime struct {\n\t\tTime time.Time `validate:\"required\"`\n\t}\n\n\tvar testTime TestTime\n\n\terr := validate.Struct(&testTime)\n\tNotEqual(t, err, nil)\n\tAssertError(t, err.(ValidationErrors), \"TestTime.Time\", \"TestTime.Time\", \"Time\", \"Time\", \"required\")\n}\n\nfunc TestOmitNilAndRequired(t *testing.T) {\n\ttype (\n\t\tOmitEmpty struct {\n\t\t\tStr    string  `validate:\"omitempty,required,min=10\"`\n\t\t\tStrPtr *string `validate:\"omitempty,required,min=10\"`\n\t\t\tInner  *OmitEmpty\n\t\t}\n\t\tOmitNil struct {\n\t\t\tStr    string  `validate:\"omitnil,required,min=10\"`\n\t\t\tStrPtr *string `validate:\"omitnil,required,min=10\"`\n\t\t\tInner  *OmitNil\n\t\t}\n\t)\n\n\tvar (\n\t\tvalidate = New(WithRequiredStructEnabled())\n\t\tvalid    = \"this is the long string to pass the validation rule\"\n\t)\n\n\tt.Run(\"compare using valid data\", func(t *testing.T) {\n\t\terr1 := validate.Struct(OmitEmpty{Str: valid, StrPtr: &valid, Inner: &OmitEmpty{Str: valid, StrPtr: &valid}})\n\t\terr2 := validate.Struct(OmitNil{Str: valid, StrPtr: &valid, Inner: &OmitNil{Str: valid, StrPtr: &valid}})\n\n\t\tEqual(t, err1, nil)\n\t\tEqual(t, err2, nil)\n\t})\n\n\tt.Run(\"compare fully empty omitempty and omitnil\", func(t *testing.T) {\n\t\terr1 := validate.Struct(OmitEmpty{})\n\t\terr2 := validate.Struct(OmitNil{})\n\n\t\tEqual(t, err1, nil)\n\t\tAssertError(t, err2, \"OmitNil.Str\", \"OmitNil.Str\", \"Str\", \"Str\", \"required\")\n\t})\n\n\tt.Run(\"validate in deep\", func(t *testing.T) {\n\t\terr1 := validate.Struct(OmitEmpty{Str: valid, Inner: &OmitEmpty{}})\n\t\terr2 := validate.Struct(OmitNil{Str: valid, Inner: &OmitNil{}})\n\n\t\tEqual(t, err1, nil)\n\t\tAssertError(t, err2, \"OmitNil.Inner.Str\", \"OmitNil.Inner.Str\", \"Str\", \"Str\", \"required\")\n\t})\n}\n\nfunc TestOmitZero(t *testing.T) {\n\ttype (\n\t\tOmitEmpty struct {\n\t\t\tStr    string  `validate:\"omitempty,min=10\"`\n\t\t\tStrPtr *string `validate:\"omitempty,min=10\"`\n\t\t}\n\t\tOmitZero struct {\n\t\t\tStr    string  `validate:\"omitzero,min=10\"`\n\t\t\tStrPtr *string `validate:\"omitzero,min=10\"`\n\t\t}\n\t)\n\n\tvar (\n\t\tvalidate = New()\n\t\tvalid    = \"this is the long string to pass the validation rule\"\n\t\tempty    = \"\"\n\t)\n\n\tt.Run(\"compare using valid data\", func(t *testing.T) {\n\t\terr1 := validate.Struct(OmitEmpty{Str: valid, StrPtr: &valid})\n\t\terr2 := validate.Struct(OmitZero{Str: valid, StrPtr: &valid})\n\n\t\tEqual(t, err1, nil)\n\t\tEqual(t, err2, nil)\n\t})\n\n\tt.Run(\"compare fully empty omitempty and omitzero\", func(t *testing.T) {\n\t\terr1 := validate.Struct(OmitEmpty{})\n\t\terr2 := validate.Struct(OmitZero{})\n\n\t\tEqual(t, err1, nil)\n\t\tEqual(t, err2, nil)\n\t})\n\n\tt.Run(\"compare with zero value\", func(t *testing.T) {\n\t\terr1 := validate.Struct(OmitEmpty{Str: \"\", StrPtr: nil})\n\t\terr2 := validate.Struct(OmitZero{Str: \"\", StrPtr: nil})\n\n\t\tEqual(t, err1, nil)\n\t\tEqual(t, err2, nil)\n\t})\n\n\tt.Run(\"compare with empty value\", func(t *testing.T) {\n\t\terr1 := validate.Struct(OmitEmpty{Str: empty, StrPtr: &empty})\n\t\terr2 := validate.Struct(OmitZero{Str: empty, StrPtr: &empty})\n\n\t\tAssertError(t, err1, \"OmitEmpty.StrPtr\", \"OmitEmpty.StrPtr\", \"StrPtr\", \"StrPtr\", \"min\")\n\t\tEqual(t, err2, nil)\n\t})\n}\n\nfunc TestEINStringValidation(t *testing.T) {\n\ttests := []struct {\n\t\tvalue    string `validate:\"ein\"`\n\t\texpected bool\n\t}{\n\t\t{\"01-2564282\", true},\n\t\t{\"25-4573894\", true},\n\t\t{\"63-236\", false},\n\t\t{\"3-5738294\", false},\n\t\t{\"4235-48\", false},\n\t\t{\"0.-47829\", false},\n\t\t{\"23-\", false},\n\t}\n\tvalidate := New()\n\n\tfor i, test := range tests {\n\t\terrs := validate.Var(test.value, \"ein\")\n\n\t\tif test.expected {\n\t\t\tif !IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ein failed Error: %s\", i, errs)\n\t\t\t}\n\t\t} else {\n\t\t\tif IsEqual(errs, nil) {\n\t\t\t\tt.Fatalf(\"Index: %d ein failed Error: %s\", i, errs)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestPrivateFieldsStruct(t *testing.T) {\n\ttype tc struct {\n\t\tstct     interface{}\n\t\terrorNum int\n\t}\n\n\ttcs := []tc{\n\t\t{\n\t\t\tstct: &struct {\n\t\t\t\tf1 int8  `validate:\"required\"`\n\t\t\t\tf2 int16 `validate:\"required\"`\n\t\t\t\tf3 int32 `validate:\"required\"`\n\t\t\t\tf4 int64 `validate:\"required\"`\n\t\t\t}{},\n\t\t\terrorNum: 4,\n\t\t},\n\t\t{\n\t\t\tstct: &struct {\n\t\t\t\tf1 uint8  `validate:\"required\"`\n\t\t\t\tf2 uint16 `validate:\"required\"`\n\t\t\t\tf3 uint32 `validate:\"required\"`\n\t\t\t\tf4 uint64 `validate:\"required\"`\n\t\t\t}{},\n\t\t\terrorNum: 4,\n\t\t},\n\t\t{\n\t\t\tstct: &struct {\n\t\t\t\tf1 complex64  `validate:\"required\"`\n\t\t\t\tf2 complex128 `validate:\"required\"`\n\t\t\t}{},\n\t\t\terrorNum: 2,\n\t\t},\n\t\t{\n\t\t\tstct: &struct {\n\t\t\t\tf1 float32 `validate:\"required\"`\n\t\t\t\tf2 float64 `validate:\"required\"`\n\t\t\t}{},\n\t\t\terrorNum: 2,\n\t\t},\n\t\t{\n\t\t\tstct: struct {\n\t\t\t\tf1 int8  `validate:\"required\"`\n\t\t\t\tf2 int16 `validate:\"required\"`\n\t\t\t\tf3 int32 `validate:\"required\"`\n\t\t\t\tf4 int64 `validate:\"required\"`\n\t\t\t}{},\n\t\t\terrorNum: 4,\n\t\t},\n\t\t{\n\t\t\tstct: struct {\n\t\t\t\tf1 uint8  `validate:\"required\"`\n\t\t\t\tf2 uint16 `validate:\"required\"`\n\t\t\t\tf3 uint32 `validate:\"required\"`\n\t\t\t\tf4 uint64 `validate:\"required\"`\n\t\t\t}{},\n\t\t\terrorNum: 4,\n\t\t},\n\t\t{\n\t\t\tstct: struct {\n\t\t\t\tf1 complex64  `validate:\"required\"`\n\t\t\t\tf2 complex128 `validate:\"required\"`\n\t\t\t}{},\n\t\t\terrorNum: 2,\n\t\t},\n\t\t{\n\t\t\tstct: struct {\n\t\t\t\tf1 float32 `validate:\"required\"`\n\t\t\t\tf2 float64 `validate:\"required\"`\n\t\t\t}{},\n\t\t\terrorNum: 2,\n\t\t},\n\t\t{\n\t\t\tstct: struct {\n\t\t\t\tf1 *int `validate:\"required\"`\n\t\t\t\tf2 struct {\n\t\t\t\t\tf3 int `validate:\"required\"`\n\t\t\t\t}\n\t\t\t}{},\n\t\t\terrorNum: 2,\n\t\t},\n\t\t{\n\t\t\tstct: &struct {\n\t\t\t\tf1 *int `validate:\"required\"`\n\t\t\t\tf2 struct {\n\t\t\t\t\tf3 int `validate:\"required\"`\n\t\t\t\t}\n\t\t\t}{},\n\t\t\terrorNum: 2,\n\t\t},\n\t\t{\n\t\t\tstct: &struct {\n\t\t\t\tf1 map[string]string `validate:\"required,dive,required\"`\n\t\t\t\tf2 *int              `validate:\"omitnil,min=2\"`\n\t\t\t}{\n\t\t\t\tf1: map[string]string{\"key\": \"\"},\n\t\t\t\tf2: intPtr(1),\n\t\t\t},\n\t\t\terrorNum: 2,\n\t\t},\n\t}\n\n\tvalidate := New(WithPrivateFieldValidation())\n\n\tfor _, tc := range tcs {\n\t\terr := validate.Struct(tc.stct)\n\t\tNotEqual(t, err, nil)\n\n\t\terrs := err.(ValidationErrors)\n\t\tEqual(t, len(errs), tc.errorNum)\n\t}\n\n\tstct := &struct {\n\t\tf1 int `validate:\"uri\"`\n\t}{}\n\n\tPanicMatches(t, func() { _ = validate.Struct(stct) }, \"Bad field type int\")\n}\n\ntype NotRed struct {\n\tColor string\n}\n\nfunc (r *NotRed) Validate() error {\n\tif r != nil && r.Color == \"red\" {\n\t\treturn errors.New(\"should not be red\")\n\t}\n\n\treturn nil\n}\n\nfunc (r NotRed) IsNotRed() bool {\n\treturn r.Color != \"red\"\n}\n\nfunc (r NotRed) DoNothing() {}\n\nfunc (r NotRed) String() string { return \"not red instance\" }\n\nfunc TestValidateFn(t *testing.T) {\n\tt.Run(\"using pointer\", func(t *testing.T) {\n\t\tvalidate := New()\n\n\t\ttype Test struct {\n\t\t\tString string\n\t\t\tInner  *NotRed `validate:\"validateFn\"`\n\t\t}\n\n\t\tvar tt Test\n\n\t\terrs := validate.Struct(tt)\n\t\tNotEqual(t, errs, nil)\n\n\t\tfe := errs.(ValidationErrors)[0]\n\t\tEqual(t, fe.Field(), \"Inner\")\n\t\tEqual(t, fe.Namespace(), \"Test.Inner\")\n\t\tEqual(t, fe.Tag(), \"validateFn\")\n\n\t\ttt.Inner = &NotRed{Color: \"blue\"}\n\t\terrs = validate.Struct(tt)\n\t\tEqual(t, errs, nil)\n\n\t\ttt.Inner = &NotRed{Color: \"red\"}\n\t\terrs = validate.Struct(tt)\n\t\tNotEqual(t, errs, nil)\n\n\t\tfe = errs.(ValidationErrors)[0]\n\t\tEqual(t, fe.Field(), \"Inner\")\n\t\tEqual(t, fe.Namespace(), \"Test.Inner\")\n\t\tEqual(t, fe.Tag(), \"validateFn\")\n\t})\n\n\tt.Run(\"using struct\", func(t *testing.T) {\n\t\tvalidate := New()\n\n\t\ttype Test2 struct {\n\t\t\tString string\n\t\t\tInner  NotRed `validate:\"validateFn\"`\n\t\t}\n\n\t\tvar tt2 Test2\n\n\t\terrs := validate.Struct(&tt2)\n\t\tEqual(t, errs, nil)\n\n\t\ttt2.Inner = NotRed{Color: \"blue\"}\n\n\t\terrs = validate.Struct(&tt2)\n\t\tEqual(t, errs, nil)\n\n\t\ttt2.Inner = NotRed{Color: \"red\"}\n\t\terrs = validate.Struct(&tt2)\n\t\tNotEqual(t, errs, nil)\n\n\t\tfe := errs.(ValidationErrors)[0]\n\t\tEqual(t, fe.Field(), \"Inner\")\n\t\tEqual(t, fe.Namespace(), \"Test2.Inner\")\n\t\tEqual(t, fe.Tag(), \"validateFn\")\n\t})\n\n\tt.Run(\"using struct with custom function\", func(t *testing.T) {\n\t\tvalidate := New()\n\n\t\ttype Test2 struct {\n\t\t\tString string\n\t\t\tInner  NotRed `validate:\"validateFn=IsNotRed\"`\n\t\t}\n\n\t\tvar tt2 Test2\n\n\t\terrs := validate.Struct(&tt2)\n\t\tEqual(t, errs, nil)\n\n\t\ttt2.Inner = NotRed{Color: \"blue\"}\n\n\t\terrs = validate.Struct(&tt2)\n\t\tEqual(t, errs, nil)\n\n\t\ttt2.Inner = NotRed{Color: \"red\"}\n\t\terrs = validate.Struct(&tt2)\n\t\tNotEqual(t, errs, nil)\n\n\t\tfe := errs.(ValidationErrors)[0]\n\t\tEqual(t, fe.Field(), \"Inner\")\n\t\tEqual(t, fe.Namespace(), \"Test2.Inner\")\n\t\tEqual(t, fe.Tag(), \"validateFn\")\n\t})\n\n\tt.Run(\"try validate method with wrong signature or not existent\", func(t *testing.T) {\n\t\tvalidate := New()\n\n\t\ttype Test2 struct {\n\t\t\tString string `validate:\"validateFn=NotExists\"` // should fail, method not found\n\t\t\tInner  NotRed `validate:\"validateFn=DoNothing\"` // should fail, return nothing\n\t\t\tInner2 NotRed `validate:\"validateFn=String\"`    // should fail, wrong return (must be error or bool)\n\t\t}\n\n\t\tvar tt2 Test2\n\n\t\terr := validate.Struct(&tt2)\n\t\tNotEqual(t, err, nil)\n\n\t\terrs := err.(ValidationErrors)\n\n\t\tEqual(t, len(errs), 3)\n\n\t\tfe := errs[0]\n\t\tEqual(t, fe.Field(), \"String\")\n\t\tEqual(t, fe.Namespace(), \"Test2.String\")\n\t\tEqual(t, fe.Tag(), \"validateFn\")\n\n\t\tfe = errs[1]\n\t\tEqual(t, fe.Field(), \"Inner\")\n\t\tEqual(t, fe.Namespace(), \"Test2.Inner\")\n\t\tEqual(t, fe.Tag(), \"validateFn\")\n\n\t\tfe = errs[2]\n\t\tEqual(t, fe.Field(), \"Inner2\")\n\t\tEqual(t, fe.Namespace(), \"Test2.Inner2\")\n\t\tEqual(t, fe.Tag(), \"validateFn\")\n\t})\n}\nfunc TestMapStructBasicValidation(t *testing.T) {\n\t// Tests basic validation of a map with struct values\n\ttype Inner struct {\n\t\tValue string `validate:\"max=5\"`\n\t}\n\ttype Outer struct {\n\t\tData map[string]Inner `validate:\"dive\"`\n\t}\n\tobj := Outer{\n\t\tData: map[string]Inner{\n\t\t\t\"key1\": {Value: \"exceeds\"}, // Should fail because Value is longer than 5 characters\n\t\t},\n\t}\n\tvalidate := New()\n\terrs := validate.Struct(obj)\n\tNotEqual(t, errs, nil)\n}\nfunc TestMapStructPointerValidation(t *testing.T) {\n\t// Tests validation of a map with pointer to struct values\n\ttype Inner struct {\n\t\tCount int `validate:\"gt=10\"`\n\t}\n\ttype Outer struct {\n\t\tItems map[string]*Inner `validate:\"dive\"`\n\t}\n\tobj := Outer{\n\t\tItems: map[string]*Inner{\n\t\t\t\"a\": {Count: 5},\n\t\t},\n\t}\n\tvalidate := New()\n\terrs := validate.Struct(obj)\n\tNotEqual(t, errs, nil)\n}\nfunc TestMapStructWithKeyValidationOnly(t *testing.T) {\n\t// Tests validation of a map with struct values, focusing on key validation\n\ttype Inner struct {\n\t\tName string `validate:\"required\"`\n\t}\n\ttype Outer struct {\n\t\tThings map[string]Inner `validate:\"dive,keys,min=3,endkeys\"`\n\t}\n\tobj := Outer{\n\t\tThings: map[string]Inner{\n\t\t\t\"ab\": {Name: \"valid\"}, //Should fail because key is too short\n\t\t},\n\t}\n\tvalidate := New()\n\terrs := validate.Struct(obj)\n\tNotEqual(t, errs, nil)\n}\nfunc TestMapStructWithKeyAndValueValidation(t *testing.T) {\n\t// Tests validation of a map with struct values, validating both keys and values\n\ttype Inner struct {\n\t\tName string `validate:\"min=3\"`\n\t}\n\ttype Outer struct {\n\t\tStuff map[string]Inner `validate:\"dive,keys,min=2,endkeys\"`\n\t}\n\tobj := Outer{\n\t\tStuff: map[string]Inner{\n\t\t\t\"ok\":  {Name: \"xy\"},\n\t\t\t\"bad\": {Name: \"valid\"},\n\t\t},\n\t}\n\tvalidate := New()\n\terrs := validate.Struct(obj)\n\tNotEqual(t, errs, nil)\n}\nfunc TestMapPointerStructWithNilValue(t *testing.T) {\n\t// Tests validation of a map with pointer to struct values where value is nil\n\ttype Inner struct {\n\t\tCount int `validate:\"min=1\"`\n\t}\n\ttype Outer struct {\n\t\tItems map[string]*Inner `validate:\"dive\"`\n\t}\n\tobj := Outer{\n\t\tItems: map[string]*Inner{\n\t\t\t\"x\": nil,\n\t\t},\n\t}\n\tvalidate := New()\n\terrs := validate.Struct(obj)\n\tEqual(t, errs, nil)\n}\nfunc TestThreeLevelNestedStructs(t *testing.T) {\n\t// Tests validation of three levels of nested structs with map keys and values\n\ttype Level3 struct {\n\t\tCode string `validate:\"len=3\"`\n\t}\n\n\ttype Level2 struct {\n\t\tItems map[string]Level3 `validate:\"dive,keys,required,endkeys\"`\n\t}\n\n\ttype Level1 struct {\n\t\tLevels map[string]Level2 `validate:\"dive,keys,required,endkeys\"`\n\t}\n\n\tvalidate := New()\n\n\t// Valid case: all Level3.Code are exactly 3 chars\n\tvalid := Level1{Levels: map[string]Level2{\n\t\t\"first\": {Items: map[string]Level3{\n\t\t\t\"item1\": {Code: \"abc\"},\n\t\t\t\"item2\": {Code: \"xyz\"},\n\t\t},\n\t\t},\n\t},\n\t}\n\n\terrs := validate.Struct(valid)\n\tEqual(t, errs, nil)\n\n\t// Invalid case: one Level3.Code is wrong length\n\tinvalid := Level1{Levels: map[string]Level2{\n\t\t\"first\": {Items: map[string]Level3{\n\t\t\t\"item1\": {Code: \"abcd\"}, // Should fail here because length is 4\n\t\t\t\"item2\": {Code: \"xyz\"},\n\t\t},\n\t\t},\n\t},\n\t}\n\n\terrs = validate.Struct(invalid)\n\tNotEqual(t, errs, nil)\n}\nfunc TestMapStructFallbackWithKeysOnly(t *testing.T) {\n\t// Tests fallback behavior when validating map keys and struct values\n\ttype Inner struct {\n\t\tValue string `validate:\"max=3\"`\n\t}\n\ttype Outer struct {\n\t\tData map[string]Inner `validate:\"dive,keys,max=2,endkeys\"`\n\t}\n\tvalidate := New()\n\n\t// Key too long: should fail on key before fallback\n\tobj1 := Outer{Data: map[string]Inner{\"toolong\": {Value: \"ok\"}}}\n\terrs := validate.Struct(obj1)\n\tNotEqual(t, errs, nil)\n\n\t// Key OK, value too long: should fallback and fail on Inner.Value\n\tobj2 := Outer{Data: map[string]Inner{\"ok\": {Value: \"toolong\"}}}\n\terrs = validate.Struct(obj2)\n\tNotEqual(t, errs, nil)\n\n\t// Both key and value OK: should pass\n\tobj3 := Outer{Data: map[string]Inner{\"ok\": {Value: \"abc\"}}}\n\terrs = validate.Struct(obj3)\n\tEqual(t, errs, nil)\n}\n\nfunc TestMapPointerStructFallback(t *testing.T) {\n\t// Tests fallback behavior when validating map keys and pointer to struct values\n\ttype Inner struct {\n\t\tCount int `validate:\"gt=0\"`\n\t}\n\ttype Outer struct {\n\t\tData map[string]*Inner `validate:\"dive,keys,max=3,endkeys\"`\n\t}\n\tvalidate := New()\n\n\t// Key OK, pointer is nil: no fallback error\n\tobj1 := Outer{Data: map[string]*Inner{\"ok\": nil}}\n\terrs := validate.Struct(obj1)\n\tEqual(t, errs, nil)\n\n\t// Key OK, pointer non-nil but field invalid: fallback should validate Inner.Count\n\tobj2 := Outer{Data: map[string]*Inner{\"ok\": {Count: 0}}}\n\terrs = validate.Struct(obj2)\n\tNotEqual(t, errs, nil)\n\n\t// Key OK, pointer non-nil and valid: should pass\n\tobj3 := Outer{Data: map[string]*Inner{\"ok\": {Count: 5}}}\n\terrs = validate.Struct(obj3)\n\tEqual(t, errs, nil)\n}\n\nfunc TestMapNonStructValueSkipsFallback(t *testing.T) {\n\t// Tests that fallback is skipped for non-struct values in maps\n\ttype Outer struct {\n\t\tData map[string]int `validate:\"dive,keys,min=1,endkeys\"`\n\t}\n\tvalidate := New()\n\n\t// Key OK, value is primitive: no fallback needed, should pass\n\tobj1 := Outer{Data: map[string]int{\"a\": 0}}\n\terrs := validate.Struct(obj1)\n\tEqual(t, errs, nil)\n\n\t// Key too short: should fail on key\n\tobj2 := Outer{Data: map[string]int{\"\": 0}}\n\terrs = validate.Struct(obj2)\n\tNotEqual(t, errs, nil)\n}\n\nfunc TestMapSliceValueNoFallback(t *testing.T) {\n\t// Tests that fallback is skipped for slice values in maps\n\ttype Outer struct {\n\t\tData map[string][]string `validate:\"dive,keys,max=1,endkeys\"`\n\t}\n\tvalidate := New()\n\n\t// Key OK, value is slice: skip fallback, should pass\n\tobj1 := Outer{Data: map[string][]string{\"a\": {\"x\", \"y\"}}}\n\terrs := validate.Struct(obj1)\n\tEqual(t, errs, nil)\n\n\t// Key too long: should fail on key\n\tobj2 := Outer{Data: map[string][]string{\"ab\": {\"x\"}}}\n\terrs = validate.Struct(obj2)\n\tNotEqual(t, errs, nil)\n}\nfunc TestMapEmptyStructValueNoError(t *testing.T) {\n\t// Tests that empty struct values in maps do not trigger validation errors\n\ttype Inner struct{} // no validation tags\n\n\ttype Outer struct {\n\t\tData map[string]Inner `validate:\"dive,keys,max=3,endkeys\"`\n\t}\n\tvalidate := New()\n\n\t// Key OK, value is empty struct: no fields to validate, should pass\n\tobj1 := Outer{Data: map[string]Inner{\"ok\": {}}}\n\terrs := validate.Struct(obj1)\n\tEqual(t, errs, nil)\n\n\t// Key too long: should fail on key, skip struct\n\tobj2 := Outer{Data: map[string]Inner{\"toolong\": {}}}\n\terrs = validate.Struct(obj2)\n\tNotEqual(t, errs, nil)\n}\n\nfunc TestMapNestedEmptyStructs(t *testing.T) {\n\t// Tests that nested empty structs in maps validate correctly\n\ttype Level3 struct{}\n\ttype Level2 struct {\n\t\tItems map[string]Level3 `validate:\"dive,keys,max=2,endkeys\"`\n\t}\n\ttype Level1 struct {\n\t\tLevels map[string]Level2 `validate:\"dive,keys,max=2,endkeys\"`\n\t}\n\n\tvalidate := New()\n\n\t// All keys within max=2, and inner structs are empty → should pass\n\tobj := Level1{Levels: map[string]Level2{\n\t\t\"a\": {Items: map[string]Level3{\"b\": {}}},\n\t}}\n\terrs := validate.Struct(obj)\n\tEqual(t, errs, nil)\n\n\t// Top-level key too long: should fail on Level1 key, skip deeper\n\tobj2 := Level1{Levels: map[string]Level2{\n\t\t\"too\": {Items: map[string]Level3{\"b\": {}}}, // \"too\" length=3 > max=2\n\t}}\n\terrs = validate.Struct(obj2)\n\tNotEqual(t, errs, nil)\n}\n\nfunc TestMapEmptyValueMap(t *testing.T) {\n\t// Tests that an empty map with struct values does not trigger validation errors\n\ttype Inner struct {\n\t\tValue string `validate:\"required\"`\n\t}\n\n\ttype Outer struct {\n\t\tData map[string]Inner `validate:\"dive,keys,max=3,endkeys\"`\n\t}\n\tvalidate := New()\n\n\t// Empty map: nothing to validate, should pass\n\tobj := Outer{Data: map[string]Inner{}}\n\terrs := validate.Struct(obj)\n\tEqual(t, errs, nil)\n}\n\nfunc TestMapEmptyPointerStructValueNoError(t *testing.T) {\n\t// Tests that empty pointer struct values in maps do not trigger validation errors\n\ttype Inner struct{}\n\n\ttype Outer struct {\n\t\tData map[string]*Inner `validate:\"dive,keys,max=3,endkeys\"`\n\t}\n\tvalidate := New()\n\n\t// Key OK, pointer is non-nil empty struct: should pass\n\tobj1 := Outer{Data: map[string]*Inner{\"ok\": {}}}\n\terrs := validate.Struct(obj1)\n\tEqual(t, errs, nil)\n\n\t// Key OK, pointer is nil: no tags on Inner, so should pass\n\tobj2 := Outer{Data: map[string]*Inner{\"ok\": nil}}\n\terrs = validate.Struct(obj2)\n\tEqual(t, errs, nil)\n}\nfunc TestOmitZeroWithSlices(t *testing.T) {\n\t// Tests the behavior of omitempty and omitzero with slices\n\ttype OmitEmptyExample struct {\n\t\tData []string `validate:\"omitempty,min=2\"`\n\t}\n\n\ttype OmitZeroExample struct {\n\t\tData []string `validate:\"omitzero,min=2\"`\n\t}\n\n\tvalidate := New()\n\n\tt.Run(\"nil slices\", func(t *testing.T) {\n\t\t// Test 1: nil slices\n\t\ttest1Empty := OmitEmptyExample{Data: nil}\n\t\ttest1Zero := OmitZeroExample{Data: nil}\n\n\t\terr1 := validate.Struct(test1Empty)\n\t\terr2 := validate.Struct(test1Zero)\n\n\t\tEqual(t, err1, nil) // No error (skipped)\n\t\tEqual(t, err2, nil) // No error (skipped)\n\t})\n\n\tt.Run(\"empty but non-nil slices\", func(t *testing.T) {\n\t\t// Test 2: empty but non-nil slices\n\t\ttest2Empty := OmitEmptyExample{Data: []string{}}\n\t\ttest2Zero := OmitZeroExample{Data: []string{}}\n\n\t\terr1 := validate.Struct(test2Empty)\n\t\terr2 := validate.Struct(test2Zero)\n\n\t\tNotEqual(t, err1, nil) // Error (min=2)\n\t\tEqual(t, err2, nil)    // No error (should be skipped)\n\t})\n\n\tt.Run(\"single item slices\", func(t *testing.T) {\n\t\t// Test 3: single item slices (still not meeting min=2)\n\t\ttest3Empty := OmitEmptyExample{Data: []string{\"one\"}}\n\t\ttest3Zero := OmitZeroExample{Data: []string{\"one\"}}\n\n\t\terr1 := validate.Struct(test3Empty)\n\t\terr2 := validate.Struct(test3Zero)\n\n\t\tNotEqual(t, err1, nil) // Error (min=2)\n\t\tNotEqual(t, err2, nil) // Error (min=2)\n\t})\n\n\tt.Run(\"valid slices\", func(t *testing.T) {\n\t\t// Test 4: valid slices (min=2 satisfied)\n\t\ttest4Empty := OmitEmptyExample{Data: []string{\"one\", \"two\"}}\n\t\ttest4Zero := OmitZeroExample{Data: []string{\"one\", \"two\"}}\n\n\t\terr1 := validate.Struct(test4Empty)\n\t\terr2 := validate.Struct(test4Zero)\n\n\t\tEqual(t, err1, nil) // No error\n\t\tEqual(t, err2, nil) // No error\n\t})\n}\nfunc TestOmitZeroWithMaps(t *testing.T) {\n\t// Tests the behavior of omitempty and omitzero with maps\n\ttype OmitEmptyExample struct {\n\t\tData map[string]string `validate:\"omitempty,min=2\"`\n\t}\n\n\ttype OmitZeroExample struct {\n\t\tData map[string]string `validate:\"omitzero,min=2\"`\n\t}\n\n\tvalidate := New()\n\n\tt.Run(\"nil maps\", func(t *testing.T) {\n\t\t// Test 1: nil maps\n\t\ttest1Empty := OmitEmptyExample{Data: nil}\n\t\ttest1Zero := OmitZeroExample{Data: nil}\n\n\t\terr1 := validate.Struct(test1Empty)\n\t\terr2 := validate.Struct(test1Zero)\n\n\t\tEqual(t, err1, nil) // No error (skipped)\n\t\tEqual(t, err2, nil) // No error (skipped)\n\t})\n\n\tt.Run(\"empty but non-nil maps\", func(t *testing.T) {\n\t\t// Test 2: empty but non-nil maps\n\t\ttest2Empty := OmitEmptyExample{Data: map[string]string{}}\n\t\ttest2Zero := OmitZeroExample{Data: map[string]string{}}\n\n\t\terr1 := validate.Struct(test2Empty)\n\t\terr2 := validate.Struct(test2Zero)\n\n\t\tNotEqual(t, err1, nil) // Error (min=2)\n\t\tEqual(t, err2, nil)    // No error (should be skipped)\n\t})\n\n\tt.Run(\"single item maps\", func(t *testing.T) {\n\t\t// Test 3: single item maps (still not meeting min=2)\n\t\ttest3Empty := OmitEmptyExample{Data: map[string]string{\"key1\": \"value1\"}}\n\t\ttest3Zero := OmitZeroExample{Data: map[string]string{\"key1\": \"value1\"}}\n\n\t\terr1 := validate.Struct(test3Empty)\n\t\terr2 := validate.Struct(test3Zero)\n\n\t\tNotEqual(t, err1, nil) // Error (min=2)\n\t\tNotEqual(t, err2, nil) // Error (min=2)\n\t})\n\n\tt.Run(\"valid maps\", func(t *testing.T) {\n\t\t// Test 4: valid maps (min=2 satisfied)\n\t\ttest4Empty := OmitEmptyExample{Data: map[string]string{\"key1\": \"value1\", \"key2\": \"value2\"}}\n\t\ttest4Zero := OmitZeroExample{Data: map[string]string{\"key1\": \"value1\", \"key2\": \"value2\"}}\n\n\t\terr1 := validate.Struct(test4Empty)\n\t\terr2 := validate.Struct(test4Zero)\n\n\t\tEqual(t, err1, nil) // No error\n\t\tEqual(t, err2, nil) // No error\n\t})\n}\nfunc TestRequiredIfWithNilBytesSlice(t *testing.T) {\n\t// Tests the behavior of required_if with nil byte slices\n\ttype TextOrBytes struct {\n\t\tText  string `validate:\"required_if=Bytes nil\"`\n\t\tBytes []byte `validate:\"required_if=Text nil\"`\n\t}\n\n\tvalidate := New(WithRequiredStructEnabled())\n\n\tt.Run(\"Text empty, Bytes empty but not nil\", func(t *testing.T) {\n\t\t// Test 1: Text empty, Bytes empty but not nil\n\t\tobj := TextOrBytes{\n\t\t\tText:  \"\",\n\t\t\tBytes: []byte{},\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tEqual(t, err, nil) // No error - Bytes is not nil, just empty\n\t})\n\n\tt.Run(\"Text empty, Bytes nil\", func(t *testing.T) {\n\t\t// Test 2: Text empty, Bytes nil\n\t\tobj := TextOrBytes{\n\t\t\tText:  \"\",\n\t\t\tBytes: nil,\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tNotEqual(t, err, nil) // Error - Text is required when Bytes is nil\n\t})\n\n\tt.Run(\"Text populated, Bytes nil\", func(t *testing.T) {\n\t\t// Test 3: Text populated, Bytes nil\n\t\tobj := TextOrBytes{\n\t\t\tText:  \"Hello\",\n\t\t\tBytes: nil,\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tEqual(t, err, nil) // No error - Text has value when Bytes is nil\n\t})\n\n\tt.Run(\"Text populated, Bytes empty but not nil\", func(t *testing.T) {\n\t\t// Test 4: Text populated, Bytes empty but not nil\n\t\tobj := TextOrBytes{\n\t\t\tText:  \"Hello\",\n\t\t\tBytes: []byte{},\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tEqual(t, err, nil) // No error - Neither field is nil\n\t})\n\n\tt.Run(\"Text empty, Bytes populated\", func(t *testing.T) {\n\t\t// Test 5: Text empty, Bytes populated\n\t\tobj := TextOrBytes{\n\t\t\tText:  \"\",\n\t\t\tBytes: []byte(\"World\"),\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tEqual(t, err, nil) // No error - Bytes has value when Text is empty\n\t})\n\n\tt.Run(\"Both fields populated\", func(t *testing.T) {\n\t\t// Test 6: Both fields populated\n\t\tobj := TextOrBytes{\n\t\t\tText:  \"Hello\",\n\t\t\tBytes: []byte(\"World\"),\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tEqual(t, err, nil) // No error - Both fields have values\n\t})\n}\nfunc TestRequiredIfWithMaps(t *testing.T) {\n\t// Tests the behavior of required_if with maps\n\ttype TextOrMap struct {\n\t\tText string                 `validate:\"required_if=Data nil\"`\n\t\tData map[string]interface{} `validate:\"required_if=Text nil\"`\n\t}\n\n\tvalidate := New(WithRequiredStructEnabled())\n\n\tt.Run(\"Text empty, Map nil\", func(t *testing.T) {\n\t\t// Test 1: Text empty, Map nil\n\t\tobj := TextOrMap{\n\t\t\tText: \"\",\n\t\t\tData: nil,\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tNotEqual(t, err, nil) // Error - Text is required when Data is nil\n\t})\n\n\tt.Run(\"Text populated, Map nil\", func(t *testing.T) {\n\t\t// Test 2: Text populated, Map nil\n\t\tobj := TextOrMap{\n\t\t\tText: \"Hello\",\n\t\t\tData: nil,\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tEqual(t, err, nil) // No error - Text has value when Data is nil\n\t})\n\n\tt.Run(\"Text empty, Map empty but not nil\", func(t *testing.T) {\n\t\t// Test 3: Text empty, Map empty but not nil\n\t\tobj := TextOrMap{\n\t\t\tText: \"\",\n\t\t\tData: map[string]interface{}{},\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tEqual(t, err, nil) // No error - Data is not nil, just empty\n\t})\n\n\tt.Run(\"Text populated, Map empty but not nil\", func(t *testing.T) {\n\t\t// Test 4: Text populated, Map empty but not nil\n\t\tobj := TextOrMap{\n\t\t\tText: \"Hello\",\n\t\t\tData: map[string]interface{}{},\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tEqual(t, err, nil) // No error - Neither field is nil\n\t})\n\n\tt.Run(\"Text empty, Map populated\", func(t *testing.T) {\n\t\t// Test 5: Text empty, Map populated\n\t\tobj := TextOrMap{\n\t\t\tText: \"\",\n\t\t\tData: map[string]interface{}{\"key\": \"value\"},\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tEqual(t, err, nil) // No error - Data has value when Text is empty\n\t})\n\n\tt.Run(\"Both fields populated\", func(t *testing.T) {\n\t\t// Test 6: Both fields populated\n\t\tobj := TextOrMap{\n\t\t\tText: \"Hello\",\n\t\t\tData: map[string]interface{}{\"key\": \"value\"},\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tEqual(t, err, nil) // No error - Both fields have values\n\t})\n}\nfunc TestRequiredIfWithArrays(t *testing.T) {\n\t// Tests the behavior of required_if with arrays\n\ttype TextOrArray struct {\n\t\tText string    `validate:\"required_if=Data 3\"`   // Check if array length is 3\n\t\tData [3]string `validate:\"required_if=Text nil\"` // Check if Text is empty\n\t}\n\n\t// Also test with a different length to verify behavior\n\ttype TextOrSmallArray struct {\n\t\tText string    `validate:\"required_if=Data 2\"`   // Check if array length is 2 (which it never will be for [3]string)\n\t\tData [3]string `validate:\"required_if=Text nil\"` // Check if Text is empty\n\t}\n\n\tvalidate := New(WithRequiredStructEnabled())\n\n\tt.Run(\"Array length always matches declared size\", func(t *testing.T) {\n\t\t// Test 1: Text empty, Array has length 3\n\t\tobj := TextOrArray{\n\t\t\tText: \"\",\n\t\t\tData: [3]string{}, // Zero values but length is 3\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tNotEqual(t, err, nil) // Error - Text is required when Data length equals 3\n\t})\n\n\tt.Run(\"Text populated, Array always has declared length\", func(t *testing.T) {\n\t\t// Test 2: Text populated, Array has length 3\n\t\tobj := TextOrArray{\n\t\t\tText: \"Hello\",\n\t\t\tData: [3]string{},\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tEqual(t, err, nil) // No error - Text has value\n\t})\n\n\tt.Run(\"Length check that never matches doesn't trigger validation\", func(t *testing.T) {\n\t\t// Test 3: Text empty, Array has length 3 but we check for length 2\n\t\tobj := TextOrSmallArray{\n\t\t\tText: \"\",\n\t\t\tData: [3]string{},\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tEqual(t, err, nil) // No error - Data length never equals 2\n\t})\n\n\tt.Run(\"Array values don't affect length check\", func(t *testing.T) {\n\t\t// Test 4: Text empty, Array partially populated but still length 3\n\t\tobj := TextOrArray{\n\t\t\tText: \"\",\n\t\t\tData: [3]string{\"One\", \"Two\", \"\"},\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tNotEqual(t, err, nil) // Error - Text is required when Data length equals 3\n\t})\n\n\tt.Run(\"Array values with Text populated passes validation\", func(t *testing.T) {\n\t\t// Test 5: Text populated, Array with values\n\t\tobj := TextOrArray{\n\t\t\tText: \"Hello\",\n\t\t\tData: [3]string{\"One\", \"Two\", \"Three\"},\n\t\t}\n\t\terr := validate.Struct(obj)\n\n\t\tEqual(t, err, nil) // No error - Text has value\n\t})\n}\n\ntype ValuerTypeWithPointerReceiver[T any] struct {\n\tData T\n}\n\nfunc (t *ValuerTypeWithPointerReceiver[T]) ValidatorValue() any {\n\treturn t.Data\n}\n\ntype ValuerTypeWithValueReceiver[T any] struct {\n\tData T\n}\n\nfunc (t ValuerTypeWithValueReceiver[T]) ValidatorValue() any {\n\treturn t.Data\n}\n\nfunc TestValuerInterface(t *testing.T) {\n\tt.Run(\"parent as Valuer (not called)\", func(t *testing.T) {\n\t\terrs := New().Struct(&ValuerTypeWithPointerReceiver[SubTest]{})\n\t\tAssertError(t, errs,\n\t\t\t\"ValuerTypeWithPointerReceiver[github.com/go-playground/validator/v10.SubTest].Data.Test\",\n\t\t\t\"ValuerTypeWithPointerReceiver[github.com/go-playground/validator/v10.SubTest].Data.Test\",\n\t\t\t\"Test\", \"Test\", \"required\")\n\t})\n\tt.Run(\"pointer parent, pointer nested, pointer receiver (called)\", func(t *testing.T) {\n\t\ttype Parent struct {\n\t\t\tNested *ValuerTypeWithPointerReceiver[SubTest] `validate:\"required\"`\n\t\t}\n\n\t\terrs := New().Struct(&Parent{})\n\t\tAssertError(t, errs, \"Parent.Nested\", \"Parent.Nested\", \"Nested\", \"Nested\", \"required\")\n\n\t\terrs = New().Struct(&Parent{\n\t\t\tNested: &ValuerTypeWithPointerReceiver[SubTest]{},\n\t\t})\n\t\tAssertError(t, errs, \"Parent.Nested.Test\", \"Parent.Nested.Test\", \"Test\", \"Test\", \"required\")\n\n\t\terrs = New().Struct(&Parent{\n\t\t\tNested: &ValuerTypeWithPointerReceiver[SubTest]{\n\t\t\t\tData: SubTest{\n\t\t\t\t\tTest: \"Test\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"Expected no error, got: %v\", errs)\n\t\t}\n\t})\n\tt.Run(\"pointer parent, pointer nested, value receiver (called)\", func(t *testing.T) {\n\t\ttype Parent struct {\n\t\t\tNested *ValuerTypeWithValueReceiver[SubTest] `validate:\"required\"`\n\t\t}\n\n\t\terrs := New().Struct(&Parent{})\n\t\tAssertError(t, errs, \"Parent.Nested\", \"Parent.Nested\", \"Nested\", \"Nested\", \"required\")\n\n\t\terrs = New().Struct(&Parent{\n\t\t\tNested: &ValuerTypeWithValueReceiver[SubTest]{},\n\t\t})\n\t\tAssertError(t, errs, \"Parent.Nested.Test\", \"Parent.Nested.Test\", \"Test\", \"Test\", \"required\")\n\n\t\terrs = New().Struct(&Parent{\n\t\t\tNested: &ValuerTypeWithValueReceiver[SubTest]{\n\t\t\t\tData: SubTest{\n\t\t\t\t\tTest: \"Test\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"Expected no error, got: %v\", errs)\n\t\t}\n\t})\n\tt.Run(\"pointer parent, value nested, pointer receiver (not called)\", func(t *testing.T) {\n\t\ttype Parent struct {\n\t\t\tNested ValuerTypeWithPointerReceiver[SubTest] `validate:\"required\"`\n\t\t}\n\n\t\terrs := New().Struct(&Parent{})\n\t\tAssertError(t, errs, \"Parent.Nested.Data.Test\", \"Parent.Nested.Data.Test\", \"Test\", \"Test\", \"required\")\n\n\t\terrs = New().Struct(&Parent{\n\t\t\tNested: ValuerTypeWithPointerReceiver[SubTest]{},\n\t\t})\n\t\tAssertError(t, errs, \"Parent.Nested.Data.Test\", \"Parent.Nested.Data.Test\", \"Test\", \"Test\", \"required\")\n\n\t\terrs = New().Struct(&Parent{\n\t\t\tNested: ValuerTypeWithPointerReceiver[SubTest]{\n\t\t\t\tData: SubTest{\n\t\t\t\t\tTest: \"Test\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"Expected no error, got: %v\", errs)\n\t\t}\n\t})\n\tt.Run(\"pointer parent, value nested, value receiver (called)\", func(t *testing.T) {\n\t\ttype Parent struct {\n\t\t\tNested ValuerTypeWithValueReceiver[SubTest] `validate:\"required\"`\n\t\t}\n\n\t\terrs := New().Struct(&Parent{})\n\t\tAssertError(t, errs, \"Parent.Nested.Test\", \"Parent.Nested.Test\", \"Test\", \"Test\", \"required\")\n\n\t\terrs = New().Struct(&Parent{\n\t\t\tNested: ValuerTypeWithValueReceiver[SubTest]{},\n\t\t})\n\t\tAssertError(t, errs, \"Parent.Nested.Test\", \"Parent.Nested.Test\", \"Test\", \"Test\", \"required\")\n\n\t\terrs = New().Struct(&Parent{\n\t\t\tNested: ValuerTypeWithValueReceiver[SubTest]{\n\t\t\t\tData: SubTest{\n\t\t\t\t\tTest: \"Test\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"Expected no error, got: %v\", errs)\n\t\t}\n\t})\n\tt.Run(\"value parent, pointer nested, pointer receiver (called)\", func(t *testing.T) {\n\t\ttype Parent struct {\n\t\t\tNested *ValuerTypeWithPointerReceiver[SubTest] `validate:\"required\"`\n\t\t}\n\n\t\terrs := New().Struct(Parent{})\n\t\tAssertError(t, errs, \"Parent.Nested\", \"Parent.Nested\", \"Nested\", \"Nested\", \"required\")\n\n\t\terrs = New().Struct(Parent{\n\t\t\tNested: &ValuerTypeWithPointerReceiver[SubTest]{},\n\t\t})\n\t\tAssertError(t, errs, \"Parent.Nested.Test\", \"Parent.Nested.Test\", \"Test\", \"Test\", \"required\")\n\n\t\terrs = New().Struct(Parent{\n\t\t\tNested: &ValuerTypeWithPointerReceiver[SubTest]{\n\t\t\t\tData: SubTest{\n\t\t\t\t\tTest: \"Test\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"Expected no error, got: %v\", errs)\n\t\t}\n\t})\n\tt.Run(\"value parent, pointer nested, value receiver (called)\", func(t *testing.T) {\n\t\ttype Parent struct {\n\t\t\tNested *ValuerTypeWithValueReceiver[SubTest] `validate:\"required\"`\n\t\t}\n\n\t\terrs := New().Struct(Parent{})\n\t\tAssertError(t, errs, \"Parent.Nested\", \"Parent.Nested\", \"Nested\", \"Nested\", \"required\")\n\n\t\terrs = New().Struct(Parent{\n\t\t\tNested: &ValuerTypeWithValueReceiver[SubTest]{},\n\t\t})\n\t\tAssertError(t, errs, \"Parent.Nested.Test\", \"Parent.Nested.Test\", \"Test\", \"Test\", \"required\")\n\n\t\terrs = New().Struct(Parent{\n\t\t\tNested: &ValuerTypeWithValueReceiver[SubTest]{\n\t\t\t\tData: SubTest{\n\t\t\t\t\tTest: \"Test\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"Expected no error, got: %v\", errs)\n\t\t}\n\t})\n\tt.Run(\"value parent, value nested, pointer receiver (not called)\", func(t *testing.T) {\n\t\ttype Parent struct {\n\t\t\tNested ValuerTypeWithPointerReceiver[SubTest] `validate:\"required\"`\n\t\t}\n\n\t\terrs := New().Struct(Parent{})\n\t\tAssertError(t, errs, \"Parent.Nested.Data.Test\", \"Parent.Nested.Data.Test\", \"Test\", \"Test\", \"required\")\n\n\t\terrs = New().Struct(Parent{\n\t\t\tNested: ValuerTypeWithPointerReceiver[SubTest]{},\n\t\t})\n\t\tAssertError(t, errs, \"Parent.Nested.Data.Test\", \"Parent.Nested.Data.Test\", \"Test\", \"Test\", \"required\")\n\n\t\terrs = New().Struct(Parent{\n\t\t\tNested: ValuerTypeWithPointerReceiver[SubTest]{\n\t\t\t\tData: SubTest{\n\t\t\t\t\tTest: \"Test\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"Expected no error, got: %v\", errs)\n\t\t}\n\t})\n\tt.Run(\"value parent, value nested, value receiver (called)\", func(t *testing.T) {\n\t\ttype Parent struct {\n\t\t\tNested ValuerTypeWithValueReceiver[SubTest] `validate:\"required\"`\n\t\t}\n\n\t\terrs := New().Struct(Parent{})\n\t\tAssertError(t, errs, \"Parent.Nested.Test\", \"Parent.Nested.Test\", \"Test\", \"Test\", \"required\")\n\n\t\terrs = New().Struct(Parent{\n\t\t\tNested: ValuerTypeWithValueReceiver[SubTest]{},\n\t\t})\n\t\tAssertError(t, errs, \"Parent.Nested.Test\", \"Parent.Nested.Test\", \"Test\", \"Test\", \"required\")\n\n\t\terrs = New().Struct(Parent{\n\t\t\tNested: ValuerTypeWithValueReceiver[SubTest]{\n\t\t\t\tData: SubTest{\n\t\t\t\t\tTest: \"Test\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif errs != nil {\n\t\t\tt.Fatalf(\"Expected no error, got: %v\", errs)\n\t\t}\n\t})\n}\n"
  }
]