From 5561fe05a1ec79c9bca966376211b2ab81959671 Mon Sep 17 00:00:00 2001 From: Evan Phoenix Date: Wed, 20 Oct 2021 11:47:23 -0700 Subject: [PATCH] Handle applying to the whole doc. Fixes #142 --- v5/patch.go | 42 ++++++++++++++++++++++++++++++++++++++++++ v5/patch_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/v5/patch.go b/v5/patch.go index ad04eef..117f2c0 100644 --- a/v5/patch.go +++ b/v5/patch.go @@ -845,6 +845,29 @@ func (p Patch) replace(doc *container, op Operation, options *ApplyOptions) erro 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, options) if con == nil { @@ -911,6 +934,25 @@ func (p Patch) test(doc *container, op Operation, options *ApplyOptions) 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, options) if con == nil { diff --git a/v5/patch_test.go b/v5/patch_test.go index c3a30e5..3fa079e 100644 --- a/v5/patch_test.go +++ b/v5/patch_test.go @@ -540,6 +540,37 @@ var Cases = []Case{ false, true, }, + { + `{ + "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" +}`, + false, true, + }, } type BadCase struct {