Skip to content

Commit f9950df

Browse files
authored
Merge pull request #86 from jamslinger/custom-writer
Add FRender to allow rendering into a custom io.Writer
2 parents 2b89126 + 59a0a53 commit f9950df

3 files changed

Lines changed: 40 additions & 0 deletions

File tree

engine.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,15 @@ func (e *Engine) ParseAndRender(source []byte, b Bindings) ([]byte, SourceError)
9898
return tpl.Render(b)
9999
}
100100

101+
// ParseAndFRender parses and then renders the template into w.
102+
func (e *Engine) ParseAndFRender(w io.Writer, source []byte, b Bindings) SourceError {
103+
tpl, err := e.ParseTemplate(source)
104+
if err != nil {
105+
return err
106+
}
107+
return tpl.FRender(w, b)
108+
}
109+
101110
// ParseAndRenderString is a convenience wrapper for ParseAndRender, that takes string input and returns a string.
102111
func (e *Engine) ParseAndRenderString(source string, b Bindings) (string, SourceError) {
103112
bs, err := e.ParseAndRender([]byte(source), b)

engine_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"fmt"
77
"io"
8+
"strings"
89
"testing"
910

1011
"github.com/stretchr/testify/require"
@@ -39,6 +40,26 @@ func TestEngine_ParseAndRenderString(t *testing.T) {
3940
}
4041
}
4142

43+
type capWriter struct {
44+
bytes.Buffer
45+
}
46+
47+
func (c *capWriter) Write(bs []byte) (int, error) {
48+
return c.Buffer.Write([]byte(strings.ToUpper(string(bs))))
49+
}
50+
51+
func TestEngine_ParseAndFRender(t *testing.T) {
52+
engine := NewEngine()
53+
for i, test := range liquidTests {
54+
t.Run(fmt.Sprint(i+1), func(t *testing.T) {
55+
wr := capWriter{}
56+
err := engine.ParseAndFRender(&wr, []byte(test.in), testBindings)
57+
require.NoErrorf(t, err, test.in)
58+
require.Equalf(t, strings.ToUpper(test.expected), wr.String(), test.in)
59+
})
60+
}
61+
}
62+
4263
func TestEngine_ParseAndRenderString_ptr_to_hash(t *testing.T) {
4364
params := map[string]interface{}{
4465
"message": &map[string]interface{}{

template.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package liquid
22

33
import (
44
"bytes"
5+
"io"
56

67
"github.com/osteele/liquid/parser"
78
"github.com/osteele/liquid/render"
@@ -40,6 +41,15 @@ func (t *Template) Render(vars Bindings) ([]byte, SourceError) {
4041
return buf.Bytes(), nil
4142
}
4243

44+
// FRender executes the template with the specified variable bindings and renders it into w.
45+
func (t *Template) FRender(w io.Writer, vars Bindings) SourceError {
46+
err := render.Render(t.root, w, vars, *t.cfg)
47+
if err != nil {
48+
return err
49+
}
50+
return nil
51+
}
52+
4353
// RenderString is a convenience wrapper for Render, that has string input and output.
4454
func (t *Template) RenderString(b Bindings) (string, SourceError) {
4555
bs, err := t.Render(b)

0 commit comments

Comments
 (0)