-
Notifications
You must be signed in to change notification settings - Fork 0
/
human_readable_printers.go
78 lines (67 loc) · 2.05 KB
/
human_readable_printers.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
package printer
import (
"bytes"
"fmt"
"regexp"
"text/template"
"github.com/Masterminds/sprig"
"github.com/mimuret/dpfctl/pkg/utils"
)
var (
humanReadablePrinters = humanReadablePrintersMap{}
baseArgsTemplateRgexp = regexp.MustCompile("{{([^{}]*)}}")
)
type HumanReadablePrinter interface {
GetHeaders() []interface{}
GetRow(interface{}) []interface{}
}
func GetHumanReadablePrinter(name string) HumanReadablePrinter {
return humanReadablePrinters[name]
}
func SetHumanReadablePrinter(name string, hPrinter HumanReadablePrinter) {
humanReadablePrinters[name] = hPrinter
}
type humanReadablePrintersMap map[string]HumanReadablePrinter
func SetBaseHumanReadablePrinter(name string, headers []string, argsTemplate []string) {
// baseArgsTemplateRgexp := regexp.MustCompile("{{([^{}]*)}}")
// matches := baseArgsTemplateRgexp.FindAllStringSubmatch(argsTemplateStr, -1)
rowTemplate := []*template.Template{}
for _, argTemplate := range argsTemplate {
t := template.Must(template.New("").Funcs(sprig.TxtFuncMap()).Parse(argTemplate))
rowTemplate = append(rowTemplate, t)
}
SetHumanReadablePrinter(name, &BaseHumanReadablePrinter{
Headers: headers,
RowTemplate: rowTemplate,
})
}
type BaseHumanReadablePrinter struct {
Headers []string
RowTemplate []*template.Template
}
func (h *BaseHumanReadablePrinter) GetHeaders() []interface{} {
return utils.StringSliceToInterfaceSlice(h.Headers)
}
func (h *BaseHumanReadablePrinter) GetRow(i interface{}) []interface{} {
res := []interface{}{}
buf := bytes.NewBuffer(nil)
for _, t := range h.RowTemplate {
if err := t.Execute(buf, i); err != nil {
res = append(res, err)
} else {
res = append(res, buf.String())
}
buf.Reset()
}
return res
}
func NewGoTemplateBasePrinter(templateStr string) (*BaseHumanReadablePrinter, error) {
t, err := template.New("").Funcs(sprig.TxtFuncMap()).Parse(templateStr)
if err != nil {
return nil, fmt.Errorf("failed to parse template: %w", err)
}
return &BaseHumanReadablePrinter{
Headers: []string{},
RowTemplate: []*template.Template{t},
}, nil
}