From 3d183d7fcdd6a740c30f49c0217987a82a1027db Mon Sep 17 00:00:00 2001 From: Robin Olsen Date: Wed, 4 Mar 2026 22:43:28 +0100 Subject: [PATCH] change validation to be submission callback based --- internal/models/app.go | 2 ++ pkg/task/runner.go | 40 +++++++++++----------------------------- pkg/task/validation.go | 7 ++----- pkg/web/handler/task.go | 12 ++++++++++++ 4 files changed, 27 insertions(+), 34 deletions(-) diff --git a/internal/models/app.go b/internal/models/app.go index efeb815..5ba33b1 100644 --- a/internal/models/app.go +++ b/internal/models/app.go @@ -17,6 +17,8 @@ type App struct { CurrentFeedback *ValidationFeedback ActionLogger func(string) + + SubmitChan chan<- struct{} } func (a *App) LogAction(action string) { diff --git a/pkg/task/runner.go b/pkg/task/runner.go index 005a03f..3e25791 100644 --- a/pkg/task/runner.go +++ b/pkg/task/runner.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "log/slog" - "time" "github.com/LazyBachelor/LazyPM/internal/models" tea "github.com/charmbracelet/bubbletea" @@ -69,13 +68,19 @@ func (r *TaskRunner) Run(ctx context.Context, t Tasker, i Interface, iType Inter // Validation feedbackChan := make(chan ValidationFeedback, 10) quitChan := make(chan bool, 1) + submitChan := make(chan struct{}, 1) if validated, ok := i.(ValidatedInterface); ok { validated.SetChannels(feedbackChan, quitChan) + validated.SetSubmitChan(submitChan) + } + + if r.app != nil { + r.app.SubmitChan = submitChan } engine := &ValidationEngine{task: t} - doneChan, stopChan := engine.Start(ctx, func(feedback ValidationFeedback) { + doneChan, stopChan := engine.Start(ctx, submitChan, func(feedback ValidationFeedback) { collector.recordValidation(feedback) if feedback.Success { @@ -84,6 +89,10 @@ func (r *TaskRunner) Run(ctx context.Context, t Tasker, i Interface, iType Inter feedback.Message = "Task not completed!" } + if r.app != nil { + r.app.CurrentFeedback = &feedback + } + select { case feedbackChan <- feedback: default: @@ -195,30 +204,3 @@ func runQuestionnaire(t Tasker, iType InterfaceType, collector *taskRunCollector return nil } - -func startValidationLoop(ctx context.Context, t Tasker, feedbackChan chan ValidationFeedback, doneChan chan bool, quitChan chan bool) { - ticker := time.NewTicker(1 * time.Second) - defer ticker.Stop() - - for { - select { - case <-ticker.C: - feedback := t.Validate(ctx) - if feedback.Success { - if feedback.Message == "" { - feedback.Message = "Task completed successfully! Going back to the survey menu..." - } - feedbackChan <- feedback - time.Sleep(4 * time.Second) - doneChan <- true - return - } - feedback.Message = "Task not completed!" - feedbackChan <- feedback - case <-quitChan: - return - case <-ctx.Done(): - return - } - } -} diff --git a/pkg/task/validation.go b/pkg/task/validation.go index 170c670..f2957e3 100644 --- a/pkg/task/validation.go +++ b/pkg/task/validation.go @@ -9,17 +9,14 @@ type ValidationEngine struct { task Tasker } -func (v *ValidationEngine) Start(ctx context.Context, onFeedback func(ValidationFeedback)) (done <-chan struct{}, stop chan<- struct{}) { +func (v *ValidationEngine) Start(ctx context.Context, submitChan <-chan struct{}, onFeedback func(ValidationFeedback)) (done <-chan struct{}, stop chan<- struct{}) { doneChan := make(chan struct{}, 1) stopChan := make(chan struct{}, 1) go func() { - ticker := time.NewTicker(time.Second) - defer ticker.Stop() - for { select { - case <-ticker.C: + case <-submitChan: feedback := v.task.Validate(ctx) if onFeedback != nil { diff --git a/pkg/web/handler/task.go b/pkg/web/handler/task.go index 6b10a71..dab8086 100644 --- a/pkg/web/handler/task.go +++ b/pkg/web/handler/task.go @@ -13,12 +13,24 @@ import ( type ValidationFeedback = models.ValidationFeedback var taskFeedback ValidationFeedback +var submitChan chan<- struct{} func SetTaskFeedback(feedback ValidationFeedback) { taskFeedback = feedback } +func SetSubmitChan(ch chan<- struct{}) { + submitChan = ch +} + func HandleTaskStatus(w http.ResponseWriter, r *http.Request) { + if submitChan != nil { + select { + case submitChan <- struct{}{}: + default: + } + } + hx := HTMX(r) if hx.IsHxRequest() { hx.WriteString(`` + taskFeedback.Message + ``)