package interactive import ( "fmt" "github.com/aws/aws-sdk-go/aws" "github.com/charmbracelet/bubbles/key" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/huh" "github.com/siteworxpro/img-proxy-url-generator/config" "github.com/siteworxpro/img-proxy-url-generator/generator" "github.com/urfave/cli/v2" ) type Model struct { Fields []huh.Field generator *generator.Generator url *string format *generator.Format selectedParams *[]UrlParam err error focusField huh.Field inParamsFields bool } type UrlParam interface { value() string display() string key() string Input() huh.Field } func InitialModel(c *cli.Context) Model { m := Model{ url: aws.String(""), selectedParams: &[]UrlParam{}, format: generator.ToPtr(generator.DEF), } fields := make([]huh.Field, 0) fields = append(fields, m.initialFields()...) m.Fields = fields cfg, _ := config.NewConfig(c.String("config")) if cfg == nil { err := fmt.Errorf("config not loaded") m.err = err return m } g, err := generator.NewGenerator(cfg) if err != nil { m.err = err return m } m.generator = g return m } func (m Model) initialFields() []huh.Field { fields := make([]huh.Field, 0) options := []UrlParam{ NewHeight(), NewWidth(), } var huhOptions []huh.Option[UrlParam] for _, option := range options { huhOptions = append(huhOptions, huh.NewOption[UrlParam](option.display(), option)) } fields = append(fields, huh.NewInput(). Key("imgUrl"). Description("The URL of the image to generate a proxy for."). Title("Image URL"). Value(m.url). Prompt("Enter the image URL:"), ) fields = append(fields, huh.NewMultiSelect[UrlParam](). Description("Params to add to the URL."). Options(huhOptions...). Value(m.selectedParams). WithKeyMap(&huh.KeyMap{ MultiSelect: huh.MultiSelectKeyMap{ Up: key.NewBinding(key.WithKeys("up"), key.WithHelp("up", "up")), Down: key.NewBinding(key.WithKeys("down"), key.WithHelp("down", "down")), Toggle: key.NewBinding(key.WithKeys(" "), key.WithHelp(" ", "toggle")), }, }), ) fields = append(fields, huh.NewSelect[generator.Format](). Description("Convert the image format."). Options( huh.NewOption[generator.Format]("JPEG", generator.JPG), huh.NewOption[generator.Format]("PNG", generator.PNG), huh.NewOption[generator.Format]("BMP", generator.BMP), huh.NewOption[generator.Format]("Default", generator.DEF), ). Key("format"). Title("Format"). Value(m.format). WithKeyMap(&huh.KeyMap{ Select: huh.SelectKeyMap{ Up: key.NewBinding(key.WithKeys("up"), key.WithHelp("up", "up")), Down: key.NewBinding(key.WithKeys("down"), key.WithHelp("down", "down")), }, }), ) return fields } func (m Model) Init() tea.Cmd { return nil }