#include #include #include #include #include #include "config.h" #include "tclap/CmdLine.h" #include "json.hpp" #include "bottles.hpp" #include "cellar.hpp" #include "commands.hpp" #include "output.hpp" #include "version.hpp" using namespace std; using namespace cellar; using json = nlohmann::json; void cellar::print_header() { output::statement("cellar - bottle management tool for WINE connoisseurs"); output::statement(version::short_version()); } int main(int argc, char* argv[]) { if (argc == 1) { print_header(); cout << "\n(try \"cellar help\" if you're confused)" << endl; return 0; } try { const string desc = "bottle management tool for WINE connoisseurs"; const string versionstr = version::short_version(); TCLAP::CmdLine cmdparse(desc, ' ', versionstr, false); TCLAP::UnlabeledValueArg command("command", "Specific command to run.", true, "help", "command"); cmdparse.add(command); TCLAP::UnlabeledMultiArg subargs("subargs", "Sub-arguments", false, "", "subarg"); cmdparse.add(subargs); cmdparse.parse(argc, argv); for (auto item : commands::bottles_commands()) { commands::command_map[item.first] = item.second; } string usercmd = command.getValue(); if (commands::command_map.count(usercmd) > 0) { vector subargv; stringstream sstr; sstr << "cellar "; sstr << usercmd; subargv.push_back(sstr.str()); for (auto item : subargs.getValue()) { subargv.push_back(item); } commands::command_map[usercmd](subargv.size(), subargv); } else { stringstream errstr; errstr << "invalid command: " << usercmd; output::error(errstr.str()); return 1; } return 0; } catch (TCLAP::ArgException &exc) { cerr << "Invalid argument. (" << exc.argId() << ": " << exc.error() << ")" << endl; return 1; } }