bubble.go

 1package repo
 2
 3import (
 4	"bytes"
 5	"smoothie/git"
 6	"text/template"
 7
 8	"github.com/charmbracelet/bubbles/viewport"
 9	tea "github.com/charmbracelet/bubbletea"
10	"github.com/charmbracelet/glamour"
11)
12
13type ErrMsg struct {
14	Error error
15}
16
17type Bubble struct {
18	templateObject interface{}
19	repoSource     *git.RepoSource
20	name           string
21	repo           *git.Repo
22	readmeViewport *ViewportBubble
23}
24
25func NewBubble(rs *git.RepoSource, name string, width int, height int, tmp interface{}) *Bubble {
26	return &Bubble{
27		templateObject: tmp,
28		repoSource:     rs,
29		name:           name,
30		readmeViewport: &ViewportBubble{
31			Viewport: &viewport.Model{
32				Width:  width,
33				Height: height,
34			},
35		},
36	}
37}
38
39func (b *Bubble) Init() tea.Cmd {
40	return b.setupCmd
41}
42
43func (b *Bubble) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
44	return b.readmeViewport.Update(msg)
45}
46
47func (b *Bubble) View() string {
48	return b.readmeViewport.View()
49}
50
51func (b *Bubble) setupCmd() tea.Msg {
52	r, err := b.repoSource.GetRepo(b.name)
53	if err != nil {
54		return ErrMsg{err}
55	}
56	md := r.Readme
57	if b.templateObject != nil {
58		t, err := template.New("readme").Parse(md)
59		if err != nil {
60			return ErrMsg{err}
61		}
62		buf := &bytes.Buffer{}
63		err = t.Execute(buf, b.templateObject)
64		if err != nil {
65			return ErrMsg{err}
66		}
67		md = buf.String()
68	}
69	md, err = b.glamourize(md)
70	if err != nil {
71		return ErrMsg{err}
72	}
73	b.readmeViewport.Viewport.GotoTop()
74	b.readmeViewport.Viewport.SetContent(md)
75	return nil
76}
77
78func (b *Bubble) templatize(t string) (string, error) {
79	return "", nil
80}
81
82func (b *Bubble) glamourize(md string) (string, error) {
83	tr, err := glamour.NewTermRenderer(
84		glamour.WithAutoStyle(),
85		glamour.WithWordWrap(b.readmeViewport.Viewport.Width),
86	)
87	if err != nil {
88		return "", err
89	}
90	mdt, err := tr.Render(md)
91	if err != nil {
92		return "", err
93	}
94	return mdt, nil
95}