2021-11-20 13:25:27 +05:30
|
|
|
package yaml
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"io"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"github.com/go-playground/validator/v10"
|
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
|
"gopkg.in/yaml.v2"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var validate *validator.Validate
|
|
|
|
|
|
|
|
|
|
// DecodeAndValidate is a wrapper for yaml Decode adding struct validation
|
|
|
|
|
func DecodeAndValidate(r io.Reader, v interface{}) error {
|
|
|
|
|
if err := yaml.NewDecoder(r).Decode(v); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if validate == nil {
|
|
|
|
|
validate = validator.New()
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-25 17:57:22 +02:00
|
|
|
if err := validate.Struct(v); err != nil {
|
2021-11-20 13:25:27 +05:30
|
|
|
if _, ok := err.(*validator.InvalidValidationError); ok {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
errs := []string{}
|
|
|
|
|
for _, err := range err.(validator.ValidationErrors) {
|
|
|
|
|
errs = append(errs, err.Namespace()+": "+err.Tag())
|
|
|
|
|
}
|
|
|
|
|
return errors.Wrap(errors.New(strings.Join(errs, ", ")), "validation failed for these fields")
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|