26enum class ConsoleCommandGroup { GENERAL, NAVIGATION, STATE, WATCH, SIMULATION, LOGGING, MISC, USER };
57 ConsoleCommand(std::string str_long, std::string str_short, std::string str_help, ConsoleCommandGroup group,
58 std::function<
bool(std::string& cmd_str)> func) :
60 str_short_(str_short),
67 ConsoleCommand(std::string str_long, std::string str_short, std::string str_help, ConsoleCommandGroup group,
68 ExecutionType exec_type, std::function<
bool(std::string& cmd_str)> func_serial,
69 std::function<
bool(std::string& cmd_str)> func_thread,
70 std::function<
bool(std::string& cmd_str)> func_rank_serial,
71 std::function<
bool(std::string& cmd_str)> func_rank_parallel,
72 std::function<
bool(std::vector<std::string>& tokens)> func_remote) :
74 str_short_(str_short),
77 exec_type_(exec_type),
78 func_serial_(func_serial),
79 func_thread_(func_thread),
80 func_rank_serial_(func_rank_serial),
81 func_rank_parallel_(func_rank_parallel),
82 func_remote_(func_remote)
85 if ( exec_type_ == ExecutionType::SERIAL ) {
89 else if ( exec_type_ == ExecutionType::THREAD ) {
93 else if ( exec_type_ == ExecutionType::RANK_SERIAL ) {
94 func_ = func_rank_serial_;
98 func_ = func_rank_parallel_;
103 ConsoleCommand(std::string str_long) :
105 str_short_(str_long),
106 str_help_(
"user defined command"),
107 group_(ConsoleCommandGroup::USER)
111 const std::string& str_long()
const {
return str_long_; }
112 const std::string& str_short()
const {
return str_short_; }
113 const std::string& str_help()
const {
return str_help_; }
114 void setUserHelp(std::string& help) { str_help_ = help; }
115 const ConsoleCommandGroup& group()
const {
return group_; }
117 bool exec(std::string& cmd_str) {
return func_(cmd_str); }
118 bool exec_serial(std::string& cmd_str) {
return func_serial_(cmd_str); }
119 bool exec_thread(std::string& cmd_str) {
return func_thread_(cmd_str); }
120 bool exec_rank_serial(std::string& cmd_str) {
return func_rank_serial_(cmd_str); }
121 bool exec_rank_parallel(std::string& cmd_str) {
return func_rank_parallel_(cmd_str); }
122 bool exec_remote(std::vector<std::string>& tokens) {
return func_remote_(tokens); }
123 bool match(
const std::string& token)
125 std::string lctoken = toLower(token);
126 if ( lctoken.size() == str_long_.size() && lctoken == toLower(str_long_) )
return true;
127 if ( lctoken.size() == str_short_.size() && lctoken == toLower(str_short_) )
return true;
130 friend std::ostream& operator<<(std::ostream& os,
const ConsoleCommand c)
132 os << c.str_long_ <<
" (" << c.str_short_ <<
") " << c.str_help_;
137 std::string str_long_;
138 std::string str_short_;
139 std::string str_help_;
140 ConsoleCommandGroup group_;
141 ExecutionType exec_type_;
143 std::function<bool(std::string& cmd_str)> func_;
144 std::function<bool(std::string& cmd_str)> func_serial_;
145 std::function<bool(std::string& cmd_str)> func_thread_;
146 std::function<bool(std::string& cmd_str)> func_rank_serial_;
147 std::function<bool(std::string& cmd_str)> func_rank_parallel_;
148 std::function<bool(std::vector<std::string>& tokens)> func_remote_;
150 std::string toLower(std::string s)
152 std::transform(s.begin(), s.end(), s.begin(), ::tolower);
158class CommandHistoryBuffer
161 const int MAX_CMDS = 200;
162 CommandHistoryBuffer() { buf_.resize(MAX_CMDS); }
163 void append(std::string s);
165 std::vector<std::string>& getBuffer();
166 enum BANG_RC { INVALID, ECHO_ONLY, EXEC, NOP };
167 BANG_RC bang(
const std::string& token, std::string& newcmd);
168 void enable(
bool en) { en_ = en; }
176 std::vector<std::pair<std::size_t, std::string>> buf_;
177 std::vector<std::string> stringBuffer_;
179 bool findEvent(
const std::string& s, std::string& newcmd);
180 bool findOffset(
const std::string& s, std::string& newcmd);
181 bool searchFirst(
const std::string& s, std::string& newcmd);
182 bool searchAny(
const std::string& s, std::string& newcmd);
191 CommandRegistry(
const std::vector<ConsoleCommand> in) :
195 std::vector<ConsoleCommand>& getRegistryVector() {
return registry; }
196 std::vector<ConsoleCommand>& getUserRegistryVector() {
return user_registry; }
197 enum SEARCH_TYPE { ALL, BUILTIN, USER };
198 std::pair<ConsoleCommand, bool>
const seek(std::string token, SEARCH_TYPE search_type);
200 bool beginUserCommand(std::string name);
201 void appendUserCommand(std::string token0, std::string line);
202 void commitUserCommand();
203 std::vector<std::string>* userCommandInsts(std::string key)
205 if ( user_defined_commands.find(key) == user_defined_commands.end() )
return nullptr;
206 return &user_defined_commands[key];
209 bool beginDocCommand(std::string name);
210 void appendDocCommand(std::string line);
211 void commitDocCommand();
212 bool commandIsEmpty(
const std::string key)
214 if ( user_defined_commands.find(key) == user_defined_commands.end() )
return true;
215 if ( user_defined_commands[key].size() == 0 )
return true;
220 void addHelp(std::string key, std::vector<std::string>& vec);
222 std::map<std::string, std::string> cmdHelp;
226 std::vector<ConsoleCommand> registry = {};
228 std::vector<ConsoleCommand> user_registry = {};
229 std::map<std::string, std::vector<std::string>> user_defined_commands = {};
230 std::string user_command_wip =
"";
231 std::vector<std::string> user_doc_wip = {};
234 std::pair<ConsoleCommand, bool> last_seek_command = {};