Skip to content

Commit 822d11a

Browse files
committed
Add TemplateRenderer struct to ease creating renderers for html/template and text/template packages.
1 parent d5b32c6 commit 822d11a

File tree

3 files changed

+57
-6
lines changed

3 files changed

+57
-6
lines changed

echo.go

-6
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ import (
4545
"encoding/json"
4646
"errors"
4747
"fmt"
48-
"io"
4948
stdLog "log"
5049
"net"
5150
"net/http"
@@ -142,11 +141,6 @@ type JSONSerializer interface {
142141
Deserialize(c Context, i interface{}) error
143142
}
144143

145-
// Renderer is the interface that wraps the Render function.
146-
type Renderer interface {
147-
Render(io.Writer, string, interface{}, Context) error
148-
}
149-
150144
// Map defines a generic map of type `map[string]interface{}`.
151145
type Map map[string]interface{}
152146

renderer.go

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package echo
2+
3+
import "io"
4+
5+
// Renderer is the interface that wraps the Render function.
6+
type Renderer interface {
7+
Render(io.Writer, string, interface{}, Context) error
8+
}
9+
10+
// TemplateRenderer is helper to ease creating renderers for `html/template` and `text/template` packages.
11+
// Example usage:
12+
//
13+
// e.Renderer = &echo.TemplateRenderer{
14+
// Template: template.Must(template.ParseGlob("templates/*.html")),
15+
// }
16+
//
17+
// e.Renderer = &echo.TemplateRenderer{
18+
// Template: template.Must(template.New("hello").Parse("Hello, {{.}}!")),
19+
// }
20+
type TemplateRenderer struct {
21+
Template interface {
22+
ExecuteTemplate(wr io.Writer, name string, data any) error
23+
}
24+
}
25+
26+
// Render renders the template with given data.
27+
func (t *TemplateRenderer) Render(w io.Writer, name string, data interface{}, c Context) error {
28+
return t.Template.ExecuteTemplate(w, name, data)
29+
}

renderer_test.go

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package echo
2+
3+
import (
4+
"github.com/stretchr/testify/assert"
5+
"html/template"
6+
"net/http"
7+
"net/http/httptest"
8+
"strings"
9+
"testing"
10+
)
11+
12+
func TestRenderWithTemplateRenderer(t *testing.T) {
13+
e := New()
14+
req := httptest.NewRequest(http.MethodPost, "/", strings.NewReader(userJSON))
15+
rec := httptest.NewRecorder()
16+
17+
c := e.NewContext(req, rec)
18+
19+
e.Renderer = &TemplateRenderer{
20+
Template: template.Must(template.New("hello").Parse("Hello, {{.}}!")),
21+
}
22+
23+
err := c.Render(http.StatusOK, "hello", "Jon Snow")
24+
if assert.NoError(t, err) {
25+
assert.Equal(t, http.StatusOK, rec.Code)
26+
assert.Equal(t, "Hello, Jon Snow!", rec.Body.String())
27+
}
28+
}

0 commit comments

Comments
 (0)