mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-03 06:20:48 +08:00
164 lines
3.4 KiB
Go
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
|
|
}
|