feat: new parser & generator

This commit is contained in:
2025-03-09 13:12:12 +07:00
parent 70fc3345d8
commit a3283b9a57
25 changed files with 372 additions and 301 deletions

View File

@@ -2,18 +2,18 @@ package generation
import (
"log"
"nto_cli/entities"
"nto_cli/model"
"nto_cli/utils"
"os"
"path/filepath"
"strings"
)
func Generate(structName string, fields []entities.Field) {
mkPath := filepath.Join(utils.FindFrontendPath(), strings.ToLower(structName))
func Generate(model *model.Model) {
mkPath := filepath.Join(utils.FindFrontendPath(), strings.ToLower(model.Name))
if err := os.Mkdir(mkPath, 0755); err != nil {
log.Fatalf("Failed to mkdir for model: %s", err)
}
GenerateService(structName, mkPath)
GenerateScheme(structName, fields, mkPath)
GenerateService(model, mkPath)
GenerateScheme(model, mkPath)
}

View File

@@ -4,7 +4,7 @@ import (
_ "embed"
"fmt"
"log"
"nto_cli/entities"
"nto_cli/model"
"nto_cli/utils"
"os"
"path/filepath"
@@ -28,20 +28,20 @@ type TemplateData struct {
StructName string
LowerName string
GolangServicesPath string
Fields []entities.Field
Fields []model.Field
Dependencies []Dependency
}
func GenerateScheme(structName string, fields []entities.Field, mkPath string) {
func GenerateScheme(model *model.Model, mkPath string) {
data := TemplateData{
StructName: structName,
LowerName: strings.ToLower(structName),
StructName: model.Name,
LowerName: strings.ToLower(model.Name),
GolangServicesPath: GolangServicesPath,
Fields: fields,
Dependencies: processDependencies(fields),
Fields: model.Fields,
Dependencies: processDependencies(model.Fields),
}
schemeFilename := strings.ToUpper(structName[:1]) + strings.ToLower(structName[1:]) + "Scheme.vue"
schemeFilename := strings.ToUpper(model.Name[:1]) + strings.ToLower(model.Name[1:]) + "Scheme.vue"
schemeFilePath := filepath.Join(mkPath, schemeFilename)
schemeFile, err := os.Create(schemeFilePath)
if err != nil {
@@ -63,25 +63,25 @@ func GenerateScheme(structName string, fields []entities.Field, mkPath string) {
if err != nil {
log.Fatalf("Failed to execute template: %s", err)
}
log.Printf("Scheme for `%s` model is written: %s", structName, schemeFilePath)
log.Printf("Scheme for `%s` model is written: %s", model.Name, schemeFilePath)
_ = utils.FormatFilesWithPrettier([]string{schemeFilePath})
}
func processDependencies(fields []entities.Field) []Dependency {
func processDependencies(fields []model.Field) []Dependency {
var dependencies []Dependency
for _, field := range fields {
for _, meta := range field.Metadata {
if meta.Name == "data" {
dependency := meta.Values[0]
dependencies = append(dependencies, Dependency{
ImportName: strings.ToUpper(dependency[:1]) + strings.ToLower(dependency[1:]) + "Service",
ServiceName: strings.ToLower(dependency) + "Service",
LowerName: strings.ToLower(dependency),
FieldName: field.Name,
})
}
dependency := field.Metadata.RelatedModel
if dependency == "" {
continue
}
dependencies = append(dependencies, Dependency{
ImportName: strings.ToUpper(dependency[:1]) + strings.ToLower(dependency[1:]) + "Service",
ServiceName: strings.ToLower(dependency) + "Service",
LowerName: strings.ToLower(dependency),
FieldName: field.Name,
})
}
return dependencies

View File

@@ -4,6 +4,7 @@ import (
_ "embed"
"fmt"
"log"
"nto_cli/model"
"nto_cli/utils"
"os"
"path/filepath"
@@ -20,8 +21,8 @@ type ServiceTemplateContext struct {
ServicesPath string
}
func GenerateService(structName, mkPath string) {
servicePath := filepath.Join(mkPath, strings.ToLower(structName)+".service.ts")
func GenerateService(model *model.Model, mkPath string) {
servicePath := filepath.Join(mkPath, strings.ToLower(model.Name)+".service.ts")
serviceFile, err := os.Create(servicePath)
if err != nil {
log.Fatalf("Failed to create service file: %s", err)
@@ -35,8 +36,8 @@ func GenerateService(structName, mkPath string) {
}(serviceFile)
context := ServiceTemplateContext{
LowerModelName: strings.ToLower(structName),
ModelName: structName,
LowerModelName: strings.ToLower(model.Name),
ModelName: model.Name,
ServicesPath: GolangServicesPath,
}
@@ -50,6 +51,6 @@ func GenerateService(structName, mkPath string) {
if err != nil {
log.Fatalf("Failed to execute template: %s", err)
}
log.Printf("Service for `%s` model is written: %s", structName, servicePath)
log.Printf("Service for `%s` model is written: %s", model.Name, servicePath)
_ = utils.FormatFilesWithPrettier([]string{servicePath})
}

View File

@@ -20,7 +20,7 @@ onMounted(async () => {
const scheme: Scheme<{{.StructName}}> = reactive({
{{range .Fields}}
{{.Name}}: {{.Generate}},
{{.Name}}: {{.GenerateFieldCode}},
{{end}}
})
@@ -32,4 +32,4 @@ const getDefaults = () => getDefaultValues(scheme)
<main class="w-screen h-screen">
<Table :scheme :service :getDefaults></Table>
</main>
</template>
</template>