diff options
| author | Aotrix <[email protected]> | 2025-07-06 11:27:52 +0200 |
|---|---|---|
| committer | Aotrix <[email protected]> | 2025-07-06 11:27:52 +0200 |
| commit | a01e968169344a2bb2278c55b42d7f0c2c3e1763 (patch) | |
| tree | 1e712f7e4f59e3e63324a2352b8a3d84f0c63f67 | |
| parent | 43ef56e2417de30c693df878d1325b076e45ee39 (diff) | |
added card type handler
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | include/cardTypeHandlerInfo.hpp | 27 | ||||
| -rw-r--r-- | src/cardTypeHandlerInfo.cpp | 41 | ||||
| -rw-r--r-- | src/postgresHandler.cpp | 15 |
4 files changed, 73 insertions, 12 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 34ad282..59f6c3c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ set(CMAKE_COMPILE_COMMANDS ON) set(CMAKE_CXX_STANDARD 20) set(CXX_STANDARD_REQUIRED ON) set(CMAKE_BUILD_TYPE Debug) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20 -Wall") add_definitions(-DSOURCE_DIR_PATH="${CMAKE_SOURCE_DIR}") find_package(Catch2 3 REQUIRED) diff --git a/include/cardTypeHandlerInfo.hpp b/include/cardTypeHandlerInfo.hpp new file mode 100644 index 0000000..155633c --- /dev/null +++ b/include/cardTypeHandlerInfo.hpp @@ -0,0 +1,27 @@ +#include <functional> +#include <string> + +class CardTypeHandlerInfo { + public: + CardTypeHandlerInfo() = default; + ~CardTypeHandlerInfo() = default; + CardTypeHandlerInfo(const CardTypeHandlerInfo &) = delete; + CardTypeHandlerInfo(CardTypeHandlerInfo &&) = default; + // TODO: rule of 5 ? delete copy operator ? how to call it I forgot + CardTypeHandlerInfo( + const std::vector<std::string> &kCardTypeVector, + const std::vector<std::string> &kCardValueRegexVector, + const std::vector<std::function<const std::string(const std::string &)>> + kJSONToSQLConverterVector); + + void addCardInfo(const std::string &kCardType, + const std::string &kCardValueRegex, + const std::function<const std::string(const std::string &)> + kJSONToSQLConverter); + + private: + std::vector<std::string> mCardType; + std::vector<std::string> mCardValueRegex; + std::vector<std::function<const std::string(const std::string &)>> + mJSONToSQLConverter; +}; diff --git a/src/cardTypeHandlerInfo.cpp b/src/cardTypeHandlerInfo.cpp new file mode 100644 index 0000000..b49057a --- /dev/null +++ b/src/cardTypeHandlerInfo.cpp @@ -0,0 +1,41 @@ +#include "cardTypeHandlerInfo.hpp" + +void CardTypeHandlerInfo::addCardInfo( + const std::string &kCardType, const std::string &kCardValueRegex, + const std::function<const std::string(const std::string &)> + kJSONToSQLConverter) { + // TODO: complete +} + +const CardTypeHandlerInfo cardTypeHandlerInfoList() { + CardTypeHandlerInfo aCardTypeHandlerInfo; + + aCardTypeHandlerInfo.addCardInfo( + "INT", "[0-9]+", + [](const std::string &kJSONContent) { return kJSONContent; }); + + aCardTypeHandlerInfo.addCardInfo( + "BOOL", "true|false", + [](const std::string &kJSONContent) { return kJSONContent; }); + + aCardTypeHandlerInfo.addCardInfo( + "STRING", "\"[^\"?]*\"", [](const std::string &kJSONContent) { + std::string aCopyOfJSONValue = kJSONContent; + *aCopyOfJSONValue.begin() = '\''; + *std::prev(aCopyOfJSONValue.end()) = '\''; + return aCopyOfJSONValue; + }); + + aCardTypeHandlerInfo.addCardInfo( + "LIST_OF_INT", "\\[[0-9,]*\\]", [](const std::string &kJSONContent) { + std::string aCopyOfJSONValue = kJSONContent; + aCopyOfJSONValue.append("\'"); + aCopyOfJSONValue.insert(aCopyOfJSONValue.begin(), '\''); + return aCopyOfJSONValue; + }); + + aCardTypeHandlerInfo.addCardInfo( + "NULL", "null", [](const std::string &kJSONContent) { return "NULL"; }); + + return aCardTypeHandlerInfo; +} diff --git a/src/postgresHandler.cpp b/src/postgresHandler.cpp index 9241214..4574f95 100644 --- a/src/postgresHandler.cpp +++ b/src/postgresHandler.cpp @@ -1,4 +1,5 @@ #include "postgresHandler.hpp" +#include "cardTypeHandlerInfo.hpp" #include "hearthstoneAPIHandler.hpp" #include <cctype> #include <cstddef> @@ -10,14 +11,6 @@ #define KEY_ID 1 -// TODO: create a list/array which contains CardTypeHandlerInfo struct objects -// and fill these info in a single function -struct CardTypeHandlerInfo { - std::string aCardType; - std::string aCardValueRegex; - std::function<const std::string(const std::string &)> aJSONToSQLConverter; -}; - const std::map<std::string, std::string> aCardValueTypeToRegex = { {"INT", "[0-9]+"}, {"STRING", "\"[^\"?]*\""}, @@ -131,7 +124,7 @@ add_single_card_to_database(const std::string &kCards, pqxx::work &aTransaction, } } -const std::regex keyValueJSONRegex() { +const std::regex regexKeyValueInJSON() { std::string aRegexString = "\"([^\"?]+)\":("; for (auto &[fieldName, regex] : aCardValueTypeToRegex) { aRegexString += "(" + regex + ")|"; @@ -155,7 +148,7 @@ endPosOfCardJSON(const std::string &kCardsPageJSON, void addCardsToDatabase(HearthstoneAPIHandler &aAPIIntermediate, pqxx::work &aTransaction, const std::string &kURLOfCardsPage) { - const std::regex aKeyValueJSONRegex = keyValueJSONRegex(); + const std::regex aRegexKeyValueInJSON = regexKeyValueInJSON(); const std::string &kCardsPageJSON = aAPIIntermediate.get_cards(kURLOfCardsPage); std::string::size_type aCardStartPos = startPosOfCardJSON(kCardsPageJSON); @@ -163,7 +156,7 @@ void addCardsToDatabase(HearthstoneAPIHandler &aAPIIntermediate, while (aCardStartPos != std::string::npos && aCardEndPos != std::string::npos) { add_single_card_to_database(kCardsPageJSON, aTransaction, - aKeyValueJSONRegex, aCardStartPos, + aRegexKeyValueInJSON, aCardStartPos, aCardEndPos); aCardStartPos = startPosOfCardJSON(kCardsPageJSON, aCardStartPos + 1); aCardEndPos = endPosOfCardJSON(kCardsPageJSON, aCardEndPos + 1); |
