diff options
Diffstat (limited to 'apps/apps.h')
-rw-r--r-- | apps/apps.h | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/apps/apps.h b/apps/apps.h index 8173c51..7569a9f 100644 --- a/apps/apps.h +++ b/apps/apps.h @@ -3,27 +3,53 @@ #include <boost/program_options.hpp> #include <log4cplus/logger.h> #include <log4cplus/loggingmacros.h> +#include "json.hpp" +#include <exception> namespace trygvis { namespace apps { namespace po = boost::program_options; +using namespace log4cplus; + +using json = nlohmann::json; + +class missing_key : public std::runtime_error { +public: + missing_key(const json::string_t key) : runtime_error("Missing key: " + key), key(key) { + } + + const json::string_t key; +}; + +template<typename T> +T get(json j, std::string key) { + auto ref = j[key]; + + if (ref.is_null()) { + throw missing_key(key); + } + + return ref; +} class app_execution { public: - app_execution(po::options_description desc, po::variables_map vm) : desc(desc), vm(vm) { + app_execution(po::options_description desc, po::variables_map vm, Logger logger) : desc(desc), vm(vm), logger(logger) { } - po::options_description desc; - po::variables_map vm; + const po::options_description desc; + const po::variables_map vm; + const log4cplus::Logger logger; void usage(); }; class app { public: - app(std::string app_name): _app_name(app_name), logger(log4cplus::Logger::getInstance(LOG4CPLUS_TEXT(app_name))) { + app(std::string app_name) : app_name(app_name) { } + virtual ~app() = default; virtual void add_options(po::options_description_easy_init &options) { @@ -34,13 +60,9 @@ public: virtual int main(app_execution &execution) = 0; -protected: - const std::string _app_name; - const log4cplus::Logger logger; + const std::string app_name; }; -int launch_app(int argc, char *argv[], app &app); - std::string get_hostname(); template<typename T> |