From 9f3802690f9dd9452e96d1d7a879291978d66e35 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 6 May 2021 14:13:28 -0400 Subject: Refactoring --- src/utils.h | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) (limited to 'src/utils.h') diff --git a/src/utils.h b/src/utils.h index bf789e1..dea052b 100644 --- a/src/utils.h +++ b/src/utils.h @@ -1,15 +1,17 @@ #pragma once #include "json.hpp" +#include "entry.h" #include #include #include #include #include #include +#include namespace utils { - nlohmann::json loadJson(const std::string& path); - + nlohmann::json loadJson(const std::filesystem::path& path); + // Recursively loads all .json files under directory // If called multiple times with same directory, returns a cached result. std::vector loadAllJson(const std::string& directory); @@ -20,11 +22,31 @@ namespace utils { // goes through the available types and searches for the one matching name. nlohmann::json findByName(const std::string& name); - void saveJson(const nlohmann::json& data, const std::string& path); + void saveJson(const nlohmann::json& data, const std::filesystem::path& path); // converts in-place std::string lower(std::string& in); + template std::shared_ptr instantiate(const std::filesystem::path& path) { + std::shared_ptr ent; + try { + ent = entry::Entry::create(loadJson(path)); + } catch(std::exception& e) { + if(std::filesystem::directory_entry(path).exists()) { + throw std::runtime_error("Invalid json: " + path.string()); + } else { + throw std::runtime_error("No such file nor directory: " + path.string()); + } + } + std::shared_ptr t = std::dynamic_pointer_cast(ent); + if(! t) { + throw std::runtime_error("Wrong instance type: " + ent->getType()); + } + return t; + } + + int parseInt(const std::string& s); + template std::shared_ptr loadDFromJson(const nlohmann::json& data) { try { return std::shared_ptr(new D(loadJson(data["type"], data["name"]), data)); @@ -78,4 +100,34 @@ namespace utils { std::string getCostString(int coppers); std::string toOrdinal(std::size_t number); + + template std::vector json2vec(const nlohmann::json& data) { + using std::begin; using std::end; + return std::vector(begin(data), end(data)); + } + + template std::vector> jsonList2ptrvec(const std::string& type, const std::vector& names) { + std::vector> ret; + for(auto name : names) { + auto j = utils::loadJson(type, name); + ret.push_back(std::shared_ptr(new T(j, j))); + } + return ret; + } + + template std::vector> json2ptrvec(const nlohmann::json& data) { + std::vector> ret; + for(nlohmann::json d : data) { + ret.push_back(T::create(d)); + } + return ret; + } + + template std::vector ptrvec2json(std::vector src) { + std::vector ret; + for(T i : src) { + ret.push_back(i->toJson()); + } + return ret; + } } -- cgit v1.2.3