@ -2,6 +2,7 @@
# include "dbc.hpp"
# include "watcher.hpp"
# include "game_engine.hpp"
# include "coro.hpp"
# include <chrono> // for milliseconds
# include <efsw/efsw.hpp>
# include <fmt/chrono.h>
@ -16,7 +17,6 @@
# include <stdio.h>
# include <stdlib.h> // for EXIT_SUCCESS
# include <string> // for operator+, to_string
# include <thread> // for sleep_for
# include <unistd.h>
# include <vector>
# include <nlohmann/json.hpp>
@ -36,24 +36,32 @@ Builder::Builder(GUI &g, GameEngine &engine) : gui(g), game(engine) {
config [ " build_cmd " ] . template get_to < string > ( build_cmd ) ;
}
void Builder : : run_build ( ) {
Task < unsigned > Builder : : run_build ( ) {
regex err_re ( " (.*?) : ( [ 0 - 9 ] + ) : ( [ 0 - 9 ] + ) : \ \ s * ( . * ? ) : \ \ s * ( . * ) \ n * " ) ;
char buffer [ BUF_MAX ] ; // BUF_MAX is a define already?
ofstream stats_out ;
co_await Pass { } ;
stats_out . open ( " stats.csv " , ios : : out | ios : : app ) ;
std : : time_t tstamp = std : : time ( nullptr ) ;
dbc : : check ( stats_out . good ( ) , " Error opening stats.csv file. " ) ;
dbc : : pre ( " simple test " , [ & ] ( ) { return stats_out . good ( ) ; } ) ;
co_yield 1 ;
// need to catch the error message when the command is bad
FILE * build_out = popen ( build_cmd . c_str ( ) , " r " ) ;
dbc : : check ( build_out ! = nullptr , " Failed to run command. " ) ;
co_yield 2 ;
game . start_round ( ) ;
while ( fgets ( buffer , BUF_MAX , build_out ) ! = nullptr ) {
co_yield 3 ;
string line ( buffer ) ; // yeah, that's probably a problem
cerr < < buffer ;
@ -82,8 +90,11 @@ void Builder::run_build() {
gui . you_died ( ) ;
}
}
co_yield 4 ;
}
co_yield 3 ;
game . end_round ( ) ;
int rc = pclose ( build_out ) ;
@ -96,6 +107,8 @@ void Builder::run_build() {
stats_out . close ( ) ;
dbc : : post ( " a post test " , [ & ] ( ) { return ! stats_out . is_open ( ) ; } ) ;
co_return 1000 ;
}
void Builder : : run ( ) {
@ -117,22 +130,28 @@ void Builder::run() {
gui . output ( format ( " Watching directory {} for changes... " , git_path ) ) ;
efsw : : WatchID wid = fileWatcher - > addWatch ( git_path , listener , true ) ;
auto build_task = run_build ( ) ;
int rc = gui . main_loop ( game , [ & ] {
fileWatcher - > watch ( ) ;
if ( listener - > changes ) {
gui . building ( ) ;
std : : this_thread : : sleep_for ( std : : chrono : : milliseconds ( 100 ) ) ;
gui . output ( format ( " CHANGES! Running build {} " , build_cmd ) ) ;
run_build ( ) ;
if ( ! build_task . done ( ) ) {
unsigned point = build_task ( ) ;
} else {
if ( game . is_dead ( ) ) {
gui . output ( " !!!! YOU DIED! !!!! Learn to code luser. " ) ;
game . reset ( ) ;
game . reset ( )
}
listener - > reset_state ( ) ;
gui . output ( " ^^^^^^^^^^^ END ^^^^^^^^^^^ " ) ;
build_task . destroy ( ) ;
build_task = run_build ( ) ;
}
}
return 0 ;