From 50fdc0b4c9ab36933e6a0c9288fef3ac5df2b907 Mon Sep 17 00:00:00 2001 From: Evan Phoenix Date: Thu, 21 Oct 2021 09:40:42 -0700 Subject: [PATCH] port over fix for testing/replacing a whole document to v4 --- patch.go | 42 ++++++++++++++++++++++++++++++++++++++++++ patch_test.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/patch.go b/patch.go index 4bce593..dc2b7e5 100644 --- a/patch.go +++ b/patch.go @@ -568,6 +568,29 @@ func (p Patch) replace(doc *container, op Operation) error { return errors.Wrapf(err, "replace operation failed to decode path") } + if path == "" { + val := op.value() + + if val.which == eRaw { + if !val.tryDoc() { + if !val.tryAry() { + return errors.Wrapf(err, "replace operation value must be object or array") + } + } + } + + switch val.which { + case eAry: + *doc = &val.ary + case eDoc: + *doc = &val.doc + case eRaw: + return errors.Wrapf(err, "replace operation hit impossible case") + } + + return nil + } + con, key := findObject(doc, path) if con == nil { @@ -634,6 +657,25 @@ func (p Patch) test(doc *container, op Operation) error { return errors.Wrapf(err, "test operation failed to decode path") } + if path == "" { + var self lazyNode + + switch sv := (*doc).(type) { + case *partialDoc: + self.doc = *sv + self.which = eDoc + case *partialArray: + self.ary = *sv + self.which = eAry + } + + if self.equal(op.value()) { + return nil + } + + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) + } + con, key := findObject(doc, path) if con == nil { diff --git a/patch_test.go b/patch_test.go index 22db16f..84e2996 100644 --- a/patch_test.go +++ b/patch_test.go @@ -231,6 +231,36 @@ var Cases = []Case{ { "op": "copy", "path": "/foo/-", "from": "/foo/1" }]`, fmt.Sprintf(`{ "foo": ["A", %q, %q, %q] }`, repeatedA(48), repeatedA(48), repeatedA(48)), }, + { + `{ + "id": "00000000-0000-0000-0000-000000000000", + "parentID": "00000000-0000-0000-0000-000000000000" + }`, + `[ + { + "op": "test", + "path": "", + "value": { + "id": "00000000-0000-0000-0000-000000000000", + "parentID": "00000000-0000-0000-0000-000000000000" + } + }, + { + "op": "replace", + "path": "", + "value": { + "id": "759981e8-ec68-4639-a83e-513225914ecb", + "originalID": "bar", + "parentID": "00000000-0000-0000-0000-000000000000" + } + } + ]`, + `{ + "id" : "759981e8-ec68-4639-a83e-513225914ecb", + "originalID" : "bar", + "parentID" : "00000000-0000-0000-0000-000000000000" + }`, + }, } type BadCase struct {