1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| //go:build js // +build js
package wasm
import ( "fmt" "syscall/js"
"{{{ .Package }}}/app/util" )
func convertArg(arg js.Value) any { switch arg.Type() { case js.TypeString: return arg.String() case js.TypeBoolean: return arg.Bool() case js.TypeNumber: return arg.Float() case js.TypeObject: if arg.Length() > 0 { return arrayFrom(arg) } return valueMapFrom(arg) case js.TypeNull: return nil default: return fmt.Sprintf("unhandled type [%T]", arg) } }
func convertArgs(args []js.Value) []any { if len(args) == 0 { return []any{} } cleanArgs := make([]any, 0, len(args)-1) for _, x := range args[1:] { cleanArgs = append(cleanArgs, convertArg(x)) } return cleanArgs }
func arrayFrom(j js.Value) []any { if j.Type() != js.TypeObject { return []any{"<error>: input is not a JavaScript array"} } result := make([]any, 0, j.Length()) for i := 0; i < j.Length(); i++ { result = append(result, convertArg(j.Index(i))) } return result }
func valueMapFrom(j js.Value) util.ValueMap { if j.Type() != js.TypeObject { return util.ValueMap{"<error>": "input is not a JavaScript object"} } keys := js.Global().Get("Object").Call("keys", j) length := keys.Length() result := make(util.ValueMap, length) for i := 0; i < length; i++ { key := keys.Index(i).String() result[key] = convertArg(j.Get(key)) } return result }
|