From e006ece3289c848ca2975f06386d6a2a51bdb67f Mon Sep 17 00:00:00 2001 From: Aotrix <9aotrix@protonmail.com> Date: Sun, 16 Nov 2025 21:07:44 +0100 Subject: Refactored JSON value retrieval --- subprojects/battleNetApi/include/apiUrl.hpp | 3 ++- .../battleNetApi/include/hearthstoneApi.hpp | 26 +++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) (limited to 'subprojects/battleNetApi/include') diff --git a/subprojects/battleNetApi/include/apiUrl.hpp b/subprojects/battleNetApi/include/apiUrl.hpp index 12124c6..509b248 100644 --- a/subprojects/battleNetApi/include/apiUrl.hpp +++ b/subprojects/battleNetApi/include/apiUrl.hpp @@ -9,7 +9,8 @@ class ApiUrl { void setRegion(const std::string &iRegion); void setLocale(const std::string &iLocale); void setGameMode(const std::string &iGameMode); - std::string operator()(); + void setPageSize(const std::string &iPageSize); + std::string operator()() const; private: std::string mContentType; diff --git a/subprojects/battleNetApi/include/hearthstoneApi.hpp b/subprojects/battleNetApi/include/hearthstoneApi.hpp index bbcc8c7..c11acc7 100644 --- a/subprojects/battleNetApi/include/hearthstoneApi.hpp +++ b/subprojects/battleNetApi/include/hearthstoneApi.hpp @@ -1,17 +1,41 @@ #pragma once #include "token.hpp" +#include +#include #include class HearthstoneApi { public: HearthstoneApi(Token &&iToken); - std::uint64_t numberOfCards(); + std::uint64_t numberOfCards(const std::string &iApiResponse) const; private: std::string authorizationHeader(); std::string makeApiRequest(const std::string &iUrl) const; static size_t curlCallbackStringOutput(void *iContent, size_t iSize, size_t iNmemb, std::string *iS); + /** + * @brief + * @param[in] iJsonContent The std::string which contains Json (Battle.net API response for instance) + * @param[in] iKeyValueRegex The regex used to retrieve value from (key, value) pair + * An example: "\"cardCount\":(\\d+)" + */ + template T valueInJson(const std::string &iJsonContent, const std::string &iKeyValueRegex) const { + const std::regex iRegex{iKeyValueRegex}; + std::smatch aMatches; + if (std::regex_search(iJsonContent, aMatches, iRegex)) { + const std::string kValueString{aMatches[1].str()}; + T aValue; + const auto kConversionStatus = + std::from_chars(kValueString.data(), kValueString.data() + kValueString.size(), aValue); + if (kConversionStatus.ec == std::errc{}) { + return aValue; + } + } + std::cerr << std::format("Unable to find value with regex: '{}'\n", iKeyValueRegex); + return 0; + } + Token mToken; std::string mAuthorizationHeader; //