Skip to content

Commit 521e3e7

Browse files
chillandbuger
authored andcommitted
Add additional support for array indexing in Set
1 parent 6046d92 commit 521e3e7

File tree

2 files changed

+69
-11
lines changed

2 files changed

+69
-11
lines changed

parser.go

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"fmt"
77
"math"
88
"strconv"
9-
"strings"
109
)
1110

1211
// Errors
@@ -564,23 +563,42 @@ var (
564563

565564
func createInsertComponent(keys []string, setValue []byte, comma, object bool) []byte {
566565
var buffer bytes.Buffer
566+
isIndex := string(keys[0][0]) == "["
567567
if comma {
568568
buffer.WriteString(",")
569569
}
570-
if object {
571-
buffer.WriteString("{")
570+
if isIndex {
571+
buffer.WriteString("[")
572+
} else {
573+
if object {
574+
buffer.WriteString("{")
575+
}
576+
buffer.WriteString("\"")
577+
buffer.WriteString(keys[0])
578+
buffer.WriteString("\":")
572579
}
573-
buffer.WriteString("\"")
574-
buffer.WriteString(keys[0])
575-
buffer.WriteString("\":")
580+
576581
for i := 1; i < len(keys); i++ {
577-
buffer.WriteString("{\"")
578-
buffer.WriteString(keys[i])
579-
buffer.WriteString("\":")
582+
if string(keys[i][0]) == "[" {
583+
buffer.WriteString("[")
584+
} else {
585+
buffer.WriteString("{\"")
586+
buffer.WriteString(keys[i])
587+
buffer.WriteString("\":")
588+
}
580589
}
581590
buffer.Write(setValue)
582-
buffer.WriteString(strings.Repeat("}", len(keys)-1))
583-
if object {
591+
for i := len(keys) - 1; i > 0; i-- {
592+
if string(keys[i][0]) == "[" {
593+
buffer.WriteString("]")
594+
} else {
595+
buffer.WriteString("}")
596+
}
597+
}
598+
if isIndex {
599+
buffer.WriteString("]")
600+
}
601+
if object && !isIndex {
584602
buffer.WriteString("}")
585603
}
586604
return buffer.Bytes()

parser_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,46 @@ var setTests = []SetTest{
328328
isFound: true,
329329
data: `{"a":"b":"d"}`,
330330
},
331+
{
332+
desc: "set indexed path to object on empty JSON",
333+
json: `{}`,
334+
path: []string{"top", "[0]", "middle", "[0]", "bottom"},
335+
setData: `"value"`,
336+
isFound: true,
337+
data: `{"top":[{"middle":[{"bottom":"value"}]}]}`,
338+
},
339+
{
340+
desc: "set indexed path on existing object with object",
341+
json: `{"top":[{"middle":[]}]}`,
342+
path: []string{"top", "[0]", "middle", "[0]", "bottom"},
343+
setData: `"value"`,
344+
isFound: true,
345+
data: `{"top":[{"middle":[{"bottom":"value"}]}]}`,
346+
},
347+
{
348+
desc: "set indexed path on existing object with value",
349+
json: `{"top":[{"middle":[]}]}`,
350+
path: []string{"top", "[0]", "middle", "[0]"},
351+
setData: `"value"`,
352+
isFound: true,
353+
data: `{"top":[{"middle":["value"]}]}`,
354+
},
355+
{
356+
desc: "set indexed path on empty object with value",
357+
json: `{}`,
358+
path: []string{"top", "[0]", "middle", "[0]"},
359+
setData: `"value"`,
360+
isFound: true,
361+
data: `{"top":[{"middle":["value"]}]}`,
362+
},
363+
{
364+
desc: "set indexed path on object with existing array",
365+
json: `{"top":["one", "two", "three"]}`,
366+
path: []string{"top", "[2]"},
367+
setData: `"value"`,
368+
isFound: true,
369+
data: `{"top":["one", "two", "value"]}`,
370+
},
331371
}
332372

333373
var getTests = []GetTest{

0 commit comments

Comments
 (0)