103e6defcSWilliam A. Kennington III #include "args.hpp"
203e6defcSWilliam A. Kennington III
303e6defcSWilliam A. Kennington III #include <getopt.h>
403e6defcSWilliam A. Kennington III
5*e0602aafSPatrick Williams #include <format>
603e6defcSWilliam A. Kennington III #include <stdexcept>
703e6defcSWilliam A. Kennington III
803e6defcSWilliam A. Kennington III namespace kcsbridge
903e6defcSWilliam A. Kennington III {
1003e6defcSWilliam A. Kennington III
Args(int argc,char * argv[])1103e6defcSWilliam A. Kennington III Args::Args(int argc, char* argv[])
1203e6defcSWilliam A. Kennington III {
1303e6defcSWilliam A. Kennington III static const char opts[] = ":c:";
1403e6defcSWilliam A. Kennington III static const struct option longopts[] = {
1503e6defcSWilliam A. Kennington III {"channel", required_argument, nullptr, 'c'},
1603e6defcSWilliam A. Kennington III {nullptr, 0, nullptr, 0},
1703e6defcSWilliam A. Kennington III };
1803e6defcSWilliam A. Kennington III int c;
1903e6defcSWilliam A. Kennington III optind = 0;
2003e6defcSWilliam A. Kennington III while ((c = getopt_long(argc, argv, opts, longopts, nullptr)) > 0)
2103e6defcSWilliam A. Kennington III {
2203e6defcSWilliam A. Kennington III switch (c)
2303e6defcSWilliam A. Kennington III {
2403e6defcSWilliam A. Kennington III case 'c':
2503e6defcSWilliam A. Kennington III channel = optarg;
2603e6defcSWilliam A. Kennington III break;
2703e6defcSWilliam A. Kennington III case ':':
2803e6defcSWilliam A. Kennington III throw std::runtime_error(
29*e0602aafSPatrick Williams std::format("Missing argument for `{}`", argv[optind - 1]));
3003e6defcSWilliam A. Kennington III break;
3103e6defcSWilliam A. Kennington III default:
32*e0602aafSPatrick Williams throw std::runtime_error(std::format(
3303e6defcSWilliam A. Kennington III "Invalid command line argument `{}`", argv[optind - 1]));
3403e6defcSWilliam A. Kennington III }
3503e6defcSWilliam A. Kennington III }
3603e6defcSWilliam A. Kennington III if (optind != argc)
3703e6defcSWilliam A. Kennington III {
3803e6defcSWilliam A. Kennington III throw std::invalid_argument("Requires no additional arguments");
3903e6defcSWilliam A. Kennington III }
4003e6defcSWilliam A. Kennington III if (channel == nullptr)
4103e6defcSWilliam A. Kennington III {
4203e6defcSWilliam A. Kennington III throw std::invalid_argument("Missing KCS channel");
4303e6defcSWilliam A. Kennington III }
4403e6defcSWilliam A. Kennington III }
4503e6defcSWilliam A. Kennington III
4603e6defcSWilliam A. Kennington III } // namespace kcsbridge
47