-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoption.go
120 lines (98 loc) · 3.19 KB
/
option.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
package greypot
import (
"fmt"
"io/fs"
"time"
"github.com/nndi-oss/greypot/exporter"
"github.com/nndi-oss/greypot/service"
"github.com/nndi-oss/greypot/template/engine"
"github.com/nndi-oss/greypot/template/repo"
"github.com/playwright-community/playwright-go"
)
type GreypotOption func(*Module)
func NewModule(options ...GreypotOption) *Module {
mod := moduleDefaults()
for _, co := range options {
if co == nil {
continue
}
co(mod)
}
mod.TemplateService = service.NewTemplateService(mod.TemplateEngine, mod.TemplateRepository)
mod.ReportService = service.NewReportService(mod.PDFExporter, mod.PNGExporter, mod.TemplateService, "/" /* TODO: remove baseURL param?*/)
return mod
}
func WithRenderTimeout(timeout time.Duration) GreypotOption {
return func(m *Module) {
m.RenderTimeout = timeout
}
}
func WithViewport(width, height int) GreypotOption {
return func(m *Module) {
m.ViewportWidth = width
m.ViewportHeight = height
}
}
func WithTemplatesRepository(repository repo.TemplateRepository) GreypotOption {
return func(m *Module) {
m.TemplateRepository = repository
}
}
func WithTemplateEngine(e engine.TemplateEngine) GreypotOption {
return func(m *Module) {
m.TemplateEngine = e
}
}
func WithGolangTemplateEngine() GreypotOption {
return func(m *Module) {
m.TemplateEngine = engine.NewGolangTemplateEngine()
}
}
func WithDjangoTemplateEngine() GreypotOption {
return func(m *Module) {
m.TemplateEngine = engine.NewDjangoTemplateEngine()
}
}
func WithPlaywrightRenderer(options ...*playwright.RunOptions) GreypotOption {
return func(m *Module) {
err := playwright.Install(options...)
if err != nil {
panic(fmt.Errorf("could not install playwright dependencies (Chromium): %w", err))
}
png := exporter.NewPlaywrightPNGReportExporter(m.RenderTimeout, m.ViewportHeight, m.ViewportWidth)
pdf := exporter.NewPlaywrightPDFReportExporter(m.RenderTimeout, m.ViewportHeight, m.ViewportWidth)
m.PNGExporter = png
m.PDFExporter = pdf
}
}
func WithTemplatesFromFS(dir fs.FS) GreypotOption {
return func(m *Module) {
m.TemplateRepository = repo.NewFSTemplateRepo(dir)
}
}
func WithTemplatesFromFilesystem(dir string) GreypotOption {
return func(m *Module) {
m.TemplateRepository = repo.NewFilesystemTemplateRepo(dir)
}
}
func moduleDefaults() *Module {
defaultRenderTimeout := 10 * time.Second
var viewportHeight int = 2048 // `env:"VIEWPORT_HEIGHT" envDefault:"2048"`
var viewportWidth int = 1920 // `env:"VIEWPORT_WIDTH" envDefault:"1920"`
templateEngine := engine.NewGolangTemplateEngine()
repo := repo.NewFilesystemTemplateRepo("./")
// repo := data.NewFilesystemTemplateRepo(config.TemplatesPath)
png := exporter.NewPlaywrightPNGReportExporter(defaultRenderTimeout, viewportHeight, viewportWidth)
pdf := exporter.NewPlaywrightPDFReportExporter(defaultRenderTimeout, viewportHeight, viewportWidth)
tmplSrv := service.NewTemplateService(templateEngine, repo)
rprtSrv := service.NewReportService(pdf, png, tmplSrv, "/")
return &Module{
RenderTimeout: defaultRenderTimeout,
TemplateService: tmplSrv,
ReportService: rprtSrv,
TemplateEngine: templateEngine,
TemplateRepository: repo,
PDFExporter: pdf,
PNGExporter: png,
}
}