This repository has been archived by the owner on Jul 1, 2022. It is now read-only.
/
js.go
118 lines (99 loc) · 2.2 KB
/
js.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
109
110
111
112
113
114
115
116
117
118
// +build js,wasm
package main
import (
"errors"
"syscall/js"
"github.com/genjidb/genji/document"
)
func jsValuesToParams(values []js.Value) ([]interface{}, error) {
params := make([]interface{}, len(values))
for i, value := range values {
vv, err := jsValueToParam(value)
if err != nil {
return nil, err
}
params[i] = vv
}
return params, nil
}
func jsValueToParam(value js.Value) (interface{}, error) {
var v interface{}
switch value.Type() {
case js.TypeNull:
v = nil
case js.TypeBoolean:
v = value.Bool()
case js.TypeString:
v = value.String()
case js.TypeNumber:
v = value.Float()
case js.TypeObject:
keys := value.Get("_keys")
// array
if keys.IsUndefined() {
vb := document.NewValueBuffer()
for i := 0; i < value.Length(); i++ {
p, err := jsValueToParam(value.Index(i))
if err != nil {
return nil, err
}
vv, err := document.NewValue(p)
if err != nil {
return nil, err
}
vb = vb.Append(vv)
}
return vb, nil
}
// object
object := value.Get("_object")
fb := document.NewFieldBuffer()
for i := 0; i < keys.Length(); i++ {
k := keys.Index(i).String()
p, err := jsValueToParam(object.Get(k))
if err != nil {
return nil, err
}
vv, err := document.NewValue(p)
if err != nil {
return nil, err
}
fb.Add(k, vv)
}
v = fb
default:
return nil, errors.New("incompatible value " + value.String())
}
return v, nil
}
func jsArrayToSlice(a js.Value) []js.Value {
values := make([]js.Value, a.Length())
for i := 0; i < a.Length(); i++ {
values[i] = a.Index(i)
}
return values
}
func genjiValuesToJs(v document.Value) (interface{}, error) {
switch v.Type {
case document.ArrayValue:
var arr []interface{}
err := v.V.(document.Array).Iterate(func(i int, value document.Value) error {
vv, err := genjiValuesToJs(value)
if err != nil {
return err
}
arr = append(arr, vv)
return nil
})
return arr, err
case document.DocumentValue:
m := make(map[string]interface{})
err := v.V.(document.Document).Iterate(func(field string, value document.Value) error {
var err error
m[field], err = genjiValuesToJs(value)
return err
})
return m, err
}
return v.V, nil
}