Open espadrine opened 8 years ago
I disagree with the solution. I think { "op": "remove", "path": "" }
should be an error. If you want to replace the root element, you can already use { "op": "add", "path": "", "value": null }
today. Even that is strange.
It could be reasonable to allow the replace
to work with an empty path to replace the element completely, and, compatibility aside, disallow add
to do the same. This would provide the most intuitive semantics. add
and remove
require a non-empty path, replace
is able to replace the root.
But since we most likely want to be compatible, I think add
should stay as it is, replace
should explicitly allow to replace the root and remove
on the root should be an error.
What matters most is that the undefined behavior gets specified.
That being said, if we go with your solution, we lose the functional equivalence of replace
to remove
+ add
, which will be a bit counterintuitive.
The patch
{ "op": "remove", "path": "" }
is currently undefined.I believe it should have the same result as
{ "op": "add", "path": "", "value": null }
. As a side-result, it would also validate the definition of{ "op": "replace", "path": "", "value": null }
, which states:In any case, it would benefit from being specified. Some implementations currently throw, and that is unfortunate, as it breaks the specification as quoted above..