func tryRecursiveValidate()

in validator.go [142:173]


func tryRecursiveValidate(val reflect.Value, opts *options, validators []validatorTag) error {
	var curr interface{}
	if val.IsValid() {
		curr = val.Interface()
	}
	if err := runValidators(curr, validators); err != nil {
		return err
	}
	if !val.IsValid() {
		return nil
	}

	t := val.Type()
	if (t.Kind() == reflect.Ptr || t.Kind() == reflect.Interface) && val.IsNil() {
		return nil
	}

	var err error
	switch chaseValue(val).Kind() {
	case reflect.Struct:
		err = validateStruct(val, opts)
	case reflect.Map:
		err = validateMap(val, opts)
	case reflect.Array, reflect.Slice:
		err = validateArray(val, opts)
	}

	if err != nil {
		return err
	}
	return tryValidate(val)
}