Кодогенератор, который ищет методы структуры, помеченные спец меткой и генерирует для них следующий код:
- http-обёртки для этих методов
- проверку авторизации
- проверки метода (GET/POST)
- валидацию параметров
- заполнение структуры с параметрами метода
- обработку неизвестных ошибок
Работает универсально для любых полей и значений из тех что ему известны.
Кодогенератор умеет обрабатывать следующие типы полей структуры:
int
string
Нам доступны следующие метки валидатора-заполнятора apivalidator
:
required
- поле не должно быть пустым (не должно иметь значение по-умолчанию)paramname
- если указано - то брать из параметра с этим именем, иначеlowercase
от имениenum
- "одно из"default
- если указано и приходит пустое значение (значение по-умолчанию) - устанавливать то что написано указано вdefault
min
- >= X для типаint
, для строкlen(str)
>=max
- <= X для типаint
Авторизация проверяется просто на то что в хедере пришло значение 100500
Сгенерённый код будет иметь примерно такую цепочку
ServeHTTP
- принимает все методы из мультиплексора, если нашлось - вызывает handler$methodName
, если нет - говорит 404
handler$methodName
- обёртка над методом структуры $methodName
- осуществляет все проверки, выводит ошибки или результат в формате JSON
$methodName
- непосредственно метод структуры для которого мы генерируем код и, который парсим. Имеет префикс apigen:api
за которым следует json
с именем метода, типом и требованием авторизации. Его генерировать не нужно, он уже есть.
type SomeStructName struct{}
func (h *SomeStructName ) ServeHTTP(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path {// r.URL.Query().Get("param")
case "...":
h.wrapperDoSomeJob(w, r)
default:
// 404
}
}
func (h *SomeStructName ) wrapperDoSomeJob() {
// заполнение структуры params
// валидирование параметров
res, err := h.DoSomeJob(ctx, params)
// прочие обработки
}
Надо найти все методы, для каждого метода сгенерировать валидацию входящих параметров и прочие проверки в handler$methodName
, для пачки методов структуры сгенерировать обвязку в ServeHTTP
node.Decls
->ast.FuncDecl
- это метод.node.Decls
->ast.GenDecl
->spec.(*ast.TypeSpec)
+currType.Type.(*ast.StructType)
- это структура. она нужна чтобы по ней генерить валидацию для метода, который мы нашли в проедыдущем пункте- https://golang.org/pkg/go/ast/#FuncDecl - тут смотрите к какой структуре относится метод
программа (в файлеhandlers_gen/codegen.go
) потом запускаете её, передавая в качестве параметров путь до файла для которого надо сгенерировать код, и путь до файла, в который записать результат. Запуск будет выглядеть примерно так: go build handlers_gen/* && ./codegen api.go api_handlers.go
. Т.е. запускаться он будет как бинарник_кодогенератора что_парсим.го куда_парсим.го
- example/ - пример с кодогенерацией из 3-й лекции 1-й части курса. Можно этот код взять за основу.
- handlers_gen/codegen.go - сюда вам писать код
- api.go - этот файл вам надо скармливать в кодогенератор. редактировать его не надо
- main.go - тут всё ясно. редактировать не надо
- main_test.go - этот файл надо запускать для тестирования после кодогенерации. редактировать не надо