Files
rph/cmd/template/configUi.go
Squibid 12cefa9092 feat: inital commit
- added template subcmd which generates frc project templates
2025-10-14 23:48:14 -04:00

160 lines
3.5 KiB
Go

package template
import (
"errors"
"fmt"
"log/slog"
"os"
"strconv"
"github.com/charmbracelet/huh"
)
var _dummyGroup = huh.NewGroup(huh.NewNote().Title("Dummy"))
type _fieldWrapper struct {
Visible func() (bool)
Field huh.Field
}
func _buildGroups(groups ...*huh.Group) []*huh.Group {
var visibleGroups []*huh.Group
for _, g := range groups {
if g != _dummyGroup {
visibleGroups = append(visibleGroups, g)
}
}
return visibleGroups
}
func _buildGroup(fields ..._fieldWrapper) *huh.Group {
var visibleFields []huh.Field
for _, f := range fields {
if f.Visible() {
visibleFields = append(visibleFields, f.Field)
}
}
if len(visibleFields) > 0 {
return huh.NewGroup(visibleFields...)
}
return _dummyGroup
}
func openConfigUi(opts TemplateOptions) (TemplateOptions, error) {
var lang string = opts.Lang
var projectType string = opts.ProjectType
var dir string = opts.Dir
var team string
tmp := strconv.FormatUint(opts.Team, 10)
if tmp != "0" {
team = tmp
}
var desktopSupport bool
if opts.DesktopSupport != nil {
desktopSupport = *opts.DesktopSupport
}
// Display form with selected theme.
err := huh.NewForm(
_buildGroups(
_buildGroup(
_fieldWrapper{
Visible: func() bool { return lang == "" },
Field: huh.NewSelect[string]().
OptionsFunc(func() []huh.Option[string] {
langs, err := GetLangs()
if err != nil {
slog.Error("Unable to get languages", "error", err)
os.Exit(1)
}
opts := make([]huh.Option[string], len(langs))
for i, e := range langs {
opts[i] = huh.Option[string]{Value: e, Key: e}
}
return opts
}, nil).
Description("Choose your desired language").
Value(&lang).
Height(4),
},
_fieldWrapper{
Visible: func() bool { return projectType == "" },
Field: huh.NewSelect[string]().
OptionsFunc(func() []huh.Option[string] {
if lang == "" {
return []huh.Option[string]{}
}
projects, err := GetProjects(lang)
if err != nil {
slog.Error("Unable to get project types", "error", err)
os.Exit(1)
}
opts := make([]huh.Option[string], len(projects))
for i, e := range projects {
opts[i] = huh.Option[string]{Value: e, Key: e}
}
return opts
}, &lang).
Description("Choose your project type").
Value(&projectType),
},
).Title("Project Language & Type"),
_buildGroup(
_fieldWrapper{
Visible: func() bool { return dir == "" },
Field: huh.NewInput().
Title("Project Path").
Placeholder("This is the full path to the project").
Value(&dir),
},
_fieldWrapper{
Visible: func() bool { return team == "" },
Field: huh.NewInput().
Title("Team Number").
Placeholder("Your teams number").
Value(&team).
Validate(func(s string) error {
_, err := strconv.Atoi(s)
if err != nil {
return errors.New("must be a number")
}
return nil
}),
},
_fieldWrapper{
Visible: func() bool { return opts.DesktopSupport == nil },
Field: huh.NewConfirm().
Title("Enable Desktop Support?").
Value(&desktopSupport),
},
).Title("Project Setup Information"),
)...,
).Run()
if err != nil {
if err == huh.ErrUserAborted {
os.Exit(130)
}
fmt.Println(err)
os.Exit(1)
}
teamnr, _ := strconv.ParseUint(team, 10, 64)
return TemplateOptions{
Lang: lang,
ProjectType: projectType,
Dir: dir,
Team: teamnr,
DesktopSupport: &desktopSupport,
}, nil
}