-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrender.go
97 lines (80 loc) · 2.51 KB
/
render.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package tablex
import (
"github.com/jedib0t/go-pretty/v6/table"
)
// DefaultEmptyValue default value for nullable columns
const DefaultEmptyValue = "null"
const RenderFormatTable RenderFormat = "table"
const RenderFormatCSV RenderFormat = "csv"
const RenderFormatHTML RenderFormat = "html"
const RenderFormatMD RenderFormat = "markdown"
const DefaultRenderFormat = RenderFormatTable
type RenderFormat string
// Writer is a slice of table.Writer interface
//
//go:generate mockery --output ./mock --name Writer --structname WriterMock
type Writer interface {
AppendRow(row table.Row, configs ...table.RowConfig)
AppendRows(rows []table.Row, configs ...table.RowConfig)
Render() string
RenderCSV() string
RenderHTML() string
RenderMarkdown() string
AppendFooter(row table.Row, configs ...table.RowConfig)
AppendHeader(row table.Row, configs ...table.RowConfig)
}
// Renderer is a main interface of the tablex package
//
//go:generate mockery --output ./mock --name Renderer --structname RendererMock
type Renderer interface {
Render(interface{}) (string, error)
}
// RendererOptions is specific options for tablex behaviour
type RendererOptions struct {
EmptyValue string
Format RenderFormat
}
type tableRenderer struct {
writer Writer
options RendererOptions
}
// NewRenderer returns an structure implemented Renderer interface
// It dependents on Writer interfaces (part of interface in https://github.com/jedib0t/go-pretty/tree/main/table)
func NewRenderer(writer Writer, options ...RendererOptions) Renderer {
var renderOptions RendererOptions
if len(options) != 0 {
renderOptions = options[0]
} else {
renderOptions = RendererOptions{EmptyValue: DefaultEmptyValue, Format: DefaultRenderFormat}
}
return &tableRenderer{writer: writer, options: renderOptions}
}
// Render is a function for build table from structs or collections.
func (r *tableRenderer) Render(obj interface{}) (string, error) {
err := r.appendData(obj)
if err != nil {
return "", err
}
return r.writerRender(), nil
}
func (r *tableRenderer) appendData(obj interface{}) error {
tInfo, err := newTablexInfo(obj, r.options.EmptyValue)
if err != nil {
return err
}
r.writer.AppendHeader(tInfo.headers)
r.writer.AppendRows(tInfo.rowsForObject(obj))
return nil
}
func (r *tableRenderer) writerRender() string {
switch r.options.Format {
case RenderFormatCSV:
return r.writer.RenderCSV()
case RenderFormatHTML:
return r.writer.RenderHTML()
case RenderFormatMD:
return r.writer.RenderMarkdown()
default:
return r.writer.Render()
}
}