diff --git a/src/data/accountData.cpp b/src/data/accountData.cpp index 70631c0..1a58fcd 100644 --- a/src/data/accountData.cpp +++ b/src/data/accountData.cpp @@ -95,3 +95,7 @@ bool AccountData::isJsonCorrect() { Account *AccountData::getAccount() { return &account; } + +AccountData::AccountData() : Data("/dev/null") { + +} diff --git a/src/data/accountData.h b/src/data/accountData.h index 3563d78..8cfee15 100644 --- a/src/data/accountData.h +++ b/src/data/accountData.h @@ -13,6 +13,10 @@ static const char *jsonTemplate = ""; class AccountData : private Data { public: + AccountData(); + + AccountData(const AccountData &) = default; + explicit AccountData(const std::string &file); explicit AccountData(const std::string &file, const std::string &name); diff --git a/src/data/data.h b/src/data/data.h index 180fdf4..6670a16 100644 --- a/src/data/data.h +++ b/src/data/data.h @@ -17,6 +17,8 @@ public: virtual ~Data(); + Data(const Data &data); + explicit Data(std::string file); virtual T createObject() = 0; diff --git a/src/data/data.tpp b/src/data/data.tpp index cfa2839..0d835ec 100644 --- a/src/data/data.tpp +++ b/src/data/data.tpp @@ -61,3 +61,24 @@ void Data::deleteObject() { remove(getFilePath().c_str()); flush = false; } + +template +Data::Data(const Data &data) : fileName(data.fileName) { + // Create file if it doesnt exist + 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(); + }; +} diff --git a/src/main.cpp b/src/main.cpp index 07f502a..e804f6b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,7 +11,8 @@ #include #include #include -#include +#include +#include using namespace Budget; @@ -37,10 +38,11 @@ int main(int argc, char *argv[]) { createRequiredFolders(); // Read all accounts saved and store them in accounts - std::list accounts; + std::unordered_map accounts; for (const auto &file : std::filesystem::directory_iterator( homeDirectory + "/.local/share/budget/accounts")) { - accounts.emplace_back(file.path()); + AccountData account(file.path()); + accounts.insert(std::pair(account.getAccount()->getName(), account)); } // Parse account options if main options tells us to. @@ -55,8 +57,17 @@ int main(int argc, char *argv[]) { accountOptHandler.help(); } if (accountOptHandler.getSetOpts()->create) { - accounts.emplace_back(storageD + "accounts/" + accountOptHandler.getSetOpts()->createAccount + ".json", - accountOptHandler.getSetOpts()->createAccount); + accounts.insert(std::pair( + accountOptHandler.getSetOpts()->createAccount, + (storageD + "accounts/" + accountOptHandler.getSetOpts()->createAccount + + ".json", accountOptHandler.getSetOpts()->createAccount) + )); + } + if (accountOptHandler.getSetOpts()->value) { + auto a = accounts.find(accountOptHandler.getSetOpts()->valueAccount); + if (a != accounts.end()) { + std::cout << "Account value: " << a->second.getAccount()->getValue() << std::endl; + } } } return 0; diff --git a/src/money/account.cpp b/src/money/account.cpp index ee5dbcc..07d3190 100644 --- a/src/money/account.cpp +++ b/src/money/account.cpp @@ -38,3 +38,7 @@ std::vector Account::getTimeline() { return timeline; } + +const std::string &Account::getName() const { + return name; +} diff --git a/src/money/account.h b/src/money/account.h index bd98973..a9986cf 100644 --- a/src/money/account.h +++ b/src/money/account.h @@ -22,6 +22,8 @@ public: int getValue(); std::vector getTimeline(); + + const std::string &getName() const; private: diff --git a/src/optHandlers/accountOptHandler.cpp b/src/optHandlers/accountOptHandler.cpp index b5e8a8f..6ea6bca 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(), "hl:d:c:va", longOpts, nullptr); + int opt = getopt_long(getArgc(), getArgv(), "hld:c:v:", longOpts, nullptr); if (opt == -1) { break;