From e917a9c7109e4b3a87c62a82531d26571d958af6 Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte Date: Tue, 4 Jul 2023 17:34:23 +0200 Subject: [PATCH] better errors on validation --- pkg/utils/cfg/cfg.go | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/pkg/utils/cfg/cfg.go b/pkg/utils/cfg/cfg.go index 88c9de3950..c1685c8061 100644 --- a/pkg/utils/cfg/cfg.go +++ b/pkg/utils/cfg/cfg.go @@ -19,7 +19,12 @@ package cfg import ( + "errors" + + "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" "github.com/mitchellh/mapstructure" ) @@ -31,6 +36,10 @@ type Setter interface { } var validate = validator.New() +var english = en.New() +var uni = ut.New(english, english) +var trans, _ = uni.GetTranslator("en") +var _ = en_translations.RegisterDefaultTranslations(validate, trans) // Decode decodes the given raw input interface to the target pointer c. // It applies the default configuration if the target struct @@ -53,5 +62,17 @@ func Decode(input map[string]any, c any) error { return err } - return validate.Struct(c) + return translateError(validate.Struct(c), trans) +} + +func translateError(err error, trans ut.Translator) error { + if err == nil { + return nil + } + errs := err.(validator.ValidationErrors) + translated := make([]error, 0, len(errs)) + for _, err := range errs { + translated = append(translated, errors.New(err.Translate(trans))) + } + return errors.Join(translated...) }