Fork of github.com/did-method-plc/did-method-plc
1package main
2
3import (
4 "bytes"
5 "embed"
6 "errors"
7 "fmt"
8 "io"
9 "path/filepath"
10
11 "github.com/flosch/pongo2/v6"
12 "github.com/labstack/echo/v4"
13)
14
15type RendererLoader struct {
16 prefix string
17 fs *embed.FS
18}
19
20func NewRendererLoader(prefix string, fs *embed.FS) pongo2.TemplateLoader {
21 return &RendererLoader{
22 prefix: prefix,
23 fs: fs,
24 }
25}
26func (l *RendererLoader) Abs(_, name string) string {
27 // TODO: remove this workaround
28 // Figure out why this method is being called
29 // twice on template names resulting in a failure to resolve
30 // the template name.
31 if filepath.HasPrefix(name, l.prefix) {
32 return name
33 }
34 return filepath.Join(l.prefix, name)
35}
36
37func (l *RendererLoader) Get(path string) (io.Reader, error) {
38 b, err := l.fs.ReadFile(path)
39 if err != nil {
40 return nil, fmt.Errorf("reading template %q failed: %w", path, err)
41 }
42 return bytes.NewReader(b), nil
43}
44
45type Renderer struct {
46 TemplateSet *pongo2.TemplateSet
47 Debug bool
48}
49
50func NewRenderer(prefix string, fs *embed.FS, debug bool) *Renderer {
51 return &Renderer{
52 TemplateSet: pongo2.NewSet(prefix, NewRendererLoader(prefix, fs)),
53 Debug: debug,
54 }
55}
56
57func (r Renderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
58 var ctx pongo2.Context
59
60 if data != nil {
61 var ok bool
62 ctx, ok = data.(pongo2.Context)
63 if !ok {
64 return errors.New("no pongo2.Context data was passed")
65 }
66 }
67
68 var t *pongo2.Template
69 var err error
70
71 if r.Debug {
72 t, err = pongo2.FromFile(name)
73 } else {
74 t, err = r.TemplateSet.FromFile(name)
75 }
76
77 if err != nil {
78 return err
79 }
80
81 return t.ExecuteWriter(ctx, w)
82}