From 7395354ae212a1fdfb22d2830ed29a53818fd3d8 Mon Sep 17 00:00:00 2001 From: gogacoder Date: Sat, 8 Mar 2025 13:42:11 +0700 Subject: [PATCH] feat: generate schema from template --- entities/field.go | 6 +- generation/scheme.go | 105 ++++++++++++++---------------- generation/service.go | 4 +- generation/templates/scheme.tmpl | 35 ++++++++++ generation/templates/service.tmpl | 27 ++++++++ utils/imports.go | 5 -- utils/split_struct_field.go | 2 +- 7 files changed, 116 insertions(+), 68 deletions(-) create mode 100644 generation/templates/scheme.tmpl create mode 100644 generation/templates/service.tmpl diff --git a/entities/field.go b/entities/field.go index 6368da7..79eeb3d 100644 --- a/entities/field.go +++ b/entities/field.go @@ -9,7 +9,7 @@ import ( type Field struct { Name string Type string - Medatada []Metadata + Metadata []Metadata } var PrimitiveTypes = map[string]string{ @@ -47,7 +47,7 @@ func (f *Field) GenerateType() string { result += fmt.Sprintf(` primitive: "%s",`, PrimitiveTypes[strings.ToLower(f.Type)]) } else { var field = "[]" - for _, meta := range f.Medatada { + for _, meta := range f.Metadata { if meta.Name == "field" { if len(meta.Values) > 0 { field = "['" + strings.Join(meta.Values, "', '") + "']" @@ -65,7 +65,7 @@ func (f *Field) GenerateType() string { func (f *Field) Generate() string { result := "{\n" - for _, meta := range f.Medatada { + for _, meta := range f.Metadata { if meta.Name == "hidden" { result += " hidden: true,\n" } else if meta.Name == "label" { diff --git a/generation/scheme.go b/generation/scheme.go index a5754a0..8068003 100644 --- a/generation/scheme.go +++ b/generation/scheme.go @@ -1,87 +1,78 @@ package generation import ( + _ "embed" "fmt" "log" "nto_cli/entities" - "nto_cli/utils" "os" "strings" + "text/template" ) +//go:embed templates/scheme.tmpl +var SchemeTemplate string + +const GolangServicesPath = "../../bindings/app/internal/services" + +type Dependency struct { + ImportName string + ServiceName string + LowerName string + FieldName string +} + +type TemplateData struct { + StructName string + LowerName string + GolangServicesPath string + Fields []entities.Field + Dependencies []Dependency +} + func GenerateScheme(structName string, fields []entities.Field, mkPath string) { - schemeFile, err := os.Create(mkPath + "/" + strings.ToUpper(structName[:1]) + strings.ToLower(structName[1:]) + "Scheme.vue") - defer schemeFile.Close() + data := TemplateData{ + StructName: structName, + LowerName: strings.ToLower(structName), + GolangServicesPath: GolangServicesPath, + Fields: fields, + Dependencies: processDependencies(fields), + } + + fileName := strings.ToUpper(structName[:1]) + strings.ToLower(structName[1:]) + "Scheme.vue" + schemeFile, err := os.Create(mkPath + "/" + fileName) if err != nil { log.Fatalf("Failed to create file: %s", err) } + defer schemeFile.Close() - _, err = schemeFile.WriteString(fmt.Sprintf( - ` - - -`, strings.ToLower(structName), structName, utils.GetServiceStructType(structName), LoadDependencies(fields), structName, GenerateFields(fields))) + tmpl, err := template.New("scheme").Parse(SchemeTemplate) if err != nil { - log.Fatalf("Failed to write to file: %s", err) + panic(fmt.Sprintf("Failed to parse template: %s", err)) + } + + err = tmpl.Execute(schemeFile, data) + if err != nil { + log.Fatalf("Failed to execute template: %s", err) } } -func GenerateFields(fields []entities.Field) string { - result := "{\n" - for _, field := range fields { - result += field.Name + ":" + field.Generate() + ", \n" - } - return result + "\n}" -} +func processDependencies(fields []entities.Field) []Dependency { + dependencies := []Dependency{} -func LoadDependencies(fields []entities.Field) string { - type Dependency struct { - fieldName string - dependencyName string - } - - result := "" - var dependencies []Dependency for _, field := range fields { - for _, meta := range field.Medatada { + for _, meta := range field.Metadata { if meta.Name == "data" { dependency := meta.Values[0] dependencies = append(dependencies, Dependency{ - fieldName: field.Name, - dependencyName: dependency, + ImportName: strings.ToUpper(dependency[:1]) + strings.ToLower(dependency[1:]) + "Service", + ServiceName: strings.ToLower(dependency) + "Service", + LowerName: strings.ToLower(dependency), + FieldName: field.Name, }) - result += fmt.Sprintf("import %sService from '../%s/%s.service.ts'\n", dependency, strings.ToLower(dependency), strings.ToLower(dependency)) - result += fmt.Sprintf("const %sService = new %sService\n", strings.ToLower(dependency), strings.ToUpper(dependency[:1])+strings.ToLower(dependency[1:])) } } } - insertIntoScheme := "" - for _, dep := range dependencies { - insertIntoScheme += fmt.Sprintf("(scheme as any).%s.type!.nested!.values = await %sService.readAll()\n", dep.fieldName, strings.ToLower(dep.dependencyName)) - } - result += fmt.Sprintf(`onMounted(async () => { - %s -})`+"\n", insertIntoScheme) - return result + return dependencies } diff --git a/generation/service.go b/generation/service.go index b758f5a..07a3abb 100644 --- a/generation/service.go +++ b/generation/service.go @@ -18,7 +18,7 @@ func GenerateService(structName, mkPath string) { `import { GetAll, Create, Delete, GetById, Update, Count } from "%s" import type { %s } from "%s" import type { IService } from "%s" - + export default class %sService implements IService<%s> { async read(id: number) { return await GetById(id) as %s @@ -44,7 +44,7 @@ export default class %sService implements IService<%s> { return await Count() } } -`, utils.GetServiceBindPath(structName), structName, utils.GetServiceStructType(structName), utils.GetServiceType(), structName, structName, structName, structName, structName, structName)) +`, utils.GetServiceBindPath(structName), structName, GolangServicesPath, utils.GetServiceType(), structName, structName, structName, structName, structName, structName)) if err != nil { log.Fatalf("Failed to write to file: %s", err) } diff --git a/generation/templates/scheme.tmpl b/generation/templates/scheme.tmpl new file mode 100644 index 0000000..2639788 --- /dev/null +++ b/generation/templates/scheme.tmpl @@ -0,0 +1,35 @@ + + + \ No newline at end of file diff --git a/generation/templates/service.tmpl b/generation/templates/service.tmpl new file mode 100644 index 0000000..bb081a9 --- /dev/null +++ b/generation/templates/service.tmpl @@ -0,0 +1,27 @@ +import { GetAll, Create, Delete, GetById, Update, Count } from "../../bindings/app/internal/services/authorservice.ts" +import type { Author } from "../../bindings/app/internal/services/models.ts" +import type { IService } from "../types/service.type.ts" + +export default class AuthorService implements IService { + async read(id: number) { + return await GetById(id) + } + + async readAll() { + return await GetAll() as Author[] + } + + async create(item: Author) { + await Create(item) + } + + async delete(id: number) { + return await Delete(id) + } + async update(item: Author) { + await Update(item) + } + async count() { + return await Count() + } +} diff --git a/utils/imports.go b/utils/imports.go index f34a7b1..4db647f 100644 --- a/utils/imports.go +++ b/utils/imports.go @@ -10,11 +10,6 @@ func GetServiceBindPath(structName string) string { return path } -func GetServiceStructType(structName string) string { - path := "../../bindings/app/internal/services/models.ts" - return path -} - func GetServiceType() string { path := "../types/service.type.ts" return path diff --git a/utils/split_struct_field.go b/utils/split_struct_field.go index 92675d6..2c522a0 100644 --- a/utils/split_struct_field.go +++ b/utils/split_struct_field.go @@ -53,7 +53,7 @@ func SplitStructField(field string) (*entities.Field, error) { name := data[0] dataType := data[1] return &entities.Field{ - Medatada: metadata, + Metadata: metadata, Type: dataType, Name: name, }, nil