added more user-friendly validation messages.

This commit is contained in:
Erik Brakkee 2025-01-04 13:54:29 +01:00
parent a87f43ba54
commit 548260d3ab
3 changed files with 91 additions and 4 deletions

View File

@ -4,7 +4,6 @@ import (
"bytes"
"errors"
"fmt"
"github.com/go-playground/validator/v10"
"github.com/goccy/go-yaml"
"log"
"net"
@ -95,8 +94,13 @@ func (c *Config) Update(config *Config) {
}
func (c Config) ValidateSchema() error {
validate := validator.New(validator.WithRequiredStructEnabled())
return validate.Struct(c)
validator, err := NewValidator()
if err != nil {
return err
}
err = validator.ValidateStruct(c)
return err
}
func (c Config) Validate() error {

View File

@ -0,0 +1,82 @@
package main
import (
"errors"
"fmt"
"github.com/go-playground/locales/en"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
en_translations "github.com/go-playground/validator/v10/translations/en"
)
type Validator struct {
validate *validator.Validate
trans ut.Translator
}
type Translation struct {
format string
params func(fe validator.FieldError) []any
}
var translations = map[string]Translation{
"oneof": {
"{0} must be one of [{1}], got '{2}'",
func(fe validator.FieldError) []any {
return []any{fe.Field(), fe.Param(), fe.Value()}
},
},
}
func NewValidator() (*Validator, error) {
validate := validator.New(validator.WithRequiredStructEnabled())
language := en.New()
translator := ut.New(language, language)
trans, ok := translator.GetTranslator("en")
if !ok {
return nil, fmt.Errorf("Could not find translator to print error meesage")
}
en_translations.RegisterDefaultTranslations(validate, trans)
for validation, translation := range translations {
validate.RegisterTranslation(validation, trans,
func(ut ut.Translator) error {
return ut.Add(validation, translation.format, true)
},
func(ut ut.Translator, fe validator.FieldError) string {
params := translation.params(fe)
stringParams := make([]string, len(params))
for i, param := range params {
stringParams[i] = fmt.Sprintf("%s", param)
}
t, _ := ut.T(validation, stringParams...)
return t
})
}
return &Validator{
validate: validate,
trans: trans,
}, nil
}
func (v Validator) ValidateStruct(s interface{}) error {
err := v.validate.Struct(s)
return v.Translate(err)
}
func (v Validator) Translate(err error) error {
if err == nil {
return err
}
errs, ok := err.(validator.ValidationErrors)
if !ok {
return err
}
errorList := make([]error, 0)
for _, e := range errs {
errorList = append(errorList, fmt.Errorf("%s", e.Translate(v.trans)))
}
return errors.Join(errorList...)
}

View File

@ -10,13 +10,14 @@ networks:
- 192.168.0.0/16
ports:
- port: 2303
protocol: UDP
namespaces:
- name: wamblee-org
#open: true
capabilities:
- linkerdd
- linkerd
- dns
applications:
- name: nexus-server