commands.go

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