1 #include "args.hpp"
2
3 #include <getopt.h>
4
5 #include <format>
6 #include <stdexcept>
7
8 namespace kcsbridge
9 {
10
Args(int argc,char * argv[])11 Args::Args(int argc, char* argv[])
12 {
13 static const char opts[] = ":c:";
14 static const struct option longopts[] = {
15 {"channel", required_argument, nullptr, 'c'},
16 {nullptr, 0, nullptr, 0},
17 };
18 int c;
19 optind = 0;
20 while ((c = getopt_long(argc, argv, opts, longopts, nullptr)) > 0)
21 {
22 switch (c)
23 {
24 case 'c':
25 channel = optarg;
26 break;
27 case ':':
28 throw std::runtime_error(
29 std::format("Missing argument for `{}`", argv[optind - 1]));
30 break;
31 default:
32 throw std::runtime_error(std::format(
33 "Invalid command line argument `{}`", argv[optind - 1]));
34 }
35 }
36 if (optind != argc)
37 {
38 throw std::invalid_argument("Requires no additional arguments");
39 }
40 if (channel == nullptr)
41 {
42 throw std::invalid_argument("Missing KCS channel");
43 }
44 }
45
46 } // namespace kcsbridge
47