From a01e968169344a2bb2278c55b42d7f0c2c3e1763 Mon Sep 17 00:00:00 2001 From: Aotrix Date: Sun, 6 Jul 2025 11:27:52 +0200 Subject: added card type handler --- CMakeLists.txt | 2 +- include/cardTypeHandlerInfo.hpp | 27 +++++++++++++++++++++++++++ src/cardTypeHandlerInfo.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/postgresHandler.cpp | 15 ++++----------- 4 files changed, 73 insertions(+), 12 deletions(-) create mode 100644 include/cardTypeHandlerInfo.hpp create mode 100644 src/cardTypeHandlerInfo.cpp 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 +#include + +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 &kCardTypeVector, + const std::vector &kCardValueRegexVector, + const std::vector> + kJSONToSQLConverterVector); + + void addCardInfo(const std::string &kCardType, + const std::string &kCardValueRegex, + const std::function + kJSONToSQLConverter); + + private: + std::vector mCardType; + std::vector mCardValueRegex; + std::vector> + 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 + 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 #include @@ -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 aJSONToSQLConverter; -}; - const std::map 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); -- cgit v1.2.3