/
renderer.go
129 lines (114 loc) · 2.34 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
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package go_benchpress
import (
"fmt"
"golang.org/x/tools/benchmark/parse"
"io"
)
// ===== RenderType =====
type RenderType int
const (
PNG RenderType = iota
SVG
JSON
CSV
XML
)
func (r RenderType) String() string {
switch r {
case PNG:
return "PNG"
case SVG:
return "SVG"
case JSON:
return "JSON"
case CSV:
return "CSV"
case XML:
return "XML"
default:
return fmt.Sprintf("Unknown (%d)", r)
}
}
// Renderer provides an instance of a Renderer for the RenderType - for instance, a JSONRenderer for JSON.
// If there is no matching Renderer for the RenderType, an ErrUnknownRenderType is returned.
func (r RenderType) Renderer(title string) (Renderer, error) {
switch r {
case PNG, SVG:
return NewRasterRenderer(title, r), nil
case JSON:
return &JSONRenderer{}, nil
case CSV:
return &CSVRenderer{}, nil
case XML:
return &XMLRenderer{}, nil
default:
return nil, ErrUnknownRenderType
}
}
func (r RenderType) FileExtension() string {
switch r {
case PNG:
return ".png"
case SVG:
return ".svg"
case JSON:
return ".json"
case CSV:
return ".csv"
case XML:
return ".xml"
default:
return ""
}
}
func RenderTypeFromString(str string) (RenderType, error) {
switch str {
case "PNG":
return PNG, nil
case "SVG":
return SVG, nil
case "JSON":
return JSON, nil
case "CSV":
return CSV, nil
case "XML":
return XML, nil
default:
return -1, fmt.Errorf("render type %q not supported: %w", str, ErrUnknownRenderType)
}
}
// ===== RenderDimension =====
type RenderDimension int
const (
RenderNsPerOp RenderDimension = iota
RenderBytesPerOp
RenderAllocsPerOp
)
func (r RenderDimension) String() string {
switch r {
case RenderNsPerOp:
return "NS_PER_OP"
case RenderBytesPerOp:
return "BYTES_PER_OP"
case RenderAllocsPerOp:
return "ALLOCS_PER_OP"
default:
return fmt.Sprintf("Unknown (%d)", r)
}
}
func RenderDimensionFromString(str string) (RenderDimension, error) {
switch str {
case "NS_PER_OP":
return RenderNsPerOp, nil
case "BYTES_PER_OP":
return RenderBytesPerOp, nil
case "ALLOCS_PER_OP":
return RenderAllocsPerOp, nil
default:
return -1, fmt.Errorf("render dimension %q not supported: %w", str, ErrUnknownDimensionType)
}
}
// ===== Renderer =====
type Renderer interface {
Render(writer io.Writer, parentBenchmark string, dimension RenderDimension, benchmarks []parse.Benchmark) error
}