Issue with required_if combination in github.com/go-playground/validator/v10 package

WBOY
Release: 2024-02-11 11:54:08
forward
466 people have browsed it

github.com/go-playground/validator/v10 包中的 required_if 组合问题

php editor Baicao is here to introduce to you a question about the required_if combination in the github.com/go-playground/validator/v10 package. When using this package for data validation, sometimes we need to determine whether other fields are required based on the value of a certain field. At this time, you can use the required_if combination rule to achieve this requirement. It can determine whether a field is required based on specified conditions, which is very flexible and practical. In this article, we will detail how to use required_if combination rules to solve this problem.

Question content

Software package version, for example. v9, v10:

Package version: v10

Questions, problems or improvements: When I try to run the code below. I'm getting this error, it's wired

Output

Validation error: Key: 'Application.Applicants[0].Entity.Name' Error:Field validation for 'Name' failed on the 'required' tag
Key: 'Application.Applicants[0].Entity.TaxID' Error:Field validation for 'TaxID' failed on the 'required' tag
Key: 'Application.Applicants[1].Person.Name' Error:Field validation for 'Name' failed on the 'required' tag
Key: 'Application.Applicants[1].Person.Age' Error:Field validation for 'Age' failed on the 'required' tag
Key: 'Application.Applicants[1].Person.Email' Error:Field validation for 'Email' failed on the 'required' tag
Copy after login

Code examples for demonstration or reproduction:

package main

import (
    "fmt"
    "github.com/go-playground/validator/v10"
)

type Application struct {
    Applicants []Applicant `validate:"dive"`
}

type Applicant struct {
    ApplicantCategory string `validate:"required,oneof=PERSON ENTITY"`
    Person            Person `validate:"required_if=ApplicantCategory PERSON"`
    Entity            Entity `validate:"required_if=ApplicantCategory ENTITY"`
}

type Person struct {
    Name  string `validate:"required"`
    Age   int    `validate:"required,gte=18"`
    Email string `validate:"required,email"`
}

type Entity struct {
    Name  string `validate:"required"`
    TaxID string `validate:"required"`
}

func main() {
    // Create a new validator instance
    v := validator.New()

    // Create an instance of Application to validate
    data := Application{
        Applicants: []Applicant{
            {
                ApplicantCategory: "PERSON",
                Person: Person{
                    Name:  "John Doe",
                    Age:   25,
                    Email: "[email protected]",
                },
            },
            {
                ApplicantCategory: "ENTITY",
                Entity: Entity{
                    Name:  "Example Corp",
                    TaxID: "123456789",
                },
            },
        },
    }

    // Use the validator to validate the Application struct and its Applicants
    if err := v.Struct(data); err != nil {
        fmt.Println("Validation error:", err)
    } else {
        fmt.Println("Validation passed")
    }
}
Copy after login

Unable to identify a problem in the code or validation package. Any help would be greatly appreciated...

Workaround

Add omitempty For example: < /p>

type Applicant struct {
    ApplicantCategory string `validate:"required,oneof=PERSON ENTITY"`
    Person            Person `validate:"required_if=ApplicantCategory PERSON,omitempty"`
    Entity            Entity `validate:"required_if=ApplicantCategory ENTITY,omitempty"`
}
Copy after login
Full example in

playground (note that this will not run reliably in the Playground due to the size of the number of imported packages).

The problem is that required_if causes the library to check if Person//Entity exists, but the library still validates an empty Person/Entity (and fails!). Adding omitempty means that the library will ignore empty struct; this provides the desired result because required_if will ensure that any required struct Not empty (meaning it will be validated).

Another option is to use pointers (playground):

type Applicant struct {
    ApplicantCategory string `validate:"required,oneof=PERSON ENTITY"`
    Person            *Person `validate:"required_if=ApplicantCategory PERSON"`
    Entity            *Entity `validate:"required_if=ApplicantCategory ENTITY"`
}
Copy after login

The difference here is that when there is no Entity, the value will be nil (as opposed to Entity which has a default value), which means validator Unable to verify.

Note: I recommend using v := validator.New(validator.WithRequiredStructEnabled()) (as per documentation).

The above is the detailed content of Issue with required_if combination in github.com/go-playground/validator/v10 package. For more information, please follow other related articles on the PHP Chinese website!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template