class Menu {
public:
typedef int (*Menu_f)(void);
static void Register(const std::string &s, Menu_f f) {
Menu() : function_lookup() {}
Menu(const string &s) : Menu() {
std::fstream f(s);
Read(f);
}
void Start() const { get_callback("main")(); }
void Read(std::istream &is);
Menu &Register(const string &s, Menu_f f) {
function_lookup.insert({s, f});
return *this;
}
static void Start() { get_callback("main")(); }
static void Read(std::istream &is);
private:
Menu() = delete;
struct Menu_item {
const std::string prompt;
const std::string callback;
const string prompt;
const string callback;
Menu_item(const std::string &p, const std::string &c)
: prompt(p), callback(c) {}
Menu_item(const string &p, const string &c) : prompt(p), callback(c) {}
Menu_item(const json &j) : Menu_item(j["prompt"], j["callback"]) {}
};
struct Menu_function {
Menu_function(const std::string &n, const std::vector<Menu_item> &i)
: name(n), items(i) {}
Menu_function(const Menu &m, const string &n, const vector<Menu_item> &i)
: menu(m), name(n), items(i) {}
int call() const;
int display() const;
private:
const std::string name;
const std::vector<Menu_item> items;
const Menu &menu;
const string name;
const vector<Menu_item> items;
};
struct Menu_callback {