Skip to content

Files

Latest commit

bfc048a · Apr 16, 2024

History

History

hw09_struct_validator

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Feb 7, 2024
Feb 7, 2024
Apr 16, 2024
Feb 7, 2024
Feb 7, 2024

README.md

Домашнее задание №9 «Валидатор структур»

Необходимо реализовать функцию:

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 баллов
  • Дополнительное задание на баллы не влияет

Зачёт от 7 баллов

Подсказки

  • reflect.StructTag
  • regexp.Compile
  • errors.Is

Частые ошибки

  • Отсутствует проверка на то, что входной interface{} - структура.
  • Нет разделения на программные ошибки (неверный тэг, регулярка и пр.) и ошибки валидации.
  • Ошибки валидации не вынесены в отдельные переменные и не завраплены.
  • Соответственно в тестах не используется errors.Is / errors.As.