github.com/ravendb/ravendb-go-client@v0.0.0-20240229102137-4474ee7aa0fa/java_script_array.go (about) 1 package ravendb 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 // JavaScriptArray builds arguments for patch operation on array fields 9 type JavaScriptArray struct { 10 suffix int 11 argCounter int 12 13 pathToArray string 14 15 scriptLines []string 16 Parameters map[string]interface{} 17 } 18 19 // NewJavaScriptArray creates a new JavaScriptArray 20 func NewJavaScriptArray(suffix int, pathToArray string) *JavaScriptArray { 21 return &JavaScriptArray{ 22 suffix: suffix, 23 pathToArray: pathToArray, 24 Parameters: map[string]interface{}{}, 25 } 26 } 27 28 // Add builds expression that adds an elements to array 29 func (a *JavaScriptArray) Add(args ...interface{}) *JavaScriptArray { 30 // TODO: more efficient if len(args) > 1 31 for _, u := range args { 32 argumentName := a.getNextArgumentName() 33 34 s := "this." + a.pathToArray + ".push(args." + argumentName + ")" 35 a.scriptLines = append(a.scriptLines, s) 36 a.Parameters[argumentName] = u 37 } 38 39 return a 40 } 41 42 // RemoveAt builds expression that removes an element at index from array 43 func (a *JavaScriptArray) RemoveAt(index int) *JavaScriptArray { 44 argumentName := a.getNextArgumentName() 45 46 s := "this." + a.pathToArray + ".splice(args." + argumentName + ", 1)" 47 a.scriptLines = append(a.scriptLines, s) 48 a.Parameters[argumentName] = index 49 50 return a 51 } 52 53 func (a *JavaScriptArray) getNextArgumentName() string { 54 s := fmt.Sprintf("val_%d_%d", a.argCounter, a.suffix) 55 a.argCounter++ 56 return s 57 } 58 59 func (a *JavaScriptArray) GetScript() string { 60 return strings.Join(a.scriptLines, "\r") 61 }