void Field::buildRapidJsonDocument()

in source/common/json/json_loader.cc [244:318]


void Field::buildRapidJsonDocument(const Field& field, rapidjson::Value& value,
                                   rapidjson::Document::AllocatorType& allocator) {

  switch (field.type_) {
  case Type::Array: {
    value.SetArray();
    value.Reserve(field.value_.array_value_.size(), allocator);
    for (const auto& element : field.value_.array_value_) {
      switch (element->type_) {
      case Type::Array:
      case Type::Object: {
        rapidjson::Value nested_value;
        buildRapidJsonDocument(*element, nested_value, allocator);
        value.PushBack(nested_value, allocator);
        break;
      }
      case Type::Boolean:
        value.PushBack(element->value_.boolean_value_, allocator);
        break;
      case Type::Double:
        value.PushBack(element->value_.double_value_, allocator);
        break;
      case Type::Integer:
        value.PushBack(element->value_.integer_value_, allocator);
        break;
      case Type::Null:
        value.PushBack(rapidjson::Value(), allocator);
        break;
      case Type::String:
        value.PushBack(rapidjson::StringRef(element->value_.string_value_.c_str()), allocator);
      }
    }
    break;
  }
  case Type::Object: {
    value.SetObject();
    for (const auto& item : field.value_.object_value_) {
      auto name = rapidjson::StringRef(item.first.c_str());

      switch (item.second->type_) {
      case Type::Array:
      case Type::Object: {
        rapidjson::Value nested_value;
        buildRapidJsonDocument(*item.second, nested_value, allocator);
        value.AddMember(name, nested_value, allocator);
        break;
      }
      case Type::Boolean:
        value.AddMember(name, item.second->value_.boolean_value_, allocator);
        break;
      case Type::Double:
        value.AddMember(name, item.second->value_.double_value_, allocator);
        break;
      case Type::Integer:
        value.AddMember(name, item.second->value_.integer_value_, allocator);
        break;
      case Type::Null:
        value.AddMember(name, rapidjson::Value(), allocator);
        break;
      case Type::String:
        value.AddMember(name, rapidjson::StringRef(item.second->value_.string_value_.c_str()),
                        allocator);
        break;
      }
    }
    break;
  }
  case Type::Null: {
    value.SetNull();
    break;
  }
  default:
    NOT_REACHED_GCOVR_EXCL_LINE;
  }
}