From 4d6b70fb6a2c6cb3456e6014bcd9daff687c840b Mon Sep 17 00:00:00 2001 From: Robin Olsen Date: Wed, 18 Feb 2026 19:32:17 +0100 Subject: [PATCH] add some helpers to simplify task creation --- cmd/survey/runner.go | 19 +----- cmd/survey/tasks/base.go | 101 ++++++++++++++++++++++++++++++++ cmd/survey/tasks/codingTask.go | 38 ++++-------- cmd/survey/tasks/createIssue.go | 33 +++-------- pkg/task/types.go | 13 +--- 5 files changed, 126 insertions(+), 78 deletions(-) create mode 100644 cmd/survey/tasks/base.go diff --git a/cmd/survey/runner.go b/cmd/survey/runner.go index 15545d5..3e213f1 100644 --- a/cmd/survey/runner.go +++ b/cmd/survey/runner.go @@ -6,14 +6,12 @@ import ( "fmt" "math/rand" - "github.com/LazyBachelor/LazyPM/pkg/cli/repl" + "github.com/LazyBachelor/LazyPM/cmd/survey/tasks" "github.com/LazyBachelor/LazyPM/pkg/task" - "github.com/LazyBachelor/LazyPM/pkg/tui" - "github.com/LazyBachelor/LazyPM/pkg/web" ) func runTask(ctx context.Context, t task.Tasker, i task.Interface) error { - return task.RunTask(ctx, t, i, InterfaceToType(i)) + return task.RunTask(ctx, t, i, tasks.InterfaceToType(i)) } func taskLoop(ctx context.Context, surveyTasks []task.Tasker, interfaces map[string]task.Interface) error { @@ -37,19 +35,6 @@ func taskLoop(ctx context.Context, surveyTasks []task.Tasker, interfaces map[str return nil } -func InterfaceToType(it task.Interface) task.InterfaceType { - switch it.(type) { - case *repl.REPL: - return task.InterfaceCLI - case *tui.Tui: - return task.InterfaceTUI - case *web.Web: - return task.InterfaceWeb - default: - return task.InterfaceType("unknown") - } -} - func returnIfUserQuit(err error, msg string) error { if errors.Is(err, task.ErrUserQuit) { return nil diff --git a/cmd/survey/tasks/base.go b/cmd/survey/tasks/base.go new file mode 100644 index 0000000..ea9adf3 --- /dev/null +++ b/cmd/survey/tasks/base.go @@ -0,0 +1,101 @@ +package tasks + +import ( + "github.com/LazyBachelor/LazyPM/pkg/cli/repl" + "github.com/LazyBachelor/LazyPM/pkg/task" + taskui "github.com/LazyBachelor/LazyPM/pkg/task/ui" + "github.com/LazyBachelor/LazyPM/pkg/tui" + "github.com/LazyBachelor/LazyPM/pkg/web" + "github.com/charmbracelet/huh" +) + +const ( + InterfaceTUI task.InterfaceType = "tui" + InterfaceREPL task.InterfaceType = "repl" + InterfaceWeb task.InterfaceType = "web" +) + +func InterfaceToType(it task.Interface) task.InterfaceType { + switch it.(type) { + case *repl.REPL: + return InterfaceREPL + case *tui.Tui: + return InterfaceTUI + case *web.Web: + return InterfaceWeb + default: + return task.InterfaceType("unknown") + } +} + +func BaseDetails() taskui.TaskDetails { + return taskui.TaskDetails{ + Title: "Base Task", + Description: "This is a base task.", + TimeToComplete: "10m", + Difficulty: "Easy", + } +} + +func BaseConfig() task.TaskConfig { + return task.TaskConfig{ + IssuePrefix: "pm", + BeadsDBPath: "./.pm/db.db", + StatisticsStoragePath: "./.pm/stats.json", + WebAddress: ":8080", + } +} + +func BaseQuestions(interfaceType task.InterfaceType) taskui.Questions { + var taskRating int + return taskui.Questions{ + huh.NewGroup( + huh.NewConfirm(). + Title("Did you complete the task?"), + ), + huh.NewGroup( + huh.NewSelect[int]().Value(&taskRating). + Options( + huh.NewOption("Very easy", 1), + huh.NewOption("Easy", 2), + huh.NewOption("Moderate", 3), + huh.NewOption("Hard", 4), + ). + Title("How difficult was the task?"), + ), + } +} + +func AppendGroup(questions *taskui.Questions, group *huh.Group) taskui.Questions { + *questions = append(*questions, group) + return *questions +} + +func AppendQuestion(questions *taskui.Questions, interfaceType task.InterfaceType, field ...huh.Field) taskui.Questions { + *questions = append(*questions, huh.NewGroup(field...)) + return *questions +} + +func AppendReplQuestion(questions *taskui.Questions, interfaceType task.InterfaceType, field ...huh.Field) taskui.Questions { + if interfaceType != InterfaceREPL { + return *questions + } + *questions = append(*questions, huh.NewGroup(field...)) + return *questions +} + +func AppendWebQuestion(questions *taskui.Questions, interfaceType task.InterfaceType, field ...huh.Field) taskui.Questions { + if interfaceType != InterfaceWeb { + return *questions + } + *questions = append(*questions, huh.NewGroup(field...)) + return *questions +} + +func AppendTUIQuestion(questions *taskui.Questions, interfaceType task.InterfaceType, field ...huh.Field) taskui.Questions { + if interfaceType != InterfaceTUI { + return *questions + } + *questions = append(*questions, huh.NewGroup(field...)) + return *questions +} diff --git a/cmd/survey/tasks/codingTask.go b/cmd/survey/tasks/codingTask.go index 419f34a..ad741c8 100644 --- a/cmd/survey/tasks/codingTask.go +++ b/cmd/survey/tasks/codingTask.go @@ -6,7 +6,6 @@ import ( "github.com/LazyBachelor/LazyPM/internal/service" "github.com/LazyBachelor/LazyPM/pkg/task" taskui "github.com/LazyBachelor/LazyPM/pkg/task/ui" - "github.com/charmbracelet/huh" ) const codingDescription = `You are tasked with writing a simple function. @@ -23,37 +22,22 @@ func NewCodingTask(svc *service.Services) *CodingTask { } func (t *CodingTask) Config() task.TaskConfig { - return task.TaskConfig{ - IssuePrefix: "pm", - BeadsDBPath: "./.pm/db.db", - StatisticsStoragePath: "./.pm/coding-stats.json", - WebAddress: ":8080", - } + config := BaseConfig() + config.StatisticsStoragePath = "./.pm/coding-task-stats.json" + return config } func (t *CodingTask) Details() taskui.TaskDetails { - return taskui.TaskDetails{ - Title: "Coding Task", - Description: codingDescription, - TimeToComplete: "10m", - Difficulty: "Easy", - } + details := BaseDetails() + details.Title = "Coding Task" + details.Description = codingDescription + return details } -func (t *CodingTask) Questions(interfaceType task.InterfaceType) taskui.Questions { - return taskui.Questions{ - huh.NewGroup(huh.NewConfirm().Title("Did you complete the coding task?")), - huh.NewGroup( - huh.NewSelect[int](). - Options( - huh.NewOption("Very easy", 1), - huh.NewOption("Easy", 2), - huh.NewOption("Moderate", 3), - huh.NewOption("Hard", 4), - ). - Title("How difficult was the task?"), - ), - } +func (t *CodingTask) Questions(interfaceType task.InterfaceType) (questions taskui.Questions) { + questions = append(questions, BaseQuestions(interfaceType)...) + + return questions } func (t *CodingTask) Setup(ctx context.Context) error { diff --git a/cmd/survey/tasks/createIssue.go b/cmd/survey/tasks/createIssue.go index 184d194..f4f1c73 100644 --- a/cmd/survey/tasks/createIssue.go +++ b/cmd/survey/tasks/createIssue.go @@ -8,7 +8,6 @@ import ( "github.com/LazyBachelor/LazyPM/internal/service" "github.com/LazyBachelor/LazyPM/pkg/task" taskui "github.com/LazyBachelor/LazyPM/pkg/task/ui" - "github.com/charmbracelet/huh" ) const description = `You are tasked with creating a new issue in the project management system. @@ -26,35 +25,21 @@ func NewCreateIssueTask(svc *service.Services) *CreateIssueTask { } func (t *CreateIssueTask) Config() task.TaskConfig { - return task.TaskConfig{ - IssuePrefix: "pm", - BeadsDBPath: "./.pm/db.db", - StatisticsStoragePath: "./.pm/task-1-stats.json", - WebAddress: ":8080", - } + config := BaseConfig() + config.StatisticsStoragePath = "./.pm/create-issue-stats.json" + return config } func (t *CreateIssueTask) Details() taskui.TaskDetails { - return taskui.TaskDetails{ - Title: "Create Issue Task", - Description: "Create a new issue in the project management system...", - TimeToComplete: "15m", - Difficulty: "Hard", - } + details := BaseDetails() + details.Title = "Create Issue Task" + details.Description = description + return details } func (t *CreateIssueTask) Questions(interfaceType task.InterfaceType) taskui.Questions { - return taskui.Questions{ - huh.NewGroup(huh.NewConfirm().Title("Was this good")), - huh.NewGroup( - huh.NewSelect[int](). - Options( - huh.NewOption("Very good", 1), - huh.NewOption("Very Bad", 2), - ). - Title("How good was it?"), - ), - } + questions := BaseQuestions(interfaceType) + return questions } func (t *CreateIssueTask) Setup(ctx context.Context) error { diff --git a/pkg/task/types.go b/pkg/task/types.go index 9287c6a..abffe0e 100644 --- a/pkg/task/types.go +++ b/pkg/task/types.go @@ -9,21 +9,12 @@ import ( ) type TaskConfig = service.Config - -var ErrUserQuit = fmt.Errorf("user quit") +type InterfaceType string type Interface interface { Run(context.Context, TaskConfig) error } -type InterfaceType string - -const ( - InterfaceTUI InterfaceType = "tui" - InterfaceCLI InterfaceType = "repl" - InterfaceWeb InterfaceType = "web" -) - type Tasker interface { Config() TaskConfig Details() taskui.TaskDetails @@ -41,3 +32,5 @@ type ValidatedInterface interface { Interface SetChannels(feedbackChan chan ValidationFeedback, quitChan chan bool) } + +var ErrUserQuit = fmt.Errorf("user quit")