in src/util/JsonParser.cpp [198:253]
ResponseCode JsonParser::MergeValues(JsonValue &target,
JsonValue &source,
JsonValue::AllocatorType &allocator) {
if (source.IsNull() || target.IsNull() || !source.IsObject() || !target.IsObject()) {
return ResponseCode::JSON_MERGE_FAILED;
}
ResponseCode rc = ResponseCode::SUCCESS;
bool inner_merge_successful = true;
bool target_has_key = false;
util::JsonValue::MemberIterator target_itr;
util::JsonValue::MemberIterator source_itr = source.MemberBegin();
while (source_itr != source.MemberEnd()) {
target_itr = target.MemberBegin();
target_has_key = false;
inner_merge_successful = true;
while (target_itr != target.MemberEnd()) {
if (target_itr->name == source_itr->name) {
if (target_itr->value.IsObject() && source_itr->value.IsObject()) {
rc = MergeValues(target_itr->value, source_itr->value, allocator);
if (ResponseCode::SUCCESS != rc) {
inner_merge_successful = false;
break;
}
} else {
target_itr = target.EraseMember(target_itr);
JsonValue name;
JsonValue value;
name.CopyFrom(source_itr->name, allocator);
value.CopyFrom(source_itr->value, allocator);
target.AddMember(name.Move(), value.Move(), allocator);
}
target_has_key = true;
break;
}
target_itr++;
}
if (!inner_merge_successful) {
break;
}
if (!target_has_key) {
JsonValue name;
JsonValue value;
name.CopyFrom(source_itr->name, allocator);
value.CopyFrom(source_itr->value, allocator);
target.AddMember(name.Move(), value.Move(), allocator);
}
source_itr++;
}
return rc;
}