From 636b2dbf8ff74ef2680cd8fcc27d1f35c192ae30 Mon Sep 17 00:00:00 2001 From: William Petit Date: Wed, 15 Apr 2020 18:33:30 +0200 Subject: [PATCH] template service: add Render() method --- service/template/service.go | 2 ++ template/html/service.go | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/service/template/service.go b/service/template/service.go index 16d4be4..67e3bcc 100644 --- a/service/template/service.go +++ b/service/template/service.go @@ -1,6 +1,7 @@ package template import ( + "io" "net/http" "github.com/pkg/errors" @@ -13,6 +14,7 @@ const ServiceName service.Name = "template" // Service is a templating service type Service interface { 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 diff --git a/template/html/service.go b/template/html/service.go index 5108fba..f6497bc 100644 --- a/template/html/service.go +++ b/template/html/service.go @@ -3,6 +3,7 @@ package html import ( "fmt" "html/template" + "io" "io/ioutil" "net/http" "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 func NewTemplateService(funcs ...OptionFunc) *TemplateService { options := defaultOptions()