struct can be null flag

local
hzy 1 year ago
parent 0e6a5850b2
commit 3cac6d154d
  1. 16
      validator_instance.go

@ -150,20 +150,32 @@ func (v *Validate) SetTagName(name string) {
v.tagName = name v.tagName = name
} }
const omitemptyStructPrefix = "__omitempty_struct__"
// ValidateMapCtx validates a map using a map of validation rules and allows passing of contextual // ValidateMapCtx validates a map using a map of validation rules and allows passing of contextual
// validation validation information via context.Context. // validation validation information via context.Context.
func (v Validate) ValidateMapCtx(ctx context.Context, data map[string]interface{}, rules map[string]interface{}) map[string]interface{} { func (v Validate) ValidateMapCtx(ctx context.Context, data map[string]interface{}, rules map[string]interface{}) map[string]interface{} {
errs := make(map[string]interface{}) errs := make(map[string]interface{})
for field, rule := range rules { for field, rule := range rules {
if strings.HasPrefix(field, omitemptyStructPrefix) == true {
continue
}
if ruleObj, ok := rule.(map[string]interface{}); ok { if ruleObj, ok := rule.(map[string]interface{}); ok {
if dataObj, ok := data[field].(map[string]interface{}); ok { if dataObj, ok := data[field]; ok {
err := v.ValidateMapCtx(ctx, dataObj, ruleObj) if do, ok := dataObj.(map[string]interface{}); ok {
err := v.ValidateMapCtx(ctx, do, ruleObj)
if len(err) > 0 { if len(err) > 0 {
errs[field] = err errs[field] = err
} }
} else { } else {
errs[field] = errors.New("The field: '" + field + "' is not a map to dive") errs[field] = errors.New("The field: '" + field + "' is not a map to dive")
} }
} else if _, ok := rules[fmt.Sprintf("%s%s", omitemptyStructPrefix, field)].(string); ok {
// struct can be null
continue
} else {
errs[field] = errors.New("The field: '" + field + "' is not a map to dive")
}
} else if arrRuleObj, ok := rule.([]map[string]interface{}); ok { } else if arrRuleObj, ok := rule.([]map[string]interface{}); ok {
if dataObjs, ok := data[field].([]map[string]interface{}); ok && len(arrRuleObj) > 0 { if dataObjs, ok := data[field].([]map[string]interface{}); ok && len(arrRuleObj) > 0 {
for _, obj := range dataObjs { for _, obj := range dataObjs {

Loading…
Cancel
Save