template service: add Render() method

This commit is contained in:
wpetit 2020-04-15 18:33:30 +02:00
parent 42aba649c8
commit 636b2dbf8f
2 changed files with 25 additions and 0 deletions

View File

@ -1,6 +1,7 @@
package template package template
import ( import (
"io"
"net/http" "net/http"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -13,6 +14,7 @@ const ServiceName service.Name = "template"
// Service is a templating service // Service is a templating service
type Service interface { type Service interface {
RenderPage(w http.ResponseWriter, templateName string, data interface{}) error RenderPage(w http.ResponseWriter, templateName string, data interface{}) error
Render(w io.Writer, templateName string, data interface{}) error
} }
// From retrieves the template service in the given container // From retrieves the template service in the given container

View File

@ -3,6 +3,7 @@ package html
import ( import (
"fmt" "fmt"
"html/template" "html/template"
"io"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"path/filepath" "path/filepath"
@ -102,6 +103,28 @@ func (t *TemplateService) RenderPage(w http.ResponseWriter, templateName string,
} }
// Render renders a template to the given io.Writer
func (t *TemplateService) Render(w io.Writer, templateName string, data interface{}) error {
// Ensure the template exists in the map.
tmpl, ok := t.templates[templateName]
if !ok {
return fmt.Errorf("the template '%s' does not exist", templateName)
}
// Create a buffer to temporarily write to and check if any errors were encountered.
buf := t.pool.Get()
defer t.pool.Put(buf)
if err := tmpl.ExecuteTemplate(buf, templateName, data); err != nil {
return err
}
_, err := buf.WriteTo(w)
return err
}
// NewTemplateService returns a new Service // NewTemplateService returns a new Service
func NewTemplateService(funcs ...OptionFunc) *TemplateService { func NewTemplateService(funcs ...OptionFunc) *TemplateService {
options := defaultOptions() options := defaultOptions()