NX 1.0.3
niu2x's base c++ helper library
载入中...
搜索中...
未找到
cmd_parser.h
浏览该文件的文档.
1#pragma once
2
3#include <nx/type.h>
4
5namespace nx::cmd {
6
12
14
20
25
28
30
31class CmdParser;
32using Handler = Function<int(const CmdParser*)>;
33
39
40class NX_API CmdParser {
41public:
44 int handle_cmd(int argc, const char* const argv[]);
45
46 template <class T>
47 T get(const String& key) const
48 {
49 auto it = arg_values_.find(key);
50 if (it == arg_values_.end()) {
51 NX_PANIC("no such argument %s", key.c_str());
52 }
53 return std::get<T>(it->second);
54 }
55
56private:
57 ProgramArgument argument_;
58 ArgumentValueMap arg_values_;
59 void show_usage(const char* program_name);
60};
61
62class NX_API CmdParserBuilder {
63public:
66 CmdParserBuilder& add_argument(const char* name, ArgumentType type);
67
68 CmdParserBuilder& add_argument(const char* name,
69 ArgumentType type,
70 ArgumentValue default_value);
71
72 CmdParserBuilder& add_argument(const char* name,
73 ArgumentType type,
74 const char* v)
75 {
76 return add_argument(name, type, String(v));
77 }
78
81
82private:
83 ProgramArgument argument_;
84};
85
86class NX_API Cmd {
87public:
88 Cmd();
89 virtual ~Cmd();
90 virtual int handle_cmd(int argc, const char* const argv[]) = 0;
91};
92
93class NX_API SingleCmd : public Cmd {
94public:
97 int handle_cmd(int argc, const char* const argv[]) override;
98
99private:
100 UniquePtr<CmdParser> parser_;
101};
102
103class NX_API GroupCmd : public Cmd {
104public:
107
108 int handle_cmd(int argc, const char* const argv[]) override;
109 void add_sub_command(const String& name, UniquePtr<Cmd> cmd);
110
111private:
112 Map<String, UniquePtr<Cmd>> sub_commands_;
113};
114
115} // namespace nx::cmd
Definition cmd_parser.h:62
CmdParserBuilder & add_argument(const char *name, ArgumentType type, ArgumentValue default_value)
CmdParserBuilder & set_handler(Handler)
UniquePtr< CmdParser > build()
CmdParserBuilder & add_argument(const char *name, ArgumentType type)
CmdParserBuilder & add_argument(const char *name, ArgumentType type, const char *v)
Definition cmd_parser.h:72
Definition cmd_parser.h:40
T get(const String &key) const
Definition cmd_parser.h:47
int handle_cmd(int argc, const char *const argv[])
CmdParser(ProgramArgument &&argument)
Definition cmd_parser.h:86
virtual int handle_cmd(int argc, const char *const argv[])=0
virtual ~Cmd()
Definition cmd_parser.h:103
int handle_cmd(int argc, const char *const argv[]) override
void add_sub_command(const String &name, UniquePtr< Cmd > cmd)
Definition cmd_parser.h:93
SingleCmd(UniquePtr< CmdParser > parser)
int handle_cmd(int argc, const char *const argv[]) override
Definition cmd_parser.h:5
Map< String, OptionalArgument > OptionalArgumentMap
Definition cmd_parser.h:27
ArgumentType
Definition cmd_parser.h:7
@ BOOLEAN
Definition cmd_parser.h:10
@ STRING
Definition cmd_parser.h:8
@ INT
Definition cmd_parser.h:9
Vector< PositionalArgument > PositionalArgumentList
Definition cmd_parser.h:26
Function< int(const CmdParser *)> Handler
Definition cmd_parser.h:32
Map< String, ArgumentValue > ArgumentValueMap
Definition cmd_parser.h:29
Variant< String, int, bool > ArgumentValue
Definition cmd_parser.h:13
std::string String
Definition type.h:52
std::variant< T... > Variant
Definition type.h:55
std::map< K, V > Map
Definition type.h:64
std::unique_ptr< T > UniquePtr
Definition type.h:58
std::function< T > Function
Definition type.h:67
std::vector< T > Vector
Definition type.h:47
Definition cmd_parser.h:15
String name
Definition cmd_parser.h:16
ArgumentType type
Definition cmd_parser.h:17
ArgumentValue default_value
Definition cmd_parser.h:18
Definition cmd_parser.h:21
ArgumentType type
Definition cmd_parser.h:23
String name
Definition cmd_parser.h:22
Definition cmd_parser.h:34
OptionalArgumentMap optional_arguments
Definition cmd_parser.h:36
Handler handler
Definition cmd_parser.h:37
PositionalArgumentList positional_arguments
Definition cmd_parser.h:35
#define NX_PANIC(msg,...)
panic with a fatal error message.
Definition type.h:262