Необходимо реализовать тулзу для кодогенерации методов, валидирующих структуры.
Первым аргументом бинарь принимает путь к файлу, содержащему описание структур.
Пример вызова:
$ go-validate models/models.gomodels.go:
package models
type User {
Name string
Age int `validate:"min:18|max:50"`
}Программа видит, что в структуре User есть поле Age, среди тэгов которого есть
тэг validate и генерирует код валидации в файл models_validation_generated.go
(где models - имя исходного файла без расширения) в том же пакете, что и исходный файл.
models_validation_generated.go:
// Code generated by cool go-validate tool; DO NOT EDIT.
package models
func (u User) Validate() ([]ValidationError, error) {
...
}, где
[]ValidationError- слайс структур, содержащих имя поля и ошибку его валидации;err- программная ошибка, произошедшая во время валидации.
Типы полей, которые обязательно должны поддерживаться:
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.
Для большего понимания см. тесты.
(*) Дополнительное задание: поддержка валидации вложенных по композиции структур.
Структура проекта:
models- минимальный тестовый набор структур.test.shкомпилирует вашу тулзу и ставит её в систему, затем с помощьюgo generateгенерирует код валидаторов, а затем запускает тесты в пакетеmodels.go-validate- набор файлов (и тестов к ним), реализующих тулзу.
Сгенерированный код следует закоммитить! Но имейте в виду, что
test.sh генерирует его заного, чтобы протестировать данный процесс.
Так как тестирование будет использовать go generate models/models.go,
необходимо доработать этот файл так, чтобы данная команда вызывала
нашу тулзу.
Не забудьте добавить в сгенерированный файл дисклеймер!
- Закоммичен сгенерированный код - 1 балл
- Пайплайн зелёный - 3 балла
- Добавлены новые юнит-тесты (доработаны имеющиеся) в
models- до 2 баллов - Добавлены юнит-тесты для тулзы в
govalidate- до 2 баллов - Понятность и чистота кода - до 2 баллов
- Дополнительное задание на баллы не влияет
$GOFILEtext/templateregexp.MustCompileparser.ParseFile*ast.GenDecl,*ast.StructTypego/format