161 lines
3.3 KiB
Go
161 lines
3.3 KiB
Go
package lib
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"embed"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
"text/template"
|
|
|
|
"git.ymnuktech.ru/ymnuk/yt-gen-app/structs"
|
|
)
|
|
|
|
//go:embed tmpl/*
|
|
var content embed.FS
|
|
|
|
var funcMap = template.FuncMap{
|
|
"fieldName": fieldName,
|
|
"fieldType": fieldType,
|
|
"fieldDescript": fieldDescript,
|
|
}
|
|
|
|
func fieldName(field *structs.Field) string {
|
|
if field == nil {
|
|
log.Fatal("Field is null")
|
|
}
|
|
field.Name = strings.Trim(field.Name, " ")
|
|
if field.Name == "" {
|
|
log.Fatal("Shoudl be set name for field")
|
|
}
|
|
asRunes := []rune(field.Name)
|
|
|
|
asRunes[0] = []rune(strings.ToUpper(string([]rune(field.Name)[0])))[0]
|
|
field.Name = string(asRunes)
|
|
i := strings.Index(field.Name, "_")
|
|
for i != -1 {
|
|
asRunes := []rune(field.Name)
|
|
if i >= len(field.Name) {
|
|
break
|
|
}
|
|
asRunes[i+1] = []rune(strings.ToUpper(string(asRunes[i+1])))[0]
|
|
asRunes = append(asRunes[:i-1], asRunes[i+1:]...)
|
|
field.Name = string(asRunes)
|
|
i = strings.Index(field.Name, "_")
|
|
}
|
|
return field.Name
|
|
}
|
|
|
|
// Возвращает имя в БД
|
|
func fieldDBName(field *structs.Field) (res string) {
|
|
res = strings.Trim(field.Name, " ")
|
|
if res == "" {
|
|
log.Fatal("Shoudl be set name for field")
|
|
}
|
|
res = strings.ToLower(res)
|
|
return
|
|
}
|
|
|
|
func fieldType(field *structs.Field) string {
|
|
if field == nil {
|
|
log.Fatal("field is empty")
|
|
}
|
|
field.Type = strings.ToLower(strings.Trim(field.Type, " "))
|
|
if field.Type == "" {
|
|
field.Type = "text"
|
|
}
|
|
switch field.Type {
|
|
case "text":
|
|
return "*string"
|
|
case "string":
|
|
return "*string"
|
|
case "int":
|
|
return "*int"
|
|
case "bigint":
|
|
return "*int64"
|
|
default:
|
|
log.Fatalf("Unknow format %s", field.Type)
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func fieldTypeDB(field *structs.Field) string {
|
|
field.Type = strings.ToLower(strings.Trim(field.Type, " "))
|
|
switch field.Type {
|
|
case "text":
|
|
return "TEXT"
|
|
case "string":
|
|
tmp := "VARCHAR"
|
|
if field.Length != nil && *field.Length == 0 {
|
|
tmp += fmt.Sprintf("(%d)", *field.Length)
|
|
} else {
|
|
tmp += "(255)"
|
|
}
|
|
//return "TEXT"
|
|
return tmp
|
|
case "int":
|
|
return "INT"
|
|
case "bigint":
|
|
return "BIGINT"
|
|
default:
|
|
log.Fatalf("Unknow format %s", field.Type)
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Генерирование описания таблиц в БД
|
|
func fieldDescript(field *structs.Field) (str string) {
|
|
// TODO
|
|
str = fmt.Sprintf("`gorm:\"column:%s;type:%s", fieldDBName(field), fieldTypeDB(field))
|
|
field.Description = strings.Trim(field.Description, " ")
|
|
if field.Description != "" {
|
|
str += fmt.Sprintf(";comment:%s", field.Description)
|
|
}
|
|
str += "\"`"
|
|
|
|
return
|
|
}
|
|
|
|
func WriteTmplFile(filename string, outname string) error {
|
|
if buff, err := content.ReadFile(filename); err != nil {
|
|
return err
|
|
} else {
|
|
if err = os.WriteFile(outname, buff, 0755); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Использование шаблона
|
|
func PrepareTmplFile(filename string, data interface{}, outname string) (err error) {
|
|
var (
|
|
buff []byte
|
|
)
|
|
if buff, err = content.ReadFile(filename); err != nil {
|
|
return err
|
|
}
|
|
var (
|
|
tmp string
|
|
tmpl *template.Template
|
|
)
|
|
if tmp, err = RandomHex(4); err != nil {
|
|
return err
|
|
}
|
|
|
|
if tmpl, err = template.New(tmp).Funcs(funcMap).Parse(string(buff)); err != nil {
|
|
return err
|
|
}
|
|
var b bytes.Buffer
|
|
w := bufio.NewWriter(&b)
|
|
|
|
if err = tmpl.Execute(w, data); err != nil {
|
|
return err
|
|
}
|
|
w.Flush()
|
|
os.WriteFile(outname, b.Bytes(), 0755)
|
|
return
|
|
}
|