mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-05 05:52:33 +08:00
104 lines
2.5 KiB
Go
104 lines
2.5 KiB
Go
package parser
|
|
|
|
import (
|
|
"bytes"
|
|
"embed"
|
|
"github.com/wailsapp/wails/v3/internal/flags"
|
|
"io"
|
|
"sort"
|
|
"strings"
|
|
"text/template"
|
|
)
|
|
|
|
//go:embed templates
|
|
var templates embed.FS
|
|
|
|
type ModelDefinitions struct {
|
|
Package string
|
|
Models map[string]*StructDef
|
|
Enums map[string]*TypeDef
|
|
Imports []*ImportDef
|
|
}
|
|
|
|
func (p *Project) GenerateModel(wr io.Writer, def *ModelDefinitions, options *flags.GenerateBindingsOptions) error {
|
|
templateName := "model.js.tmpl"
|
|
if options.TS {
|
|
templateName = "model.ts.tmpl"
|
|
if options.UseInterfaces {
|
|
templateName = "interfaces.ts.tmpl"
|
|
}
|
|
}
|
|
|
|
// Fix up TS names
|
|
for _, model := range def.Models {
|
|
model.Name = options.TSPrefix + model.Name + options.TSSuffix
|
|
}
|
|
|
|
tmpl, err := template.New(templateName).ParseFS(templates, "templates/"+templateName)
|
|
if err != nil {
|
|
println("Unable to create class template: " + err.Error())
|
|
return err
|
|
}
|
|
|
|
err = tmpl.ExecuteTemplate(wr, templateName, def)
|
|
if err != nil {
|
|
println("Problem executing template: " + err.Error())
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
const modelsHeader = `// @ts-check
|
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
|
// This file is automatically generated. DO NOT EDIT
|
|
`
|
|
|
|
func pkgAlias(fullPkg string) string {
|
|
pkgParts := strings.Split(fullPkg, "/")
|
|
return pkgParts[len(pkgParts)-1]
|
|
}
|
|
|
|
type Model struct {
|
|
Package string
|
|
}
|
|
|
|
func (p *Project) GenerateModels(models map[packagePath]map[structName]*StructDef, enums map[packagePath]map[string]*TypeDef, options *flags.GenerateBindingsOptions) (map[packagePath]string, error) {
|
|
if models == nil && enums == nil {
|
|
return nil, nil
|
|
}
|
|
var result = make(map[packagePath]string)
|
|
|
|
// sort pkgs by alias (e.g. services) instead of full pkg name (e.g. github.com/wailsapp/wails/somedir/services)
|
|
// and then sort resulting list by the alias
|
|
var keys []string
|
|
for pkg := range models {
|
|
keys = append(keys, pkg)
|
|
}
|
|
for pkg := range enums {
|
|
keys = append(keys, pkg)
|
|
}
|
|
|
|
sort.Slice(keys, func(i, j int) bool {
|
|
return pkgAlias(keys[i]) < pkgAlias(keys[j])
|
|
})
|
|
|
|
for _, pkg := range keys {
|
|
var buffer bytes.Buffer
|
|
buffer.WriteString(modelsHeader)
|
|
err := p.GenerateModel(&buffer, &ModelDefinitions{
|
|
Imports: p.calculateImports(pkg, models[pkg]),
|
|
Package: pkgAlias(pkg),
|
|
Models: models[pkg],
|
|
Enums: enums[pkg],
|
|
}, options)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Get the relative package path
|
|
relativePackageDir := p.RelativePackageDir(pkg)
|
|
result[relativePackageDir] = buffer.String()
|
|
}
|
|
return result, nil
|
|
}
|