diff options
| -rw-r--r-- | subprojects/battleNetApi/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | subprojects/battleNetApi/include/apiUrl.hpp | 15 | ||||
| -rw-r--r-- | subprojects/battleNetApi/include/hearthstoneApi.hpp | 21 | ||||
| -rw-r--r-- | subprojects/battleNetApi/src/apiUrl.cpp | 22 | ||||
| -rw-r--r-- | subprojects/battleNetApi/src/hearthstoneApi.cpp | 30 | ||||
| -rw-r--r-- | subprojects/battleNetApi/tests/tests.cpp | 9 |
6 files changed, 53 insertions, 47 deletions
diff --git a/subprojects/battleNetApi/CMakeLists.txt b/subprojects/battleNetApi/CMakeLists.txt index 51c4244..b4f6a48 100644 --- a/subprojects/battleNetApi/CMakeLists.txt +++ b/subprojects/battleNetApi/CMakeLists.txt @@ -16,7 +16,8 @@ add_definitions(-DSOURCE_DIR_PATH="${CMAKE_SOURCE_DIR}") set(INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include) set(SRC ${PROJECT_SOURCE_DIR}/src/hearthstoneApi.cpp - ${PROJECT_SOURCE_DIR}/src/token.cpp ${PROJECT_SOURCE_DIR}/tests/tests.cpp) + ${PROJECT_SOURCE_DIR}/src/token.cpp ${PROJECT_SOURCE_DIR}/src/apiUrl.cpp + ${PROJECT_SOURCE_DIR}/tests/tests.cpp) find_package(Catch2 3 REQUIRED) add_executable(tests ${SRC}) diff --git a/subprojects/battleNetApi/include/apiUrl.hpp b/subprojects/battleNetApi/include/apiUrl.hpp new file mode 100644 index 0000000..cefce0b --- /dev/null +++ b/subprojects/battleNetApi/include/apiUrl.hpp @@ -0,0 +1,15 @@ +#pragma once +#include <string> +#include <unordered_map> + +class ApiUrl { + public: + ApiUrl(const std::string iContentType); + void setLocale(const std::string iLocale); + void setGameMode(const std::string iGameMode); + std::string operator()(); + + private: + std::string mContentType; + std::unordered_map<std::string, std::string> aParameters; +}; diff --git a/subprojects/battleNetApi/include/hearthstoneApi.hpp b/subprojects/battleNetApi/include/hearthstoneApi.hpp index 0ed9b57..bbcc8c7 100644 --- a/subprojects/battleNetApi/include/hearthstoneApi.hpp +++ b/subprojects/battleNetApi/include/hearthstoneApi.hpp @@ -1,36 +1,15 @@ #pragma once #include "token.hpp" #include <string> -#include <unordered_map> - -class ApiUrlParameters { - public: - void setLocale(const std::string iLocale) { - aParameters["locale"] = iLocale; //<! fr_FR - } - void setGameMode(const std::string iGameMode) { - aParameters["gameMode"] = iGameMode; //<! constructed - } - std::ostream &operator<<(std::ostream &iOstream) { - // TODO: complete - return iOstream; - } - - private: - std::unordered_map<std::string, std::string> aParameters; -}; class HearthstoneApi { public: HearthstoneApi(Token &&iToken); std::uint64_t numberOfCards(); - std::string cards(const std::string &iCardParameters); private: std::string authorizationHeader(); std::string makeApiRequest(const std::string &iUrl) const; - const std::string apiUrl(const std::string &iParameters) const; - const std::string setOfCardsUrl(const std::string &iCardParameters); static size_t curlCallbackStringOutput(void *iContent, size_t iSize, size_t iNmemb, std::string *iS); Token mToken; diff --git a/subprojects/battleNetApi/src/apiUrl.cpp b/subprojects/battleNetApi/src/apiUrl.cpp new file mode 100644 index 0000000..89f7a5f --- /dev/null +++ b/subprojects/battleNetApi/src/apiUrl.cpp @@ -0,0 +1,22 @@ +#include "apiUrl.hpp" +#include <format> + +ApiUrl::ApiUrl(const std::string iContentType) : mContentType{iContentType} {} +void ApiUrl::setLocale(const std::string iLocale) { + aParameters["locale"] = iLocale; //<! fr_FR +} +void ApiUrl::setGameMode(const std::string iGameMode) { + aParameters["gameMode"] = iGameMode; //<! constructed +} +std::string ApiUrl::operator()() { + std::string aFormattedParameters; + for (const auto &[key, value] : aParameters) { + aFormattedParameters += std::format("&{}={}", key, value); + } + if (not aFormattedParameters.empty()) { + aFormattedParameters[0] = '?'; + } + aFormattedParameters = + std::format("https://eu.api.blizzard.com/hearthstone/{}/{}", mContentType, aFormattedParameters); + return aFormattedParameters; +} diff --git a/subprojects/battleNetApi/src/hearthstoneApi.cpp b/subprojects/battleNetApi/src/hearthstoneApi.cpp index 9fda88c..b6eaf71 100644 --- a/subprojects/battleNetApi/src/hearthstoneApi.cpp +++ b/subprojects/battleNetApi/src/hearthstoneApi.cpp @@ -11,8 +11,15 @@ std::uint64_t HearthstoneApi::numberOfCards() { std::string HearthstoneApi::authorizationHeader() { return std::format("Authorization: Bearer {}", mToken.toString()); } -const std::string HearthstoneApi::apiUrl(const std::string &iParameters) const { - return std::format("https://eu.api.blizzard.com/hearthstone/{}", iParameters); +size_t HearthstoneApi::curlCallbackStringOutput(void *iContent, size_t iSize, size_t iNmemb, std::string *iS) { + const size_t kNewLength = iSize * iNmemb; + try { + iS->append(static_cast<char *>(iContent), kNewLength); + } catch (std::bad_alloc &e) { + // handle memory problem + return 0; + } + return kNewLength; } std::string HearthstoneApi::makeApiRequest(const std::string &iUrl) const { @@ -32,22 +39,3 @@ std::string HearthstoneApi::makeApiRequest(const std::string &iUrl) const { } return request_output; } - -const std::string HearthstoneApi::setOfCardsUrl(const std::string &iCardParameters) { - return apiUrl(std::format("cards{}", iCardParameters)); -} - -size_t HearthstoneApi::curlCallbackStringOutput(void *iContent, size_t iSize, size_t iNmemb, std::string *iS) { - const size_t kNewLength = iSize * iNmemb; - try { - iS->append(static_cast<char *>(iContent), kNewLength); - } catch (std::bad_alloc &e) { - // handle memory problem - return 0; - } - return kNewLength; -} - -std::string HearthstoneApi::cards(const std::string &iCardParameters) { - return makeApiRequest(setOfCardsUrl(iCardParameters)); -} diff --git a/subprojects/battleNetApi/tests/tests.cpp b/subprojects/battleNetApi/tests/tests.cpp index d83ea0a..6994d2f 100644 --- a/subprojects/battleNetApi/tests/tests.cpp +++ b/subprojects/battleNetApi/tests/tests.cpp @@ -1,3 +1,4 @@ +#include "apiUrl.hpp" #include "hearthstoneApi.hpp" #include <catch2/catch_test_macros.hpp> #include <iostream> @@ -22,7 +23,6 @@ class HearthstoneApiMock { public: HearthstoneApiMock() : mHearthstoneApi(std::move(mToken.getToken())) {}; std::string makeApiRequest(const std::string &iCardsUrl) { return mHearthstoneApi.makeApiRequest(iCardsUrl); } - const std::string apiUrl(const std::string &iParameters) { return mHearthstoneApi.apiUrl(iParameters); }; private: TokenMock mToken; @@ -45,7 +45,8 @@ TEST_CASE("Retrieve number of pages", "[getPagesCount]") { TEST_CASE("Retrieve cards", "[retrieveCards]") { HearthstoneApiMock aHearthstoneApi; - const std::string kCardParameters{"cards/?locale=fr_FR&gameMode=constructed"}; - const std::string kUrl{aHearthstoneApi.apiUrl(kCardParameters)}; - std::cout << aHearthstoneApi.makeApiRequest(kUrl) << '\n'; + ApiUrl aApiUrl("cards"); + aApiUrl.setLocale("fr_FR"); + aApiUrl.setGameMode("constructed"); + std::cout << aHearthstoneApi.makeApiRequest(aApiUrl()) << '\n'; } |
