1 #pragma once
2 
3 #include <map>
4 
5 #include "common.hpp"
6 #include "errors.hpp"
7 
8 POLYBAR_NS
9 
10 namespace command_line {
11   DEFINE_ERROR(argument_error);
12   DEFINE_ERROR(value_error);
13 
14   class option;
15   using choices = vector<string>;
16   using options = vector<option>;
17   using values = std::map<string, string>;
18   using posargs = vector<string>;
19 
20   // class definition : option {{{
21 
22   class option {
23    public:
24     string flag;
25     string flag_long;
26     string desc;
27     string token;
28     const choices values;
29 
option(string && flag,string && flag_long,string && desc,string && token="",const choices && c={})30     explicit option(string&& flag, string&& flag_long, string&& desc, string&& token = "", const choices&& c = {})
31         : flag(forward<string>(flag))
32         , flag_long(forward<string>(flag_long))
33         , desc(forward<string>(desc))
34         , token(forward<string>(token))
35         , values(forward<const choices>(c)) {}
36   };
37 
38   // }}}
39   // class definition : parser {{{
40 
41   class parser {
42    public:
43     using make_type = unique_ptr<parser>;
44     static make_type make(string&& scriptname, const options&& opts);
45 
46     explicit parser(string&& synopsis, const options&& opts);
47 
48     void usage() const;
49 
50     void process_input(const vector<string>& values);
51 
52     bool has(const string& option) const;
53     bool has(size_t index) const;
54     string get(string opt) const;
55     string get(size_t index) const;
56     bool compare(string opt, const string& val) const;
57     bool compare(size_t index, const string& val) const;
58 
59    protected:
60     auto is_short(const string& option, const string& opt_short) const;
61     auto is_long(const string& option, const string& opt_long) const;
62     auto is(const string& option, string opt_short, string opt_long) const;
63 
64     auto parse_value(string input, const string& input_next, choices values) const;
65     void parse(const string& input, const string& input_next = "");
66 
67    private:
68     string m_synopsis{};
69     const options m_opts;
70     values m_optvalues{};
71     posargs m_posargs{};
72     bool m_skipnext{false};
73   };
74 
75   // }}}
76 }
77 
78 POLYBAR_NS_END
79