135 lines
3.2 KiB
Go
135 lines
3.2 KiB
Go
package tasks
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/LazyBachelor/LazyPM/internal/app"
|
|
"github.com/LazyBachelor/LazyPM/internal/models"
|
|
"github.com/LazyBachelor/LazyPM/pkg/repl"
|
|
"github.com/LazyBachelor/LazyPM/pkg/task"
|
|
"github.com/LazyBachelor/LazyPM/pkg/tui"
|
|
"github.com/LazyBachelor/LazyPM/pkg/web"
|
|
"github.com/charmbracelet/huh"
|
|
)
|
|
|
|
type App = app.App
|
|
type Config = models.Config
|
|
type ValidationFeedback = models.ValidationFeedback
|
|
|
|
type Issue = models.Issue
|
|
type IssueFilter = models.IssueFilter
|
|
|
|
type Questions = models.Questions
|
|
type TaskDetails = models.TaskDetails
|
|
|
|
type Interface = task.Interface
|
|
type InterfaceType = models.InterfaceType
|
|
|
|
func NewIssueBuilder() *models.IssueBuilder {
|
|
return models.NewIssueBuilder().
|
|
WithStatus(models.StatusOpen).
|
|
WithIssueType(models.TypeTask)
|
|
}
|
|
|
|
const (
|
|
InterfaceTypeCLI = models.InterfaceTypeCLI
|
|
InterfaceTypeTUI = models.InterfaceTypeTUI
|
|
InterfaceTypeWeb = models.InterfaceTypeWeb
|
|
InterfaceTypeREPL = models.InterfaceTypeREPL
|
|
)
|
|
|
|
func InterfaceToType(it Interface) InterfaceType {
|
|
switch it.(type) {
|
|
case *repl.REPL:
|
|
return InterfaceTypeREPL
|
|
case *tui.Tui:
|
|
return InterfaceTypeTUI
|
|
case *web.Web:
|
|
return InterfaceTypeWeb
|
|
default:
|
|
return InterfaceType("unknown")
|
|
}
|
|
}
|
|
|
|
func BaseDetails() TaskDetails {
|
|
return TaskDetails{
|
|
Title: "Base Task",
|
|
Description: "This is a base task.",
|
|
TimeToComplete: "10m",
|
|
Difficulty: "Easy",
|
|
}
|
|
}
|
|
|
|
func BaseConfig() Config {
|
|
return models.BaseConfig
|
|
}
|
|
|
|
func ClearIssues(app *App) error {
|
|
return app.Issues.DeleteIssues()
|
|
}
|
|
|
|
func BaseQuestions(interfaceType InterfaceType) Questions {
|
|
var taskRating int
|
|
return 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 Question(fields ...huh.Field) *huh.Group {
|
|
return huh.NewGroup(fields...)
|
|
}
|
|
|
|
func ReplQuestion(interfaceType InterfaceType, fields ...huh.Field) *huh.Group {
|
|
if interfaceType != InterfaceTypeREPL {
|
|
return nil
|
|
}
|
|
return huh.NewGroup(fields...)
|
|
}
|
|
|
|
func WebQuestion(interfaceType InterfaceType, fields ...huh.Field) *huh.Group {
|
|
if interfaceType != InterfaceTypeWeb {
|
|
return nil
|
|
}
|
|
return huh.NewGroup(fields...)
|
|
}
|
|
|
|
func TUIQuestion(interfaceType InterfaceType, fields ...huh.Field) *huh.Group {
|
|
if interfaceType != InterfaceTypeTUI {
|
|
return nil
|
|
}
|
|
return huh.NewGroup(fields...)
|
|
}
|
|
|
|
// FetchIssues retrieves all issues from the app and returns those that are relevant for validation,
|
|
// excluding the setup issue. It also updates the setup issue with the latest data from the app.
|
|
func FetchIssues(ctx context.Context, app *app.App, setupIssue *models.Issue) ([]*models.Issue, error) {
|
|
issues, err := app.Issues.SearchIssues(ctx, "", models.IssueFilter{})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var relevantIssues []*models.Issue
|
|
for _, issue := range issues {
|
|
if issue.ID != setupIssue.ID {
|
|
relevantIssues = append(relevantIssues, issue)
|
|
} else {
|
|
*setupIssue = *issue
|
|
}
|
|
}
|
|
|
|
return relevantIssues, nil
|
|
}
|