summaryrefslogtreecommitdiff
path: root/subprojects/battleNetApi
diff options
context:
space:
mode:
authorAotrix <[email protected]>2025-11-09 18:14:41 +0100
committerAotrix <[email protected]>2025-11-09 18:14:41 +0100
commitea390f7ccf1abda93ebb80faa2bd8a79eb13c8c9 (patch)
tree4cb32e0ef223b2427a1fed79a3626c77b7eec39d /subprojects/battleNetApi
parent7c7c8b4aafe91f49a3448b822dd604253545307d (diff)
added ApiUrl class
Diffstat (limited to 'subprojects/battleNetApi')
-rw-r--r--subprojects/battleNetApi/CMakeLists.txt3
-rw-r--r--subprojects/battleNetApi/include/apiUrl.hpp15
-rw-r--r--subprojects/battleNetApi/include/hearthstoneApi.hpp21
-rw-r--r--subprojects/battleNetApi/src/apiUrl.cpp22
-rw-r--r--subprojects/battleNetApi/src/hearthstoneApi.cpp30
-rw-r--r--subprojects/battleNetApi/tests/tests.cpp9
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';
}