1 #pragma once
2 
3 #include <getopt.h>
4 
5 #include <map>
6 #include <string>
7 
8 namespace phosphor
9 {
10 namespace led
11 {
12 /** @brief Class - Encapsulates parsing command line options and
13  *                 populating arguments
14  */
15 class ArgumentParser
16 {
17   public:
18     ArgumentParser() = delete;
19     ~ArgumentParser() = default;
20     ArgumentParser(const ArgumentParser&) = delete;
21     ArgumentParser& operator=(const ArgumentParser&) = delete;
22     ArgumentParser(ArgumentParser&&) = default;
23     ArgumentParser& operator=(ArgumentParser&&) = default;
24 
25     /** @brief Constructs Argument object
26      *
27      *  @param argc - the main function's argc passed as is
28      *  @param argv - the main function's argv passed as is
29      *  @return Object constructed
30      */
31     // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays)
32     ArgumentParser(int argc, char* argv[]);
33 
34     /** @brief Given a option, returns its argument(optarg) */
35     const std::string& operator[](const std::string& opt);
36 
37     /** @brief Displays usage */
38     // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays)
39     static void usage(char* argv[]);
40 
41   private:
42     /** @brief Option to argument mapping */
43     std::map<const std::string, std::string> arguments;
44 
45     /** @brief Array of struct options as needed by getopt_long */
46     // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays)
47     static inline const option options[] = {
48         {"path", required_argument, nullptr, 'p'},
49         {"help", no_argument, nullptr, 'h'},
50         {nullptr, 0, nullptr, 0},
51     };
52 
53     /** @brief optstring as needed by getopt_long */
54     static inline const char* const optionstr = "p:?h";
55 };
56 
57 } // namespace led
58 } // namespace phosphor
59