Skip to content

Commit e99d0ef

Browse files
author
Olli Raula
committed
Add support for delete by value
1 parent 78cf029 commit e99d0ef

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

patch.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ var (
2424
// AccumulatedCopySizeLimit limits the total size increase in bytes caused by
2525
// "copy" operations in a patch.
2626
AccumulatedCopySizeLimit int64 = 0
27+
// SupportDeleteByValue decides whether to support non-standard practice of
28+
// allowing deleting from array with value.
29+
SupportDeleteByValue bool = true
2730
)
2831

2932
var (
@@ -505,6 +508,16 @@ func (d *partialArray) remove(key string) error {
505508

506509
}
507510

511+
func (d *partialArray) removeByValue(key *lazyNode) error {
512+
for i, v := range *d {
513+
if key.equal(v) {
514+
return d.remove(strconv.Itoa(i))
515+
}
516+
}
517+
518+
return errors.Wrapf(ErrInvalidIndex, "value not found")
519+
}
520+
508521
func (p Patch) add(doc *container, op Operation) error {
509522
path, err := op.Path()
510523
if err != nil {
@@ -537,7 +550,18 @@ func (p Patch) remove(doc *container, op Operation) error {
537550
return errors.Wrapf(ErrMissing, "remove operation does not apply: doc is missing path: \"%s\"", path)
538551
}
539552

540-
err = con.remove(key)
553+
if key == "-" && SupportDeleteByValue {
554+
value := op.value()
555+
switch v := con.(type) {
556+
case *partialArray:
557+
err = v.removeByValue(value)
558+
default:
559+
return errors.Wrapf(ErrInvalid, "cannot delete by value from a non-array")
560+
}
561+
} else {
562+
err = con.remove(key)
563+
}
564+
541565
if err != nil {
542566
return errors.Wrapf(err, "error in remove for path: '%s'", path)
543567
}

patch_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,21 @@ var Cases = []Case{
9090
`[ { "op": "remove", "path": "/foo/1" } ]`,
9191
`{ "foo": [ "bar", "baz" ] }`,
9292
},
93+
{
94+
`{ "foo": [ "bar", "qux", "baz" ] }`,
95+
`[ { "op": "remove", "path": "/foo/-" , "value": "qux" }]`,
96+
`{ "foo": [ "bar", "baz" ] }`,
97+
},
98+
{
99+
`{ "foo": [ "3", "2", "1" ] }`,
100+
`[ { "op": "remove", "path": "/foo/-" , "value": "1" }]`,
101+
`{ "foo": [ "3", "2" ] }`,
102+
},
103+
{
104+
`{ "foo": [ [ "bar", "qux", "baz" ], [ "bar", "baz" ], "1" ] }`,
105+
`[ { "op": "remove", "path": "/foo/-" , "value": [ "bar", "baz" ] }]`,
106+
`{ "foo": [ [ "bar", "qux", "baz" ], "1" ] }`,
107+
},
93108
{
94109
`{ "baz": "qux", "foo": "bar" }`,
95110
`[ { "op": "replace", "path": "/baz", "value": "boo" } ]`,
@@ -295,6 +310,10 @@ var BadCases = []BadCase{
295310
`{ "foo": []}`,
296311
`[ {"op": "remove", "path": "/foo/-"}]`,
297312
},
313+
{
314+
`{ "foo": []}`,
315+
`[ {"op": "remove", "path": "/foo/-", "value": "asd"}]`,
316+
},
298317
{
299318
`{ "foo": []}`,
300319
`[ {"op": "remove", "path": "/foo/-1"}]`,

0 commit comments

Comments
 (0)