Необходимо реализовать функцию
func Validate(v interface{}) error
, валидирующую публичные поля входной структуры на основе структурного тэга validate
.
Функция может возвращать
- или программную ошибку, произошедшую во время валидации;
- или
ValidationErrors
- ошибку, являющуюся слайсом структур, содержащих имя поля и ошибку его валидации.
Таким образом, нужно накопить все ошибки валидации, а не прерывать валидацию на первой ошибке.
Если у поля нет структурных тэгов или нет тэга validate
, то функция игнорирует его.
Типы полей, которые обязательно должны поддерживаться:
int
,[]int
;string
,[]string
.
При желании можно дополнительно поддержать любые другие типы (на ваше усмотрение).
Необходимо реализовать следующие валидаторы:
- Для строк:
len:32
- длина строки должна быть ровно 32 символа;regexp:\\d+
- согласно регулярному выражению строка должна состоять из цифр (\\
- экранирование слэша);in:foo,bar
- строка должна входить в множество строк {"foo", "bar"}.
- Для чисел:
min:10
- число не может быть меньше 10;max:20
- число не может быть больше 20;in:256,1024
- число должно входить в множество чисел {256, 1024};
- Для слайсов валидируется каждый элемент слайса.
При желании можно дополнительно добавить парочку новых правил (на ваше усмотрение).
Допускается комбинация валидаторов по логическому "И" с помощью |
, например:
min:0|max:10
- число должно находится в пределах [0, 10];regexp:\\d+|len:20
- строка должна состоять из цифр и иметь длину 20.
(*) Дополнительное задание: поддержка валидации вложенных по композиции структур.
type User struct {
m Meta `validate:"nested"`
}
- Пайплайн зелёный - 3 балла
- Добавлены юнит-тесты - до 4 баллов
- Понятность и чистота кода - до 3 баллов
- Дополнительное задание на баллы не влияет
reflect.StructTag
regexp.Compile
errors.Is
- Отсутствует проверка на то, что входной
interface{}
- структура. - Нет разделения на программные ошибки (неверный тэг, регулярка и пр.) и ошибки валидации.
- Ошибки валидации не вынесены в отдельные переменные и не завраплены.
- Соответственно в тестах не используется
errors.Is
/errors.As
.