From cbdba6fdf0495c130d5d7744a91ef934654c2dab Mon Sep 17 00:00:00 2001 From: xavier Date: Wed, 14 Feb 2024 11:36:53 +0100 Subject: [PATCH] feat: Add a tag validation method --- validator_instance.go | 19 +++++++++++++++++++ validator_test.go | 8 ++++++++ 2 files changed, 27 insertions(+) diff --git a/validator_instance.go b/validator_instance.go index d5a7be1de..cc69feb75 100644 --- a/validator_instance.go +++ b/validator_instance.go @@ -707,3 +707,22 @@ func (v *Validate) VarWithValueCtx(ctx context.Context, field interface{}, other v.pool.Put(vd) return } + +// ValidateTag validates a tag. It's main purpose is to be used when validating values directly via the Var, VarCtx, +// VarWithValue and VarWithValueCtx methods to know beforehand if the tag is known by the library instead of managing +// a panic error. +// +// Parameters: +// tag (string): The tag to be validated. +// +// Returns: +// error: An error signaling the given tag is invalid. +func (v *Validate) ValidateTag(tag string) (err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("error parsing tag: %v", r) + } + }() + v.parseFieldTagsRecursive(tag, "", "", false) + return err +} diff --git a/validator_test.go b/validator_test.go index 2826ae70e..b545a08af 100644 --- a/validator_test.go +++ b/validator_test.go @@ -13692,3 +13692,11 @@ func TestOmitNilAndRequired(t *testing.T) { AssertError(t, err2, "OmitNil.Inner.Str", "OmitNil.Inner.Str", "Str", "Str", "required") }) } + +func TestValidate_ValidateTag(t *testing.T) { + validate := New() + err := validate.ValidateTag("nonexsiting,nonexisting2") + NotEqual(t, err, nil) + err = validate.ValidateTag("required,email") + Equal(t, err, nil) +}