ResponseCode JsonParser::MergeValues()

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;
        }