Skip to content

adnilote/codeGen

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

Кодогенератор, который ищет методы структуры, помеченные спец меткой и генерирует для них следующий код:

  • http-обёртки для этих методов
  • проверку авторизации
  • проверки метода (GET/POST)
  • валидацию параметров
  • заполнение структуры с параметрами метода
  • обработку неизвестных ошибок

Работает универсально для любых полей и значений из тех что ему известны.

Кодогенератор умеет обрабатывать следующие типы полей структуры:

  • int
  • string

Нам доступны следующие метки валидатора-заполнятора apivalidator:

  • required - поле не должно быть пустым (не должно иметь значение по-умолчанию)
  • paramname - если указано - то брать из параметра с этим именем, иначе lowercase от имени
  • enum - "одно из"
  • default - если указано и приходит пустое значение (значение по-умолчанию) - устанавливать то что написано указано в default
  • min - >= X для типа int, для строк len(str) >=
  • max - <= X для типа int

Авторизация проверяется просто на то что в хедере пришло значение 100500

Cтруктура кодогенератора

Сгенерённый код будет иметь примерно такую цепочку

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

Что парсится в ast:

  • 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 - этот файл надо запускать для тестирования после кодогенерации. редактировать не надо

About

Кодогенератор

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages