Final touches

This commit is contained in:
Lea Anthony
2020-11-04 16:55:27 +11:00
parent f4e6fd387f
commit 8a854f000f
5 changed files with 94 additions and 13 deletions

View File

@@ -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 "*"
}
}

View File

@@ -1,16 +1,20 @@
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
{{range .DeclarationReferences}}/// <reference types="../{{.}}" />{{end}}
{{- range .DeclarationReferences}}
/// <reference types="../{{.}}" />{{- 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}}
}

View File

@@ -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
}

View File

@@ -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}}

View File

@@ -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, ", ")
}