-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrenderer.go
125 lines (96 loc) · 2.53 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
package kit
import (
"bytes"
"html/template"
"io"
"io/fs"
"io/ioutil"
"path/filepath"
"regexp"
"github.com/labstack/echo/v4"
"github.com/neoxelox/errors"
"github.com/neoxelox/kit/util"
)
// TODO: enhance rendering with templ
var (
ErrRendererGeneric = errors.New("renderer failed")
)
var (
_RENDERER_DEFAULT_CONFIG = RendererConfig{
TemplatesPath: util.Pointer("./templates"),
TemplateFilePattern: util.Pointer(`^.*\.(html|txt|md)$`),
}
)
type RendererConfig struct {
TemplatesPath *string
TemplateFilePattern *string
}
type Renderer struct {
config RendererConfig
observer *Observer
renderer *template.Template
}
func NewRenderer(observer *Observer, config RendererConfig) (*Renderer, error) {
util.Merge(&config, _RENDERER_DEFAULT_CONFIG)
*config.TemplatesPath = filepath.Clean(*config.TemplatesPath)
extensions := regexp.MustCompile(*config.TemplateFilePattern)
renderer := template.New("")
err := filepath.WalkDir(*config.TemplatesPath, func(path string, info fs.DirEntry, err error) error {
if err != nil {
return ErrRendererGeneric.Raise().Cause(err)
}
if info.IsDir() {
return nil
}
if !extensions.MatchString(info.Name()) {
return nil
}
name := path[len(*config.TemplatesPath)+1:]
file, err := ioutil.ReadFile(path)
if err != nil {
return ErrRendererGeneric.Raise().Cause(err)
}
_, err = renderer.New(name).Parse(string(file))
if err != nil {
return ErrRendererGeneric.Raise().Cause(err)
}
return nil
})
if err != nil {
return nil, err
}
return &Renderer{
config: config,
observer: observer,
renderer: renderer,
}, nil
}
func (self *Renderer) Render(w io.Writer, name string, data any, _ echo.Context) error {
err := self.renderer.ExecuteTemplate(w, name, data)
if err != nil {
return ErrRendererGeneric.Raise().Extra(map[string]any{"template": name}).Cause(err)
}
return nil
}
func (self *Renderer) RenderWriter(w io.Writer, template string, data any) error {
err := self.renderer.ExecuteTemplate(w, template, data)
if err != nil {
return ErrRendererGeneric.Raise().Extra(map[string]any{"template": template}).Cause(err)
}
return nil
}
func (self *Renderer) RenderBytes(template string, data any) ([]byte, error) {
var w bytes.Buffer
err := self.RenderWriter(&w, template, data)
if err != nil {
return nil, err
}
return w.Bytes(), nil
}
func (self *Renderer) RenderString(template string, data any) (string, error) {
bytes, err := self.RenderBytes(template, data)
if err != nil {
return "", err
}
return string(bytes), nil
}