dico
embedded code generator, text generator from templates and сonfigs
Генератор кода, конфигов, текста на основе преднастроек и шаблонов.
Для запуска генератора следует выполнить следующую команду
dico ./src *.go
В случае языка golang рекомендуется после генерации выполнить форматирование
gofmt -w ./src
gofmt
первым аругментом ./src
указана дириктория с исходным кодом программы.
*.go
указана маска по которой будут анализироваться файлы.
В нашем примере будут подвергнуты все файлы с расширением go
в дириктории src
.
Описание
Положим мы пишем код программы.
Встраиваете в ваш исходный код специальный текст начинающийся с новой строки //dico output_name path_templates [, ...]
. Условно назовем это командой.
output_name
определяет исполняемый шаблон,
один и более path_templates
определяет дириктории с шаблонами.
//dico main templates/golang/*
В момент анализа вашего файла генератор анализирует комманду и генерирует код.
Имеется возможность встраивать настройки для генерируемого кода.
Настройки начинаются и заканчиваются c //config.extension
.
extension
определяет формат настроек. Поддерживается настройки в формате toml).
//config.toml
//pkg = "main"
// errors = ["ErrNotFound", "err not allowed"]
//[values]
// foo="Foo"
// bar="Bar"
//[struct]
//name="FooBarStruct"
// [[struct.fields]]
// comment = "comment"
// name = "Foo"
// type = "string"
// tag = '''json:"Foo"'''
// [[struct.fields]]
// comment = "comment 2"
// name = "Bar"
// type = "string"
//config.toml
После генерации исходная команда и настройки остаются без изменений. Ниже добавляется секция с авто сгенерированным кодом.
Авто сгенерированный код находится в секции начинающийся с //AUTOGENERATE.DICO>>>
и заканчивающийся //<<<AUTOGENERATE.DICO
.
//AUTOGENERATE.DICO>>>
// The text in the section 'AUTOGENERATE.DICO' automatically generated, please do not edit it
//[DICO.VERSION]: 0.0.2
//[DICO.COMMAND]: main templates/golang/*
package main
import (
"fmt"
)
var ErrNotFound = "ErrNotFound"
var ErrNotAllowed = "ErrNotAllowed"
type FooBarStruct struct {
// comment
Foo string `json:"Foo"`
Bar string
}
// SetFoo set Foo
func (f *FooBarStruct) SetFoo(v string) {
f.Foo = v
}
// GetFoo get Foo
func (f *FooBarStruct) GetFoo() v string {
return f.Foo
}
// SetBar set Bar
func (f *FooBarStruct) SetBar(v string) {
f.Bar = v
}
// GetBar get Bar
func (f *FooBarStruct) GetBar() v string {
return f.Bar
}
func main() {
s := &FooBarStruct{"foo", "bar"}
fmt.Printf("%v", s)
}
//<<<AUTOGENERATE.DICO
В секции автосгенерированного кода находится отладочная информация отражающая версию [DICO.VERSION]
генератора и исходную команду [DICO.COMMAND]
.
[DICO.ERRORS.COMPLIE_TEXT]
с описанием ошоибки генерации кода и [DICO.ERRORS.COMPLIE_CONFIG]
с описание ошибки анализа конфига.
Например
//AUTOGENERATE.DICO>>>
// The text in the section 'AUTOGENERATE.DICO' automatically generated, please do not edit it
//[DICO.VERSION]: 0.0.2
//[DICO.COMMAND]: main
//[DICO.ERRORS.COMPLIE_TEXT]: not valid command arguments [main]
//<<<AUTOGENERATE.DICO
Сказано что не верная команда генерации, не валидные аргументы команды.
Установка
$ mkdir -p dico
$ cd dico
$ export GOPATH=$(pwd)
$ go get github.com/gebv/dico
$ tree -L 2
.
├── bin
│ └── dico
...
bin/dico
является бинарным приложением
Рекомендуется добавить дирикторию bin/
в переменную окружения PATH
Шаблоны
Шаблоны это golang template. Для удобства они находятся в различных папках и файлах разбитые по смыслу. Например. Шаблоны необхдоимы для генерации кода. Следует разбить генерируемый код на простые конфигурируемые вставки.
Например для генерации структуры (язык golang)
{{define "struct" }}
{{with .comment }}// {{.name}} {{.comment}}{{end}}
type {{.name}} struct {
{{ range $key, $field := .fields }}
{{with $field.comment}}// {{$field.comment}}{{end}}
{{$field.name}} {{$field.type}} {{template "structtags" $field.tag}}
{{ end }}
}
{{end}}
{{define "structtags" }}{{with .}}`{{.}}`{{end}}{{end}}
Структура ожидает на входе конфиг описывающий
- имя структуры
name
- описание структуры
comment
- описание полей структуры
fields
- каждое поле отражает тип и описание поля
Examples
Errors constants
Генерация констант с различными типами ошибок.
//dico errors
//config.toml
//[[errors]]
//name="not found"
//[[errors]]
//name="unknown"
//message="unknown error"
//comment="unknown error, see details in the log"
//[[errors]]
//name="not allowed"
//[[errors]]
//name="not supported"
//config.toml
Шаблон для генерации.
{{ define "errors" }}
{{range $error := .errors -}}
{{- $message := (or $error.message (toLower $error.name "_"))}}
{{- with $error.comment}}// Err{{$error.name | toUpper}} {{ $error.comment }}.{{ end }}
var Err{{$error.name | toUpper}} = fmt.Errorf("{{$message}}")
{{ end }}
{{ end }}
Результат
var ErrNotFound = fmt.Errorf("not_found")
// ErrUnknown unknown error, see details in the log
var ErrUnknown = fmt.Errorf("unknown error")
var ErrNotAllowed = fmt.Errorf("not_allowed")
var ErrNotSupported = fmt.Errorf("not_supported")
nginx настройки
Генерация настроек nginx по шаблонам
//dico server templates/nginx/*
//config.toml
// listen="8080"
// root="/var/www/site"
// [[locations]]
// path="/images"
// root="/data"
// [[locations]]
// path="/"
// proxy_pass = '127.0.0.1:8081'
//config.toml
//AUTOGENERATE.DICO>>>
// The text in the section 'AUTOGENERATE.DICO' automatically generated, please do not edit it
//[DICO.VERSION]: 0.0.2
//[DICO.COMMAND]: server templates/nginx/*
server {
listen 8080;
location /images {
root /data;
}
location / {
proxy_pass 127.0.0.1:8081;
}
}
//<<<AUTOGENERATE.DICO
TODO
- Автогенерация документации по шаблонам (парсить define из шаблонов и брать комментарии)