64 lines
1.2 KiB
Go
64 lines
1.2 KiB
Go
|
|
package response
|
||
|
|
|
||
|
|
import (
|
||
|
|
"github.com/go-playground/locales/en"
|
||
|
|
ut "github.com/go-playground/universal-translator"
|
||
|
|
"github.com/go-playground/validator/v10"
|
||
|
|
ent "github.com/go-playground/validator/v10/translations/en"
|
||
|
|
"github.com/gofiber/fiber/v2"
|
||
|
|
"github.com/rs/zerolog/log"
|
||
|
|
"reflect"
|
||
|
|
)
|
||
|
|
|
||
|
|
var (
|
||
|
|
validate *validator.Validate
|
||
|
|
uni *ut.UniversalTranslator
|
||
|
|
Trans ut.Translator
|
||
|
|
)
|
||
|
|
|
||
|
|
func init() {
|
||
|
|
validate = validator.New()
|
||
|
|
|
||
|
|
uni = ut.New(en.New())
|
||
|
|
Trans, _ = uni.GetTranslator("en")
|
||
|
|
|
||
|
|
if err := ent.RegisterDefaultTranslations(validate, Trans); err != nil && !fiber.IsChild() {
|
||
|
|
log.Panic().Err(err).Msg("")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func ValidateStruct(input any) error {
|
||
|
|
return validate.Struct(input)
|
||
|
|
}
|
||
|
|
|
||
|
|
func ParseBody(c *fiber.Ctx, body any) error {
|
||
|
|
if err := c.BodyParser(body); err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func ParseAndValidate(c *fiber.Ctx, body any) error {
|
||
|
|
v := reflect.ValueOf(body)
|
||
|
|
|
||
|
|
switch v.Kind() {
|
||
|
|
case reflect.Ptr:
|
||
|
|
err := ParseBody(c, body)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
return ValidateStruct(v.Elem().Interface())
|
||
|
|
case reflect.Struct:
|
||
|
|
err := ParseBody(c, &body)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
return ValidateStruct(v)
|
||
|
|
default:
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
}
|