commands.go

 1package tui
 2
 3import (
 4	"fmt"
 5	"log"
 6	"soft-serve/config"
 7	"soft-serve/tui/bubbles/repo"
 8	"soft-serve/tui/bubbles/selection"
 9	"time"
10
11	tea "github.com/charmbracelet/bubbletea"
12	"github.com/charmbracelet/lipgloss"
13	"github.com/muesli/termenv"
14)
15
16type errMsg struct{ err error }
17
18func (e errMsg) Error() string {
19	return e.err.Error()
20}
21
22func (b *Bubble) setupCmd() tea.Msg {
23	if b.config == nil || b.config.Source == nil {
24		return errMsg{err: fmt.Errorf("config not set")}
25	}
26	ct := time.Now()
27	lipgloss.SetColorProfile(termenv.ANSI256)
28	b.repos = b.config.Source.AllRepos()
29	mes := append([]MenuEntry{}, b.repoMenu...)
30	rs := make([]string, 0)
31OUTER:
32	for _, r := range b.repos {
33		for _, me := range mes {
34			if r.Name == me.Repo {
35				continue OUTER
36			}
37		}
38		mes = append(mes, MenuEntry{Name: r.Name, Repo: r.Name})
39	}
40	if len(mes) == 0 {
41		return errMsg{fmt.Errorf("no repos found")}
42	}
43	var tmplConfig *config.Config
44	for _, me := range mes {
45		if me.Repo == "config" {
46			tmplConfig = b.config
47		}
48		width := b.width
49		boxLeftWidth := b.styles.Menu.GetWidth() + b.styles.Menu.GetHorizontalFrameSize()
50		// TODO: also send this along with a tea.WindowSizeMsg
51		var heightMargin = lipgloss.Height(b.headerView()) +
52			lipgloss.Height(b.footerView()) +
53			b.styles.RepoBody.GetVerticalFrameSize() +
54			b.styles.App.GetVerticalMargins()
55		rb := repo.NewBubble(b.config.Source, me.Repo, b.styles, width, boxLeftWidth, b.height, heightMargin, tmplConfig)
56		rb.Host = b.config.Host
57		rb.Port = b.config.Port
58		initCmd := rb.Init()
59		msg := initCmd()
60		switch msg := msg.(type) {
61		case repo.ErrMsg:
62			return errMsg{fmt.Errorf("missing %s: %s", me.Repo, msg.Error)}
63		}
64		me.bubble = rb
65		b.repoMenu = append(b.repoMenu, me)
66		rs = append(rs, me.Name)
67	}
68	b.repoSelect = selection.NewBubble(rs, b.styles)
69	b.boxes[0] = b.repoSelect
70	ir := -1
71	if b.initialRepo != "" {
72		for i, me := range b.repoMenu {
73			if me.Repo == b.initialRepo {
74				ir = i
75			}
76		}
77	}
78	if ir == -1 {
79		b.boxes[1] = b.repoMenu[0].bubble
80		b.activeBox = 0
81	} else {
82		b.boxes[1] = b.repoMenu[ir].bubble
83		b.repoSelect.SelectedItem = ir
84		b.activeBox = 1
85	}
86	b.state = loadedState
87	log.Printf("App bubble loaded in %s", time.Since(ct))
88	return nil
89}