@@ -288,35 +288,96 @@ func (v *Validator) validateFieldByNameAndTag(f interface{}, name string, tag st
288288
289289 for _ , valTag := range valTags {
290290
291- // TODO: validate = in regex's
292- vals := strings .Split (valTag , "=" )
293- key := strings .Trim (vals [0 ], " " )
291+ orVals := strings .Split (valTag , "|" )
294292
295- if len (key ) == 0 {
296- panic (fmt .Sprintf ("Invalid validation tag on field %s" , name ))
297- }
293+ if len (orVals ) > 1 {
298294
299- // OK to continue because we checked it's existance before getting into this loop
300- if key == omitempty {
301- continue
302- }
295+ errTag := ""
303296
304- valFunc , ok := v .validationFuncs [key ]
305- if ! ok {
306- panic (fmt .Sprintf ("Undefined validation function on field %s" , name ))
307- }
297+ for _ , val := range orVals {
308298
309- param := ""
310- if len (vals ) > 1 {
311- param = strings .Trim (vals [1 ], " " )
312- }
299+ key , err := v .validateFieldByNameAndSingleTag (f , name , val )
313300
314- if err := valFunc (f , param ); ! err {
301+ if err == nil {
302+ return nil
303+ }
315304
316- return errors .New (key )
305+ errTag += "|" + key
306+
307+ }
308+
309+ errTag = strings .TrimLeft (errTag , "|" )
310+
311+ return errors .New (errTag )
312+ }
313+
314+ if _ , err := v .validateFieldByNameAndSingleTag (f , name , valTag ); err != nil {
315+ return err
317316 }
318317
318+ // TODO: validate = in regex's
319+ // vals := strings.Split(valTag, "=")
320+ // key := strings.Trim(vals[0], " ")
321+ //
322+ // if len(key) == 0 {
323+ // panic(fmt.Sprintf("Invalid validation tag on field %s", name))
324+ // }
325+ //
326+ // // OK to continue because we checked it's existance before getting into this loop
327+ // if key == omitempty {
328+ // continue
329+ // }
330+ //
331+ // valFunc, ok := v.validationFuncs[key]
332+ // if !ok {
333+ // panic(fmt.Sprintf("Undefined validation function on field %s", name))
334+ // }
335+ //
336+ // param := ""
337+ // if len(vals) > 1 {
338+ // param = strings.Trim(vals[1], " ")
339+ // }
340+ //
341+ // if err := valFunc(f, param); !err {
342+ //
343+ // return errors.New(key)
344+ // }
345+ // if err := v.validateFieldByNameAndSingleTag(f, name, valTag); err != nil {
346+ // return err
347+ // }
348+
319349 }
320350
321351 return nil
322352}
353+
354+ func (v * Validator ) validateFieldByNameAndSingleTag (f interface {}, name string , valTag string ) (string , error ) {
355+
356+ vals := strings .Split (valTag , "=" )
357+ key := strings .Trim (vals [0 ], " " )
358+
359+ if len (key ) == 0 {
360+ panic (fmt .Sprintf ("Invalid validation tag on field %s" , name ))
361+ }
362+
363+ // OK to continue because we checked it's existance before getting into this loop
364+ if key == omitempty {
365+ return key , nil
366+ }
367+
368+ valFunc , ok := v .validationFuncs [key ]
369+ if ! ok {
370+ panic (fmt .Sprintf ("Undefined validation function on field %s" , name ))
371+ }
372+
373+ param := ""
374+ if len (vals ) > 1 {
375+ param = strings .Trim (vals [1 ], " " )
376+ }
377+
378+ if err := valFunc (f , param ); ! err {
379+ return key , errors .New (key )
380+ }
381+
382+ return key , nil
383+ }
0 commit comments