kicad/thirdparty/json_schema_validator/json-patch.cpp

115 lines
3.4 KiB
C++

#include "json-patch.hpp"
#include <nlohmann/json-schema.hpp>
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<std::string>() );
}
} // namespace nlohmann