From d592ee191e8aedc84c670e6d818fcf97c0bd7a92 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Wed, 17 Jan 2018 13:32:13 +0100 Subject: Configuration creates missing items based on defaults --- lib/settings/configuration.h | 50 +++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 28 deletions(-) (limited to 'lib/settings/configuration.h') diff --git a/lib/settings/configuration.h b/lib/settings/configuration.h index 4fc614e..67ba7b1 100644 --- a/lib/settings/configuration.h +++ b/lib/settings/configuration.h @@ -9,26 +9,20 @@ #ifndef CONFIGURATION_H #define CONFIGURATION_H +#include #include #include #include -namespace libconfig -{ -class Config; -class Setting; -} - class Configuration { public: - Configuration(); + explicit Configuration(const std::string &path, const std::string &home); ~Configuration(); - bool readUserConfiguration(const std::string &path); + bool read(); bool parse(const std::string &contents); - bool writeUserConfiguration(const std::string &path); - bool writeIfNeeded(); + bool writeIfNeeded(const std::string &path = std::string()); bool parseDefaultConfiguration(const std::string &contents); @@ -38,39 +32,39 @@ public: void resetValue(const char *path); template - std::optional value(const char *path) const; + std::optional value(const char *path) const + { + // if setting doesn't exist, give back a nullopt + if(!m_userCfg->exists(path)) { + const_cast(this)->resetValue(path); + return value(path); + } + + const libconfig::Setting &v = m_userCfg->lookup(path); + if constexpr(std::is_same_v) + return std::optional(castToString(v)); + else + return std::optional(static_cast(v)); + } template bool setValue(std::string path, const T &val); private: + std::string castToString(const libconfig::Setting &v) const; + bool changed = false; + std::string m_homePath; std::string m_userCfgPath; libconfig::Config *m_userCfg, *m_defaultCfg; }; // replace ~ with home -std::string &patchHome(std::string &path, const std::string &home); +std::string patchHome(const std::string &path, const std::string &home); // instantiate functions // this needs to be done because the implementation is in the cpp file -// Settings::value<> -extern template std::optional Configuration::value(const char *path) const; -extern template std::optional Configuration::value(const char *path) const; -extern template std::optional Configuration::value(const char *path) const; -extern template std::optional Configuration::value(const char *path) const; - -extern template std::optional Configuration::value(const char *path) const; -extern template std::optional Configuration::value(const char *path) const; - -extern template std::optional Configuration::value(const char *path) const; -extern template std::optional Configuration::value(const char *path) const; - -extern template std::optional Configuration::value(const char *path) const; - -extern template std::optional Configuration::value(const char *path) const; - // Settings::setValue<> extern template bool Configuration::setValue(std::string path, const int &val); extern template bool Configuration::setValue(std::string path, const unsigned int &val); -- cgit v1.2.1