//----------------------------------------------------------------------------- // ___ __ _ _ // / _ \__ _ _ __ ___ ___ / /(_)_ __ | | __ // / /_)/ _` | '__/ __|/ _ \/ / | | '_ \| |/ / // / ___/ (_| | | \__ \ __/ /__| | | | | < // \/ \__,_|_| |___/\___\____/_|_| |_|_|\_\ . // //----------------------------------------------------------------------------- // Author: Kurt Sassenrath // Module: Client // // Client entrypoint. Should load config. // // Copyright (c) 2023 Kurt Sassenrath. // // License TBD. //----------------------------------------------------------------------------- #include "client.h" #include "parselink/logging.h" #include "parselink/utility/argparse.h" namespace { parselink::logging::logger logger("main"); using level = parselink::logging::level; int run(std::span arg_list) { argparse::command_line_parser parser({ {"server", {std::string{"localhost"}}}, {"server_port", {std::uint16_t{9001}}}, {"websocket_port", {std::uint16_t{10501}}}, {"websocket_server", {std::string{"localhost"}}}, {"verbose", {false}}, }); auto v = parser.try_parse(arg_list) .map([](decltype(parser)::result args) { if (args.opt("verbose")) { logger.set_threshold(level::trace); } parselink::client::config cfg; cfg.server_address = args.opt("server"); cfg.server_port = args.opt("server_port"); cfg.websocket_port = args.opt("websocket_port"); cfg.websocket_address = args.opt("websocket_server"); return parselink::client::create_and_run(cfg); }) .map([](auto err) { return err.value(); }) .map_error([](auto ec) { return int(std::errc::invalid_argument); }); return v ? *v : v.error(); } } // namespace int main(int argc, char* argv[]) { // TODO(ksassenrath): Add configuration file to the mix. std::vector args; for (int i = 1; i < argc; ++i) { args.emplace_back(argv[i]); } return run(args); }