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}