/
renderer.go
69 lines (58 loc) · 1.32 KB
/
renderer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package tui
import (
"bytes"
"os"
"github.com/alecthomas/chroma/quick"
"github.com/charmbracelet/glamour"
"github.com/charmbracelet/lipgloss"
"golang.org/x/term"
)
type Renderer interface {
Render(string) (string, error)
}
type JSONRenderer struct {
}
func (r *JSONRenderer) Render(text string) (string, error) {
out := bytes.NewBuffer(nil)
if err := quick.Highlight(out, string(text), "json", "terminal256", "monokai"); err != nil {
return "", err
}
return out.String(), nil
}
type TextRenderer struct {
Style lipgloss.Style
}
func (r *TextRenderer) Render(text string) (string, error) {
return r.Style.Render(text), nil
}
type MarkdownRender struct {
}
func (r MarkdownRender) Render(text string) (string, error) {
// use the markdown renderer to render the response
md, err := glamour.NewTermRenderer(
// detect background color and pick either the default dark or light theme
glamour.WithAutoStyle(),
)
if err != nil {
return "", err
}
if term.IsTerminal(int(os.Stdout.Fd())) {
return md.Render(text)
} else {
return text, nil
}
}
func NewRenderer(name string) Renderer {
var renderer Renderer
switch name {
case "text":
renderer = &TextRenderer{}
case "markdown":
renderer = &MarkdownRender{}
case "json":
renderer = &JSONRenderer{}
default:
renderer = &MarkdownRender{}
}
return renderer
}