1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-01-26 03:52:01 +02:00

Partially updated schema validation to draft v6

This commit is contained in:
Ivan Savenko 2024-02-12 00:47:28 +02:00
parent cda6899ee2
commit ca9a16e30e
2 changed files with 36 additions and 27 deletions

View File

@ -21,13 +21,12 @@
VCMI_LIB_NAMESPACE_BEGIN
//TODO: integer support
static const std::unordered_map<std::string, JsonNode::JsonType> stringToType =
{
{"null", JsonNode::JsonType::DATA_NULL},
{"boolean", JsonNode::JsonType::DATA_BOOL},
{"number", JsonNode::JsonType::DATA_FLOAT},
{"integer", JsonNode::JsonType::DATA_INTEGER},
{"string", JsonNode::JsonType::DATA_STRING},
{"array", JsonNode::JsonType::DATA_VECTOR},
{"object", JsonNode::JsonType::DATA_STRUCT}
@ -132,8 +131,8 @@ namespace
JsonNode::JsonType type = it->second;
//FIXME: hack for integer values
if(data.isNumber() && type == JsonNode::JsonType::DATA_FLOAT)
// for "number" type both float and integer are allowed
if(type == JsonNode::JsonType::DATA_FLOAT && data.isNumber())
return "";
if(type != data.getType() && data.getType() != JsonNode::JsonType::DATA_NULL)
@ -201,31 +200,29 @@ namespace
std::string maximumCheck(Validation::ValidationData & validator, const JsonNode & baseSchema, const JsonNode & schema, const JsonNode & data)
{
if (baseSchema["exclusiveMaximum"].Bool())
{
if (data.Float() >= schema.Float())
return validator.makeErrorMessage((boost::format("Value is bigger than %d") % schema.Float()).str());
}
else
{
if (data.Float() > schema.Float())
return validator.makeErrorMessage((boost::format("Value is bigger than %d") % schema.Float()).str());
}
if (data.Float() > schema.Float())
return validator.makeErrorMessage((boost::format("Value is bigger than %d") % schema.Float()).str());
return "";
}
std::string minimumCheck(Validation::ValidationData & validator, const JsonNode & baseSchema, const JsonNode & schema, const JsonNode & data)
{
if (baseSchema["exclusiveMinimum"].Bool())
{
if (data.Float() <= schema.Float())
return validator.makeErrorMessage((boost::format("Value is smaller than %d") % schema.Float()).str());
}
else
{
if (data.Float() < schema.Float())
return validator.makeErrorMessage((boost::format("Value is smaller than %d") % schema.Float()).str());
}
if (data.Float() < schema.Float())
return validator.makeErrorMessage((boost::format("Value is smaller than %d") % schema.Float()).str());
return "";
}
std::string exclusiveMaximumCheck(Validation::ValidationData & validator, const JsonNode & baseSchema, const JsonNode & schema, const JsonNode & data)
{
if (data.Float() >= schema.Float())
return validator.makeErrorMessage((boost::format("Value is bigger than %d") % schema.Float()).str());
return "";
}
std::string exclusiveMinimumCheck(Validation::ValidationData & validator, const JsonNode & baseSchema, const JsonNode & schema, const JsonNode & data)
{
if (data.Float() <= schema.Float())
return validator.makeErrorMessage((boost::format("Value is smaller than %d") % schema.Float()).str());
return "";
}
@ -536,6 +533,13 @@ namespace
ret["default"] = Common::emptyCheck;
ret["description"] = Common::emptyCheck;
ret["definitions"] = Common::emptyCheck;
// Not implemented
ret["propertyNames"] = Common::emptyCheck;
ret["contains"] = Common::emptyCheck;
ret["const"] = Common::emptyCheck;
ret["examples"] = Common::emptyCheck;
return ret;
}
@ -556,8 +560,8 @@ namespace
ret["minimum"] = Number::minimumCheck;
ret["multipleOf"] = Number::multipleOfCheck;
ret["exclusiveMaximum"] = Common::emptyCheck;
ret["exclusiveMinimum"] = Common::emptyCheck;
ret["exclusiveMaximum"] = Number::exclusiveMaximumCheck;
ret["exclusiveMinimum"] = Number::exclusiveMinimumCheck;
return ret;
}
@ -598,6 +602,11 @@ namespace
ret["imageFile"] = Formats::imageFile;
ret["videoFile"] = Formats::videoFile;
//TODO:
// uri-reference
// uri-template
// json-pointer
return ret;
}
}

View File

@ -14,7 +14,7 @@
VCMI_LIB_NAMESPACE_BEGIN
//Internal class for Json validation. Mostly compilant with json-schema v4 draft
//Internal class for Json validation. Mostly compilant with json-schema v6 draft
namespace Validation
{
/// struct used to pass data around during validation