-
-
Notifications
You must be signed in to change notification settings - Fork 171
/
args.go
108 lines (91 loc) · 2.24 KB
/
args.go
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//go:build wasm && js
package main
import (
"encoding/json"
"errors"
"syscall/js"
)
type queryArgs struct {
conn js.Value
userID interface{}
query string
vars json.RawMessage
}
// func processArgsWithTx(qa *queryArgs, args []js.Value, argName string) (jsErr js.Value) {
// if len(args) < 1 {
// jsErr = toJSError(errors.New("required argument: transaction/connection"))
// return
// }
// conn := args[0]
// if conn.Type() != js.TypeObject {
// jsErr = toJSError(errors.New("argument missing: transaction/connection"))
// return
// }
// qa.conn = conn
// return processArgs(qa, args[1:], argName)
// }
func processArgs(qa *queryArgs, args []js.Value, argName string) (err js.Value) {
if len(args) < 1 {
err = toJSError(errors.New("required argument: " + argName))
return
}
query := args[0]
if query.Type() != js.TypeString || query.String() == "" {
err = toJSError(errors.New("argument missing: " + argName))
return
}
qa.query = query.String()
return processCommonArgs(qa, args[1:])
}
func processCommonArgs(qa *queryArgs, args []js.Value) (err js.Value) {
if len(args) == 0 {
return
}
vars := args[0]
if vars.Type() != js.TypeObject &&
vars.Type() != js.TypeNull &&
vars.Type() != js.TypeUndefined {
err = toJSError(
errors.New("variables argument can only be a string or null"))
return
}
if vars.Type() == js.TypeObject {
val := js.Global().Get("JSON").Call("stringify", vars)
qa.vars = json.RawMessage(val.String())
}
if len(args) == 1 {
return
}
opts := args[1]
if opts.Type() != js.TypeObject &&
opts.Type() != js.TypeNull &&
opts.Type() != js.TypeUndefined {
err = toJSError(
errors.New("options argument can only be a object or null"))
return
}
if v := opts.Get("userID"); v.Type() == js.TypeString || v.Type() == js.TypeNumber {
qa.userID = optVal(v)
}
return
}
// func toTx(dbType string, val js.Value) *sql.Tx {
// switch dbType {
// case "mysql":
// return sql.Tx(&MyConn{client: val})
// default:
// return = sql.Tx(&MyConn{client: val})
// }
// }
func optVal(val js.Value) interface{} {
switch val.Type() {
case js.TypeString:
return val.String()
case js.TypeNumber:
return val.Int()
case js.TypeBoolean:
return val.Bool()
default:
return js.Null
}
}