@@ -15,98 +15,15 @@ func (op RemoveOp) Apply(doc interface{}) (interface{}, error) {
1515 return nil, fmt.Errorf("Cannot remove entire document")
1616 }
1717
18- obj := doc
19- prevUpdate := func(newObj interface{}) { doc = newObj }
20-
21- for i, token := range tokens[1:] {
22- isLast := i == len(tokens)-2
23-
24- switch typedToken := token.(type) {
25- case IndexToken:
26- idx := typedToken.Index
27-
28- typedObj, ok := obj.([]interface{})
29- if !ok {
30- return nil, newOpArrayMismatchTypeErr(tokens[:i+2], obj)
31- }
32-
33- if idx >= len(typedObj) {
34- return nil, opMissingIndexErr{idx, typedObj}
35- }
36-
37- if isLast {
38- var newAry []interface{}
39- newAry = append(newAry, typedObj[:idx]...)
40- newAry = append(newAry, typedObj[idx+1:]...)
41- prevUpdate(newAry)
42- } else {
43- obj = typedObj[idx]
44- prevUpdate = func(newObj interface{}) { typedObj[idx] = newObj }
45- }
46-
47- case MatchingIndexToken:
48- typedObj, ok := obj.([]interface{})
49- if !ok {
50- return nil, newOpArrayMismatchTypeErr(tokens[:i+2], obj)
51- }
52-
53- var idxs []int
54-
55- for itemIdx, item := range typedObj {
56- typedItem, ok := item.(map[interface{}]interface{})
57- if ok {
58- if typedItem[typedToken.Key] == typedToken.Value {
59- idxs = append(idxs, itemIdx)
60- }
61- }
62- }
63-
64- if typedToken.Optional && len(idxs) == 0 {
65- return doc, nil
66- }
67-
68- if len(idxs) != 1 {
69- return nil, opMultipleMatchingIndexErr{NewPointer(tokens[:i+2]), idxs}
70- }
71-
72- idx := idxs[0]
73-
74- if isLast {
75- var newAry []interface{}
76- newAry = append(newAry, typedObj[:idx]...)
77- newAry = append(newAry, typedObj[idx+1:]...)
78- prevUpdate(newAry)
79- } else {
80- obj = typedObj[idx]
81- // no need to change prevUpdate since matching item can only be a map
82- }
83-
84- case KeyToken:
85- typedObj, ok := obj.(map[interface{}]interface{})
86- if !ok {
87- return nil, newOpMapMismatchTypeErr(tokens[:i+2], obj)
88- }
89-
90- var found bool
91-
92- obj, found = typedObj[typedToken.Key]
93- if !found {
94- if typedToken.Optional {
95- return doc, nil
96- }
97-
98- return nil, opMissingMapKeyErr{typedToken.Key, NewPointer(tokens[:i+2]), typedObj}
99- }
100-
101- if isLast {
102- delete(typedObj, typedToken.Key)
103- } else {
104- prevUpdate = func(newObj interface{}) { typedObj[typedToken.Key] = newObj }
105- }
106-
107- default:
108- return nil, opUnexpectedTokenErr{token, NewPointer(tokens[:i+2])}
109- }
18+ _, err := (&tokenContext{
19+ Tokens: tokens,
20+ TokenIndex: 0,
21+ Node: doc,
22+ Setter: func(newObj interface{}) { doc = newObj },
23+ Method: methodRemove,
24+ }).Descend()
25+ if err != nil {
26+ return nil, err
11027 }
11128
11229 return doc, nil
0 commit comments