Search code examples
govalidationstructgoland

Golang validator package with error rename field


I tried to use golang validator package

https://pkg.go.dev/github.com/go-playground/validator/v10

is there a way to mask the field for the returned error? example below, let's say I have a struct like the following, to perform struct validation

type SignInUserData struct {
  Email    string `json:"email" validate:"required"`
  Password string `json:"password" validate:"required"`
}

if my error is mapping like this:

validationErrors := err.(validator.ValidationErrors)

for _, fieldError := range validationErrors {
  fmt.println(fieldError.Field())
}

I get the field name, like "Email" or "Password". I want what is returned is the other name of the field, for example "Email" becomes "Email Address", or "Password" becomes "Secret".

Is there a way to do it? Thank You ..


Solution

  • You can use (*Validate).RegisterTagNameFunc to register a function to get alternate names for StructFields.

    For example, register a function to get the alternative name from the name tag:

    package main
    
    import (
        "fmt"
        "reflect"
    
        "github.com/go-playground/validator/v10"
    )
    
    type SignInUserData struct {
        Email    string `json:"email" validate:"required" name:"Email Address"`
        Password string `json:"password" validate:"required" name:"Secret"`
    }
    
    func main() {
        validate := validator.New()
        validate.RegisterTagNameFunc(func(field reflect.StructField) string {
            return field.Tag.Get("name")
        })
    
        data := &SignInUserData{}
    
        err := validate.Struct(data)
        if err != nil {
            validationErrors, ok := err.(validator.ValidationErrors)
            if ok {
                for _, fieldError := range validationErrors {
                    fmt.Println(fieldError.Field())
                }
            }
        }
    }