1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-21 00:19:29 +02:00

Configure JSON merge behaviour via #override flag (#423)

* added json flags; override flag affects how structs are merged
This commit is contained in:
Henning Koehler
2018-03-05 16:30:10 +13:00
committed by ArseniyShestakov
parent f126a34a5e
commit 4ee9d7f65a
4 changed files with 47 additions and 12 deletions

View File

@ -70,7 +70,8 @@ JsonNode::JsonNode(ResourceID && fileURI, bool &isValidSyntax):
JsonNode::JsonNode(const JsonNode &copy):
type(JsonType::DATA_NULL),
meta(copy.meta)
meta(copy.meta),
flags(copy.flags)
{
setType(copy.getType());
switch(type)
@ -96,6 +97,7 @@ void JsonNode::swap(JsonNode &b)
swap(meta, b.meta);
swap(data, b.data);
swap(type, b.type);
swap(flags, b.flags);
}
JsonNode & JsonNode::operator =(JsonNode node)
@ -846,7 +848,7 @@ const JsonNode & JsonUtils::getSchema(std::string URI)
return getSchemaByName(filename).resolvePointer(URI.substr(posHash + 1));
}
void JsonUtils::merge(JsonNode & dest, JsonNode & source)
void JsonUtils::merge(JsonNode & dest, JsonNode & source, bool noOverride)
{
if (dest.getType() == JsonNode::JsonType::DATA_NULL)
{
@ -872,23 +874,30 @@ void JsonUtils::merge(JsonNode & dest, JsonNode & source)
}
case JsonNode::JsonType::DATA_STRUCT:
{
//recursively merge all entries from struct
for(auto & node : source.Struct())
merge(dest[node.first], node.second);
if(!noOverride && vstd::contains(source.flags, "override"))
{
std::swap(dest, source);
}
else
{
//recursively merge all entries from struct
for(auto & node : source.Struct())
merge(dest[node.first], node.second, noOverride);
}
}
}
}
void JsonUtils::mergeCopy(JsonNode & dest, JsonNode source)
void JsonUtils::mergeCopy(JsonNode & dest, JsonNode source, bool noOverride)
{
// uses copy created in stack to safely merge two nodes
merge(dest, source);
merge(dest, source, noOverride);
}
void JsonUtils::inherit(JsonNode & descendant, const JsonNode & base)
{
JsonNode inheritedNode(base);
merge(inheritedNode,descendant);
merge(inheritedNode, descendant, true);
descendant.swap(inheritedNode);
}