diff --git a/src/data/accountData.cpp b/src/data/accountData.cpp index 5b2a851..70631c0 100644 --- a/src/data/accountData.cpp +++ b/src/data/accountData.cpp @@ -9,9 +9,15 @@ AccountData::AccountData(const std::string &file) : Data(file) { account = AccountData::createObject(); } +AccountData::AccountData(const std::string &file, const std::string &name) : Data(file) { + std::string json = R"({"name":")" + name + R"(","transactions":[],"earnings":[]})"; + document.Parse(json.c_str()); + account = AccountData::createObject(); + std::cout << "Created account " << name << std::endl; +} + Account AccountData::createObject() { if (isJsonCorrect()) { - bool withdrawable = document["withdrawable"].GetBool(); std::string name = document["name"].GetString(); std::list transactions; @@ -35,13 +41,13 @@ Account AccountData::createObject() { earnings.emplace_back(value, tmTime); } - return Account(transactions, earnings, withdrawable, name); + return Account(transactions, earnings, name); } std::string strAnswer; bool answer; while (true) { - std::cout << "Account " + getFilePath() + " not found, would you like to remove it from the database? (Y/n): "; + std::cout << "Account " + getFilePath() + " Is malformed, would you like to remove it? (Y/n): "; std::cin >> strAnswer; std::transform(strAnswer.begin(), strAnswer.end(), strAnswer.begin(), ::toupper); if (strAnswer == "Y" || strAnswer == "YES") { @@ -60,7 +66,6 @@ Account AccountData::createObject() { bool AccountData::isJsonCorrect() { if (document.IsObject() && - document.HasMember("withdrawable") && document["withdrawable"].IsBool() && document.HasMember("name") && document["name"].IsString() && document.HasMember("transactions") && document["transactions"].IsArray() && document.HasMember("earnings") && document["earnings"].IsArray()) { diff --git a/src/data/accountData.h b/src/data/accountData.h index b06d7a5..be0a977 100644 --- a/src/data/accountData.h +++ b/src/data/accountData.h @@ -15,8 +15,9 @@ class AccountData : private Data { public: explicit AccountData(const std::string &file); + explicit AccountData(const std::string &file, const std::string &name); + Account *getAccount(); - private: Account account; diff --git a/src/data/data.h b/src/data/data.h index df79205..9568883 100644 --- a/src/data/data.h +++ b/src/data/data.h @@ -15,6 +15,8 @@ class Data { public: rapidjson::Document document; + virtual ~Data(); + explicit Data(std::string file); virtual T createObject() = 0; diff --git a/src/data/data.tpp b/src/data/data.tpp index 1f36501..d56bab7 100644 --- a/src/data/data.tpp +++ b/src/data/data.tpp @@ -15,28 +15,23 @@ template Data::Data(std::string file) : fileName(std::move(file)) { // Create file if it doesnt exist - std::ifstream chkExistIfs; - chkExistIfs.open(getFilePath()); + std::ifstream chkExistIfs(getFilePath(), std::ios::in | std::ios::binary | std::ios::ate); if (chkExistIfs) { // File exists, were not creating one + std::ifstream::pos_type fileSize = chkExistIfs.tellg(); + chkExistIfs.seekg(0, std::ios::beg); + + std::vector bytes(fileSize); + chkExistIfs.read(bytes.data(), fileSize); + + document.Parse(std::string(bytes.data(), fileSize).c_str()); chkExistIfs.close(); } else { // File doesnt exist we need to create one + // This is the job of the derives constructor. chkExistIfs.close(); - }; - - std::ifstream ifstream(getFilePath(), std::ios::in | std::ios::binary | std::ios::ate); - std::ifstream::pos_type fileSize = ifstream.tellg(); - ifstream.seekg(0, std::ios::beg); - - std::vector bytes(fileSize); - ifstream.read(bytes.data(), fileSize); - - document.Parse(std::string(bytes.data(), fileSize).c_str()); - - ifstream.close(); } template @@ -54,3 +49,8 @@ void Data::flushToFile() { file << buffer.GetString(); file.close(); } + +template +Data::~Data() { + flushToFile(); +} diff --git a/src/main.cpp b/src/main.cpp index a9ed0cc..21f1cff 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,7 +29,6 @@ void createRequiredFolders() { int main(int argc, char *argv[]) { std::vector args(argv, argv + argc); - std::cout << opterr; // Parse main options (-ah) OptHandlers::MainOptHandler mainOptHandler(args); @@ -42,7 +41,7 @@ int main(int argc, char *argv[]) { std::list accounts; for (const auto &file : std::filesystem::directory_iterator( homeDirectory + "/.local/share/budget/accounts")) { - accounts.emplace_back(AccountData(file.path())); + accounts.emplace_back(file.path()); } // Parse account options if main options tells us to. @@ -57,7 +56,7 @@ int main(int argc, char *argv[]) { accountOptHandler.help(); } if (accountOptHandler.getSetOpts()->create) { - AccountData account(storageD + "accounts/" + accountOptHandler.getSetOpts()->createAccount + ".json"); + AccountData account(storageD + "accounts/" + accountOptHandler.getSetOpts()->createAccount + ".json", accountOptHandler.getSetOpts()->createAccount); } } return 0; diff --git a/src/money/account.cpp b/src/money/account.cpp index d9e4e75..ee5dbcc 100644 --- a/src/money/account.cpp +++ b/src/money/account.cpp @@ -6,13 +6,11 @@ #include -Account::Account(std::list transactions, std::list earnings, bool withdrawable, +Account::Account(std::list transactions, std::list earnings, std::string name) : transactions(std::move(transactions)), earnings(std::move(earnings)), - withdrawable(withdrawable), name(std::move(name)) {} Account::Account() { - withdrawable = true; name = ""; } diff --git a/src/money/account.h b/src/money/account.h index 34bb0cc..bd98973 100644 --- a/src/money/account.h +++ b/src/money/account.h @@ -15,8 +15,7 @@ class Account { public: - Account(std::list transactions, std::list earnings, bool withdrawable, - std::string name); + Account(std::list transactions, std::list earnings, std::string name); Account(); @@ -28,7 +27,6 @@ public: private: std::list transactions; std::list earnings; - bool withdrawable; std::string name; }; diff --git a/src/optHandlers/accountOptHandler.cpp b/src/optHandlers/accountOptHandler.cpp index 2d3a552..dc21249 100644 --- a/src/optHandlers/accountOptHandler.cpp +++ b/src/optHandlers/accountOptHandler.cpp @@ -18,7 +18,7 @@ void AccountOptHandler::parse() { }; while (true) { - int opt = getopt_long(getArgc(), getArgv(), "hld:c:v:a", longOpts, nullptr); + int opt = getopt_long(getArgc(), getArgv(), "hl:d:c:va", longOpts, nullptr); if (opt == -1) { break;