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

87 lines
2.1 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 class BuildState {
START, WAITING, BUILDING, DONE, FORKING, READING,
EXIT, ERROR
};
enum BuildEvent {
GO, QUIT, CRASH
};
class Builder : DeadSimpleFSM<BuildState, BuildEvent> {
// FOUND BUG: this was interesting, it got copied but the gui kept working until the refactor
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;
std::future<string> read_fut;
std::mutex fsm_mutex;
git_repository* repo = nullptr;
public:
Builder(GUI &g, GameEngine &engine);
MatchResult parse_line(const string &line);
string read_line(FILE *build_out, bool &done_out);
FILE *start_command(string &build_cmd);
void event(BuildEvent ev) {
try {
if(ev == QUIT) {
exit(ev);
}
switch(_state) {
FSM_STATE(BuildState, BUILDING, building, ev);
FSM_STATE(BuildState, START, start, ev);
FSM_STATE(BuildState, WAITING, waiting, ev);
FSM_STATE(BuildState, DONE, done, ev);
FSM_STATE(BuildState, FORKING, forking, ev);
FSM_STATE(BuildState, READING, reading, ev);
FSM_STATE(BuildState, EXIT, exit, ev);
FSM_STATE(BuildState, ERROR, exit, ev);
}
} catch(...) {
fmt::println("ERROR: unhandled state: {}", int(_state));
error(ev);
}
}
void building(BuildEvent ev);
void start(BuildEvent ev);
void waiting(BuildEvent ev);
void done(BuildEvent ev);
void forking(BuildEvent ev);
void reading(BuildEvent ev);
void error(BuildEvent ev);
void exit(BuildEvent ev);
};