polybar-dwm/include/components/command_line.hpp

82 lines
1.9 KiB
C++
Raw Normal View History

2016-06-15 03:32:35 +00:00
#pragma once
#include "common.hpp"
2016-11-19 05:22:44 +00:00
POLYBAR_NS
2016-06-15 03:32:35 +00:00
namespace command_line {
DEFINE_ERROR(argument_error);
DEFINE_ERROR(value_error);
2016-06-15 03:32:35 +00:00
class option;
using choices = vector<string>;
using options = vector<option>;
using values = map<string, string>;
// class definition : option {{{
class option {
public:
string flag;
string flag_long;
string desc;
string token;
const choices values;
2016-06-15 03:32:35 +00:00
2016-11-25 07:42:31 +00:00
explicit option(string flag, string flag_long, string desc, string token = "", const choices c = {})
: flag(flag), flag_long(flag_long), desc(desc), token(token), values(c) {}
2016-06-15 03:32:35 +00:00
};
// }}}
// class definition : parser {{{
class parser {
public:
2016-11-25 07:42:31 +00:00
explicit parser(const string& synopsis, const options& opts) : m_synopsis(synopsis), m_opts(opts) {}
2016-06-15 03:32:35 +00:00
2016-11-02 19:22:45 +00:00
void usage() const;
void process_input(const vector<string>& values);
bool has(const string& option) const;
string get(string opt) const;
bool compare(string opt, string val) const;
2016-06-15 03:32:35 +00:00
protected:
2016-11-02 19:22:45 +00:00
auto is_short(string option, string opt_short) const;
auto is_long(string option, string opt_long) const;
auto is(string option, string opt_short, string opt_long) const;
auto parse_value(string input, string input_next, choices values) const;
void parse(string input, string input_next = "");
2016-06-15 03:32:35 +00:00
private:
string m_synopsis;
options m_opts;
values m_optvalues;
bool m_skipnext = false;
};
// }}}
}
2016-11-02 19:22:45 +00:00
using cliparser = command_line::parser;
using clioption = command_line::option;
using clioptions = command_line::options;
namespace {
/**
* Configure injection module
*/
2016-11-02 19:22:45 +00:00
template <class T = cliparser>
di::injector<T> configure_cliparser(string scriptname, const clioptions& opts) {
// clang-format off
return di::make_injector(
di::bind<>().to("Usage: " + scriptname + " bar_name [OPTION...]"),
di::bind<>().to(opts));
// clang-format on
}
}
2016-11-19 05:22:44 +00:00
POLYBAR_NS_END