60 lines
987 B
C
60 lines
987 B
C
|
///
|
||
|
/// \file Commander.h
|
||
|
/// \author kyle
|
||
|
/// \created 2023-10-10
|
||
|
/// \brief Subprogram tooling.
|
||
|
|
||
|
#include <map>
|
||
|
#include <functional>
|
||
|
#include <string>
|
||
|
#include <vector>
|
||
|
|
||
|
|
||
|
#ifndef KLIB_COMMANDER_H
|
||
|
#define KLIB_COMMANDER_H
|
||
|
|
||
|
namespace klib {
|
||
|
|
||
|
|
||
|
typedef std::function<bool(int, char **)> CommanderFunc;
|
||
|
|
||
|
|
||
|
class Subcommand {
|
||
|
public:
|
||
|
enum class Status : uint8_t {
|
||
|
OK = 0,
|
||
|
NotEnoughArgs = 1,
|
||
|
Failed = 2,
|
||
|
CommandNotRegistered = 3,
|
||
|
};
|
||
|
|
||
|
Subcommand(std::string name, int argc, CommanderFunc func)
|
||
|
: fn(func), args(argc), command(name)
|
||
|
{}
|
||
|
|
||
|
std::string Name() { return this->command; }
|
||
|
Status Run(int argc, char **argv);
|
||
|
private:
|
||
|
CommanderFunc fn;
|
||
|
int args;
|
||
|
std::string command;
|
||
|
};
|
||
|
|
||
|
/// Commander does this.
|
||
|
///
|
||
|
/// Longer description...
|
||
|
class Commander {
|
||
|
public:
|
||
|
Commander();
|
||
|
|
||
|
bool Register(Subcommand scmd);
|
||
|
Subcommand::Status Run(std::string command, int argc, char **argv);
|
||
|
private:
|
||
|
std::map<std::string, Subcommand *> cmap;
|
||
|
};
|
||
|
|
||
|
} // klib
|
||
|
|
||
|
|
||
|
#endif //KLIB_COMMANDER_H
|