forked from ravendb/ravendb-go-client
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjava_script_array.go
61 lines (48 loc) · 1.46 KB
/
java_script_array.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
package ravendb
import (
"fmt"
"strings"
)
// JavaScriptArray builds arguments for patch operation on array fields
type JavaScriptArray struct {
suffix int
argCounter int
pathToArray string
scriptLines []string
Parameters map[string]interface{}
}
// NewJavaScriptArray creates a new JavaScriptArray
func NewJavaScriptArray(suffix int, pathToArray string) *JavaScriptArray {
return &JavaScriptArray{
suffix: suffix,
pathToArray: pathToArray,
Parameters: map[string]interface{}{},
}
}
// Add builds expression that adds an elements to array
func (a *JavaScriptArray) Add(args ...interface{}) *JavaScriptArray {
// TODO: more efficient if len(args) > 1
for _, u := range args {
argumentName := a.getNextArgumentName()
s := "this." + a.pathToArray + ".push(args." + argumentName + ")"
a.scriptLines = append(a.scriptLines, s)
a.Parameters[argumentName] = u
}
return a
}
// RemoveAt builds expression that removes an element at index from array
func (a *JavaScriptArray) RemoveAt(index int) *JavaScriptArray {
argumentName := a.getNextArgumentName()
s := "this." + a.pathToArray + ".splice(args." + argumentName + ", 1)"
a.scriptLines = append(a.scriptLines, s)
a.Parameters[argumentName] = index
return a
}
func (a *JavaScriptArray) getNextArgumentName() string {
s := fmt.Sprintf("val_%d_%d", a.argCounter, a.suffix)
a.argCounter++
return s
}
func (a *JavaScriptArray) GetScript() string {
return strings.Join(a.scriptLines, "\r")
}