A weird game.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
turings-tarpit/builder.hpp

83 lines
1.7 KiB

#pragma once
#include "gui.hpp"
#include "game_engine.hpp"
#include <stdio.h>
#include "fsm.hpp"
#include <efsw/efsw.hpp>
#include <future>
#include <stdio.h>
#include "watcher.hpp"
using std::string;
struct MatchResult {
bool match = false;
string file_name = "";
string lnumber = "";
string col = "";
string type = "";
string message = "";
};
enum BuildState {
START, WAITING, BUILDING, DONE, STARTING, READING,
EXIT, ERROR
};
enum BuildEvent {
GO, QUIT, CRASH
};
class Builder : DeadSimpleFSM<BuildState, BuildEvent> {
GUI gui;
GameEngine game;
string git_path = "NOT SET";
string build_cmd = "NOT SET";
efsw::FileWatcher* fileWatcher = NULL;
UpdateListener* listener = NULL;
efsw::WatchID wid;
FILE *build_out = NULL;
bool build_done = false;
string line = "";
std::future<FILE *> build_fut;
git_repository* repo = nullptr;
public:
Builder(GUI &g, GameEngine &engine);
MatchResult parse_line(const string &line);
void run();
void event(BuildEvent ev) override {
try {
if(ev == QUIT) {
exit(ev);
}
switch(_state) {
FSM_STATE(BUILDING, building, ev);
FSM_STATE(START, start, ev);
FSM_STATE(WAITING, waiting, ev);
FSM_STATE(DONE, done, ev);
FSM_STATE(STARTING, starting, ev);
FSM_STATE(READING, reading, ev);
FSM_STATE(EXIT, exit, ev);
FSM_STATE(ERROR, exit, ev);
}
} catch(...) {
error(ev);
}
}
void building(BuildEvent ev);
void start(BuildEvent ev);
void waiting(BuildEvent ev);
void done(BuildEvent ev);
void starting(BuildEvent ev);
void reading(BuildEvent ev);
void error(BuildEvent ev);
void exit(BuildEvent ev);
};