diff --git a/builder/build.go b/builder/build.go index 10f99e3..eaef1c2 100644 --- a/builder/build.go +++ b/builder/build.go @@ -17,7 +17,6 @@ import ( . "lcthw.dev/go/ttarpit/debug" ) -type ErrorHandler func (data.ErrInfo) const ( START=0 @@ -29,16 +28,19 @@ const ( type Builder struct { settings config.Config OnError ErrorHandler + OnPass PassHandler BuildState int HadErrors bool } -func New(settings config.Config, handler ErrorHandler) (*Builder) { +type ErrorHandler func (data.ErrInfo) +type PassHandler func () + +func New(settings config.Config) (*Builder) { builder := new(Builder) builder.settings = settings - builder.OnError = handler return builder } @@ -65,6 +67,8 @@ func (build *Builder) ParseErrInfo(line string, reg *regexp.Regexp) (data.ErrInf info.Message = matches[reg.SubexpIndex("Message")] + info.Raw = matches[0] + return info, true } @@ -90,6 +94,13 @@ func (build *Builder) LaunchLogger(in io.Reader, out io.Writer, err error) { }() } +func (build *Builder) SetOnError(errhandler ErrorHandler) { + build.OnError = errhandler +} + +func (build *Builder) SetOnPass(passhandler PassHandler) { + build.OnPass = passhandler +} func (build *Builder) LaunchProcess(proc *config.Process) { proc.ExecCmd = exec.Command(proc.Command, proc.Args...) @@ -145,6 +156,7 @@ func (build *Builder) EndBuild() { build.BuildState = FAILED } else { build.BuildState = PASSED + build.OnPass() } } diff --git a/data/types.go b/data/types.go index 261c4a9..e581293 100644 --- a/data/types.go +++ b/data/types.go @@ -6,5 +6,6 @@ type ErrInfo struct { Col int ErrType string Message string + Raw string } diff --git a/game/engine.go b/game/engine.go index 980877b..2f19221 100644 --- a/game/engine.go +++ b/game/engine.go @@ -3,6 +3,7 @@ package game import ( "lcthw.dev/go/ttarpit/config" "lcthw.dev/go/ttarpit/data" + "lcthw.dev/go/ttarpit/builder" . "lcthw.dev/go/ttarpit/debug" "time" ) @@ -14,6 +15,7 @@ type Game struct { Errors int StartTime time.Time EndTime time.Time + ErrorLog []data.ErrInfo } func New(settings config.Config) *Game { @@ -33,11 +35,17 @@ func New(settings config.Config) *Game { return game } -func (game *Game) TakeHit(errinfo data.ErrInfo) { +func (game *Game) BuildPass() { + game.ErrorLog = game.ErrorLog[:0] +} + +func (game *Game) TakeHit(build *builder.Builder, errinfo data.ErrInfo) { Log.Println("!!!!!!!!!!!!!!!!!", errinfo) game.Errors++ game.HP-- + game.ErrorLog = append(game.ErrorLog, errinfo) + Log.Println("============== PROCESS EXIT") Log.Printf("==== HP: %d Errors: %d =====\n", game.HP, game.Errors) diff --git a/main.go b/main.go index a1d40ba..d549e66 100644 --- a/main.go +++ b/main.go @@ -15,8 +15,14 @@ func main() { g := game.New(settings) - build := builder.New(settings, func (errinfo data.ErrInfo) { - g.TakeHit(errinfo) + build := builder.New(settings) + + build.SetOnError(func (errinfo data.ErrInfo) { + g.TakeHit(build, errinfo) + }) + + build.SetOnPass(func () { + g.BuildPass() }) go build.WatchDir() diff --git a/ui.go b/ui.go index b08cdc3..c048613 100644 --- a/ui.go +++ b/ui.go @@ -64,7 +64,10 @@ func (ui *UI) Render(data *game.Game, build *builder.Builder) { ui.StyleText(0, 5, "Build: FAILED", red) } - // show the errors + for i := len(data.ErrorLog) - 1 ; i >= 0; i-- { + errinfo := data.ErrorLog[i] + ui.DrawText(0, 8 + (i % 10), errinfo.Raw) + } ui.Screen.Show() }