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