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		md, err = b.templatize(md)
59		if err != nil {
60			return ErrMsg{err}
61		}
62	}
63	md, err = b.glamourize(md)
64	if err != nil {
65		return ErrMsg{err}
66	}
67	b.readmeViewport.Viewport.GotoTop()
68	b.readmeViewport.Viewport.SetContent(md)
69	return nil
70}
71
72func (b *Bubble) templatize(mdt string) (string, error) {
73	t, err := template.New("readme").Parse(mdt)
74	if err != nil {
75		return "", err
76	}
77	buf := &bytes.Buffer{}
78	err = t.Execute(buf, b.templateObject)
79	if err != nil {
80		return "", err
81	}
82	return buf.String(), nil
83}
84
85func (b *Bubble) glamourize(md string) (string, error) {
86	tr, err := glamour.NewTermRenderer(
87		glamour.WithAutoStyle(),
88		glamour.WithWordWrap(b.readmeViewport.Viewport.Width),
89	)
90	if err != nil {
91		return "", err
92	}
93	mdt, err := tr.Render(md)
94	if err != nil {
95		return "", err
96	}
97	return mdt, nil
98}