xref: /openbmc/kcsbridge/src/args.cpp (revision e0602aaf7c721438bba08b3a5edaedaa3e427346)
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