5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-05 05:52:33 +08:00
wails/v3/internal/parser/models.go
Lea Anthony 2bb25b12ff
Update bindings generator to generate bindings in packages and files.
Remove unused JavaScript files
Update tests.
Update v3 docs
2023-12-22 20:01:42 +11:00

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
}