/* * This file is part of smolbote. It's copyrighted by the contributors recorded * in the version control history of the file, available from its original * location: https://neueland.iserlohn-fortress.net/smolbote.hg * * SPDX-License-Identifier: GPL-3.0 */ #ifndef SMOLBOTE_CONFIGURATION_H #define SMOLBOTE_CONFIGURATION_H #include #include #include #include #include #include #include class Configuration { public: explicit Configuration(); ~Configuration(); static QString defaultUserConfigLocation(); bool read(const QString &path); bool parse(int argc, char **argv); template std::optional value(const char *path) const { // if setting doesn't exist, we crash // in debug builds, check if setting exists #ifdef QT_DEBUG if(vm.count(path) == 0) { qWarning("value(%s) does not exist, probably crashing now", path); } #endif if constexpr(std::is_same_v) { std::string r; try { r = vm[path].as(); } catch(boost::bad_any_cast &) { // try int try { r = std::to_string(vm[path].as()); } catch(boost::bad_any_cast &) { // try bool, and crash if not that either r = vm[path].as() ? "true" : "false"; } } // check if it's a path if(r.front() == '~') { r.replace(0, 1, m_homePath); } return std::optional(r); } else return std::optional(vm[path].as()); } const std::vector> &options() { return desc.options(); } QHash section(const std::string &prefix) const; private: boost::program_options::options_description desc; boost::program_options::variables_map vm; std::string m_homePath; }; #endif // SMOLBOTE_CONFIGURATION_H