From 8a854f000fc2695546858582a5426914734baab3 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Wed, 4 Nov 2020 16:55:27 +1100 Subject: [PATCH] Final touches --- .../build/internal/backendjs/conversion.go | 16 +++++++----- .../internal/backendjs/package.d.template | 16 +++++++----- .../build/internal/backendjs/package.go | 25 ++++++++++++++++++ .../build/internal/backendjs/package.template | 24 +++++++++++++++++ .../build/internal/backendjs/struct.go | 26 +++++++++++++++++++ 5 files changed, 94 insertions(+), 13 deletions(-) create mode 100644 v2/pkg/commands/build/internal/backendjs/package.template diff --git a/v2/pkg/commands/build/internal/backendjs/conversion.go b/v2/pkg/commands/build/internal/backendjs/conversion.go index 0885104f..2d3abbf0 100644 --- a/v2/pkg/commands/build/internal/backendjs/conversion.go +++ b/v2/pkg/commands/build/internal/backendjs/conversion.go @@ -20,23 +20,25 @@ const ( JsUnsupported = "*" ) -func goTypeToJS(input string) JSType { - switch input { +func goTypeToJS(input *Field) string { + switch input.Type { case "string": - return JsString + return "string" case "int", "int8", "int16", "int32", "int64", "uint", "uint8", "uint16", "uint32", "uint64": - return JsInt + return "number" case "float32", "float64": - return JsFloat + return "number" case "bool": - return JsBoolean + return "boolean" // case reflect.Array, reflect.Slice: // return JsArray // case reflect.Ptr, reflect.Struct, reflect.Map, reflect.Interface: // return JsObject + case "struct": + return input.Struct.ToString() default: println("UNSUPPORTED: ", input) - return JsUnsupported + return "*" } } diff --git a/v2/pkg/commands/build/internal/backendjs/package.d.template b/v2/pkg/commands/build/internal/backendjs/package.d.template index 47b98e44..4dfd92b5 100644 --- a/v2/pkg/commands/build/internal/backendjs/package.d.template +++ b/v2/pkg/commands/build/internal/backendjs/package.d.template @@ -1,16 +1,20 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT -{{range .DeclarationReferences}}/// {{end}} + +{{- range .DeclarationReferences}} +/// {{- end}} + declare module {{.Name}} { {{range .Structs}} {{if .Comments }}{{range .Comments}}// {{ . }}{{end}}{{end}} interface {{.Name}} { {{ if $.StructIsUsedAsData .Name }} - {{range .Fields}}{{if .Comments }} + {{- range .Fields}}{{if .Comments }} {{range .Comments}}//{{ . }}{{end}}{{end}} - {{.Name}}: {{.TypeAsTSType}}; {{end}} {{ end }} - {{range .Methods}} - {{if .Comments }}{{range .Comments}}// {{ . }}{{end}}{{end}} + {{.Name}}: {{.TypeAsTSType}}; {{- end}} {{ end }} + {{- range .Methods}} + {{- range .Comments}} + // {{ . }}{{- end}} {{.Name}}({{.InputsAsTSText}}): Promise<{{.OutputsAsTSText}}>; - {{end}} + {{- end}} }{{end}} } \ No newline at end of file diff --git a/v2/pkg/commands/build/internal/backendjs/package.go b/v2/pkg/commands/build/internal/backendjs/package.go index 2629711e..d05376ab 100644 --- a/v2/pkg/commands/build/internal/backendjs/package.go +++ b/v2/pkg/commands/build/internal/backendjs/package.go @@ -120,6 +120,31 @@ func generatePackage(pkg *Package, moduledir string) error { if err != nil { return errors.Wrap(err, "Error writing backend package file") } + + // 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") + } + + // Reset the buffer + buffer.Reset() + + err = javascriptTemplate.Execute(&buffer, pkg) + if err != nil { + return errors.Wrap(err, "Error generating code") + } + + // Save javascript file + err = ioutil.WriteFile(filepath.Join(moduledir, "index.js"), buffer.Bytes(), 0755) + if err != nil { + return errors.Wrap(err, "Error writing backend package file") + } + return nil } diff --git a/v2/pkg/commands/build/internal/backendjs/package.template b/v2/pkg/commands/build/internal/backendjs/package.template new file mode 100644 index 00000000..e5d32a57 --- /dev/null +++ b/v2/pkg/commands/build/internal/backendjs/package.template @@ -0,0 +1,24 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +{{range $struct := .Structs }} {{ if .Methods }} +export const {{.Name}} = { +{{range .Methods }} + /**{{if .Comments }} +{{range .Comments}} * {{ . }}{{end}} + *{{end}} + * @function {{.Name}} +{{range .Inputs}} * @param {{"{"}}{{.JSType}}{{"}"}} {{.Name}} +{{end}} * + * @returns {Promise<{{.OutputsAsTSText}}>} + */ + {{.Name}}: function({{.InputsAsJSText}}) { + return window.backend.{{$.Name}}.{{$struct.Name}}.{{.Name}}({{.InputsAsJSText}}); + }, +{{end}} +} +{{end}} +{{end}} + + + diff --git a/v2/pkg/commands/build/internal/backendjs/struct.go b/v2/pkg/commands/build/internal/backendjs/struct.go index b04cee72..33e9738a 100644 --- a/v2/pkg/commands/build/internal/backendjs/struct.go +++ b/v2/pkg/commands/build/internal/backendjs/struct.go @@ -29,6 +29,15 @@ type StructName struct { Package string } +// ToString returns a text representation of the struct name +func (s *StructName) ToString() string { + result := "" + if s.Package != "" { + result = s.Package + "." + } + return result + s.Name +} + // Field defines a parsed struct field type Field struct { Name string @@ -37,6 +46,11 @@ type Field struct { Comments []string } +// JSType returns the Javascript type for this field +func (f *Field) JSType() string { + return goTypeToJS(f) +} + // TypeAsTSType converts the Field type to something TS wants func (f *Field) TypeAsTSType() string { var result = "" @@ -204,3 +218,15 @@ func (m *Method) OutputsAsTSText() string { } return strings.Join(result, ", ") } + +// InputsAsJSText generates a string with the method inputs +// formatted in a way acceptable to Javascript +func (m *Method) InputsAsJSText() string { + var inputs []string + + for _, input := range m.Inputs { + inputs = append(inputs, input.Name) + } + + return strings.Join(inputs, ", ") +}