blob: f56da6056d614da0fd7c61fe06fce3103d7a306f [file] [log] [blame]
William A. Kennington III03e6def2021-05-11 15:23:15 -07001#include "args.hpp"
2
William A. Kennington III03e6def2021-05-11 15:23:15 -07003#include <getopt.h>
4
Patrick Williamse0602aa2023-07-17 11:20:00 -05005#include <format>
William A. Kennington III03e6def2021-05-11 15:23:15 -07006#include <stdexcept>
7
8namespace kcsbridge
9{
10
11Args::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(
Patrick Williamse0602aa2023-07-17 11:20:00 -050029 std::format("Missing argument for `{}`", argv[optind - 1]));
William A. Kennington III03e6def2021-05-11 15:23:15 -070030 break;
31 default:
Patrick Williamse0602aa2023-07-17 11:20:00 -050032 throw std::runtime_error(std::format(
William A. Kennington III03e6def2021-05-11 15:23:15 -070033 "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