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}