Response QueueClient::ReceiveMessages()

in sdk/storage/azure-storage-queues/src/rest_client.cpp [912:1047]


    Response<Models::ReceivedMessages> QueueClient::ReceiveMessages(
        Core::Http::_internal::HttpPipeline& pipeline,
        const Core::Url& url,
        const ReceiveQueueMessagesOptions& options,
        const Core::Context& context)
    {
      auto request = Core::Http::Request(Core::Http::HttpMethod::Get, url);
      if (options.NumberOfMessages.HasValue())
      {
        request.GetUrl().AppendQueryParameter(
            "numofmessages", std::to_string(options.NumberOfMessages.Value()));
      }
      if (options.Visibilitytimeout.HasValue())
      {
        request.GetUrl().AppendQueryParameter(
            "visibilitytimeout", std::to_string(options.Visibilitytimeout.Value()));
      }
      request.SetHeader("x-ms-version", "2024-08-04");
      auto pRawResponse = pipeline.Send(request, context);
      auto httpStatusCode = pRawResponse->GetStatusCode();
      if (httpStatusCode != Core::Http::HttpStatusCode::Ok)
      {
        throw StorageException::CreateFromResponse(std::move(pRawResponse));
      }
      Models::ReceivedMessages response;
      {
        const auto& responseBody = pRawResponse->GetBody();
        _internal::XmlReader reader(
            reinterpret_cast<const char*>(responseBody.data()), responseBody.size());
        enum class XmlTagEnum
        {
          kUnknown,
          kQueueMessagesList,
          kQueueMessage,
          kMessageId,
          kInsertionTime,
          kExpirationTime,
          kPopReceipt,
          kTimeNextVisible,
          kDequeueCount,
          kMessageText,
        };
        const std::unordered_map<std::string, XmlTagEnum> XmlTagEnumMap{
            {"QueueMessagesList", XmlTagEnum::kQueueMessagesList},
            {"QueueMessage", XmlTagEnum::kQueueMessage},
            {"MessageId", XmlTagEnum::kMessageId},
            {"InsertionTime", XmlTagEnum::kInsertionTime},
            {"ExpirationTime", XmlTagEnum::kExpirationTime},
            {"PopReceipt", XmlTagEnum::kPopReceipt},
            {"TimeNextVisible", XmlTagEnum::kTimeNextVisible},
            {"DequeueCount", XmlTagEnum::kDequeueCount},
            {"MessageText", XmlTagEnum::kMessageText},
        };
        std::vector<XmlTagEnum> xmlPath;
        Models::QueueMessage vectorElement1;
        while (true)
        {
          auto node = reader.Read();
          if (node.Type == _internal::XmlNodeType::End)
          {
            break;
          }
          else if (node.Type == _internal::XmlNodeType::StartTag)
          {
            auto ite = XmlTagEnumMap.find(node.Name);
            xmlPath.push_back(ite == XmlTagEnumMap.end() ? XmlTagEnum::kUnknown : ite->second);
          }
          else if (node.Type == _internal::XmlNodeType::Text)
          {
            if (xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
                && xmlPath[1] == XmlTagEnum::kQueueMessage && xmlPath[2] == XmlTagEnum::kMessageId)
            {
              vectorElement1.MessageId = node.Value;
            }
            else if (
                xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
                && xmlPath[1] == XmlTagEnum::kQueueMessage
                && xmlPath[2] == XmlTagEnum::kInsertionTime)
            {
              vectorElement1.InsertedOn
                  = DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
            }
            else if (
                xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
                && xmlPath[1] == XmlTagEnum::kQueueMessage
                && xmlPath[2] == XmlTagEnum::kExpirationTime)
            {
              vectorElement1.ExpiresOn
                  = DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
            }
            else if (
                xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
                && xmlPath[1] == XmlTagEnum::kQueueMessage && xmlPath[2] == XmlTagEnum::kPopReceipt)
            {
              vectorElement1.PopReceipt = node.Value;
            }
            else if (
                xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
                && xmlPath[1] == XmlTagEnum::kQueueMessage
                && xmlPath[2] == XmlTagEnum::kTimeNextVisible)
            {
              vectorElement1.NextVisibleOn
                  = DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
            }
            else if (
                xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
                && xmlPath[1] == XmlTagEnum::kQueueMessage
                && xmlPath[2] == XmlTagEnum::kDequeueCount)
            {
              vectorElement1.DequeueCount = std::stoll(node.Value);
            }
            else if (
                xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
                && xmlPath[1] == XmlTagEnum::kQueueMessage
                && xmlPath[2] == XmlTagEnum::kMessageText)
            {
              vectorElement1.MessageText = node.Value;
            }
          }
          else if (node.Type == _internal::XmlNodeType::Attribute)
          {
          }
          else if (node.Type == _internal::XmlNodeType::EndTag)
          {
            if (xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kQueueMessagesList
                && xmlPath[1] == XmlTagEnum::kQueueMessage)
            {
              response.Messages.push_back(std::move(vectorElement1));
              vectorElement1 = Models::QueueMessage();
            }
            xmlPath.pop_back();
          }
        }
      }
      return Response<Models::ReceivedMessages>(std::move(response), std::move(pRawResponse));
    }