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:
committed by
ArseniyShestakov
parent
f126a34a5e
commit
4ee9d7f65a
@ -70,7 +70,8 @@ JsonNode::JsonNode(ResourceID && fileURI, bool &isValidSyntax):
|
||||
|
||||
JsonNode::JsonNode(const JsonNode ©):
|
||||
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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user