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}