5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-03 06:20:48 +08:00
wails/v2/pkg/commands/build/internal/backendjs/packages.go
2020-10-30 15:49:22 +11:00

164 lines
3.4 KiB
Go

package backendjs
import (
"bytes"
"io/ioutil"
"reflect"
"text/template"
"github.com/pkg/errors"
"github.com/wailsapp/wails/v2/internal/fs"
)
// Package defines a single package that contains bound structs
type Package struct {
Name string
Comments []string
Methods []*Method
}
func generatePackages() error {
packages, err := parsePackages()
if err != nil {
return errors.Wrap(err, "Error parsing struct packages:")
}
err = generatePackageFiles(packages)
if err != nil {
return errors.Wrap(err, "Error generating struct js file:")
}
return nil
}
func parsePackages() ([]*Package, error) {
// STUB!
var result []*Package
result = append(result, &Package{
Name: "mypackage",
Comments: []string{"mypackage is awesome"},
Methods: []*Method{
{
Name: "Naked",
Comments: []string{"Naked is a method that does nothing"},
},
},
})
result = append(result, &Package{
Name: "otherpackage",
Comments: []string{"otherpackage is awesome"},
Methods: []*Method{
{
Name: "OneInput",
Comments: []string{"OneInput does stuff"},
Inputs: []*Parameter{
{
Name: "name",
Type: reflect.String,
},
},
},
{
Name: "TwoInputs",
Inputs: []*Parameter{
{
Name: "name",
Type: reflect.String,
},
{
Name: "age",
Type: reflect.Uint8,
},
},
},
{
Name: "TwoInputsAndOutput",
Inputs: []*Parameter{
{
Name: "name",
Type: reflect.String,
},
{
Name: "age",
Type: reflect.Uint8,
},
},
Outputs: []*Parameter{
{
Name: "result",
Type: reflect.Bool,
},
},
},
},
})
return result, nil
}
func generatePackageFiles(packages []*Package) error {
// Get path to local file
javascriptTemplateFile := fs.RelativePath("./package.template")
// Load javascript template
javascriptTemplateData := fs.MustLoadString(javascriptTemplateFile)
javascriptTemplate, err := template.New("javascript").Parse(javascriptTemplateData)
if err != nil {
return errors.Wrap(err, "Error creating template")
}
// Get path to local file
typescriptTemplateFile := fs.RelativePath("./package.d.template")
// Load typescript template
typescriptTemplateData := fs.MustLoadString(typescriptTemplateFile)
typescriptTemplate, err := template.New("typescript").Parse(typescriptTemplateData)
if err != nil {
return errors.Wrap(err, "Error creating template")
}
// Iterate over each package
for _, thisPackage := range packages {
// Calculate target directory
packageFile, err := fs.RelativeToCwd("./frontend/backend/" + thisPackage.Name)
if err != nil {
return errors.Wrap(err, "Error calculating package path")
}
// Execute javascript template
var buffer bytes.Buffer
err = javascriptTemplate.Execute(&buffer, thisPackage)
if err != nil {
return errors.Wrap(err, "Error generating code")
}
// Save javascript file
err = ioutil.WriteFile(packageFile+".js", buffer.Bytes(), 0755)
if err != nil {
return errors.Wrap(err, "Error writing backend package file")
}
// Clear buffer
buffer.Reset()
// Execute typescript template
err = typescriptTemplate.Execute(&buffer, thisPackage)
if err != nil {
return errors.Wrap(err, "Error generating code")
}
// Save typescript file
err = ioutil.WriteFile(packageFile+".d.ts", buffer.Bytes(), 0755)
if err != nil {
return errors.Wrap(err, "Error writing backend package file")
}
}
return nil
}