#include "json-patch.hpp" #include namespace { // originally from http://jsonpatch.com/, http://json.schemastore.org/json-patch // with fixes const nlohmann::json patch_schema = R"patch({ "title": "JSON schema for JSONPatch files", "$schema": "http://json-schema.org/draft-04/schema#", "type": "array", "items": { "oneOf": [ { "additionalProperties": false, "required": [ "value", "op", "path"], "properties": { "path" : { "$ref": "#/definitions/path" }, "op": { "description": "The operation to perform.", "type": "string", "enum": [ "add", "replace", "test" ] }, "value": { "description": "The value to add, replace or test." } } }, { "additionalProperties": false, "required": [ "op", "path"], "properties": { "path" : { "$ref": "#/definitions/path" }, "op": { "description": "The operation to perform.", "type": "string", "enum": [ "remove" ] } } }, { "additionalProperties": false, "required": [ "from", "op", "path" ], "properties": { "path" : { "$ref": "#/definitions/path" }, "op": { "description": "The operation to perform.", "type": "string", "enum": [ "move", "copy" ] }, "from": { "$ref": "#/definitions/path", "description": "A JSON Pointer path pointing to the location to move/copy from." } } } ] }, "definitions": { "path": { "description": "A JSON Pointer path.", "type": "string" } } })patch"_json; } // namespace namespace nlohmann { json_patch::json_patch(json &&patch) : j_(std::move(patch)) { validateJsonPatch(j_); } json_patch::json_patch(const json &patch) : j_(std::move(patch)) { validateJsonPatch(j_); } json_patch &json_patch::add(const json::json_pointer &ptr, json value) { j_.push_back(json{{"op", "add"}, {"path", ptr.to_string()}, {"value", std::move(value)}}); return *this; } json_patch &json_patch::replace(const json::json_pointer &ptr, json value) { j_.push_back(json{{"op", "replace"}, {"path", ptr.to_string()}, {"value", std::move(value)}}); return *this; } json_patch &json_patch::remove(const json::json_pointer &ptr) { j_.push_back(json{{"op", "remove"}, {"path", ptr.to_string()}}); return *this; } void json_patch::validateJsonPatch(json const &patch) { // static put here to have it created at the first usage of validateJsonPatch static nlohmann::json_schema::json_validator patch_validator(patch_schema); patch_validator.validate(patch); for (auto const &op : patch) json::json_pointer(op["path"].get()); } } // namespace nlohmann