summaryrefslogtreecommitdiffstats
path: root/resource/resource_transformers/templates/execute_as_template.go
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2019-01-02 10:36:12 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2019-01-02 14:25:37 +0100
commit669ada436787311cc5d02dae5b88e60a09adda58 (patch)
treee4d22bf1261bdfbd152f97ae738d992318cdfc1d /resource/resource_transformers/templates/execute_as_template.go
parent507451229c2255788d72b757a85ad5bb3ba00f4f (diff)
resource: Move resource processors into sub-packages
Diffstat (limited to 'resource/resource_transformers/templates/execute_as_template.go')
-rw-r--r--resource/resource_transformers/templates/execute_as_template.go75
1 files changed, 75 insertions, 0 deletions
diff --git a/resource/resource_transformers/templates/execute_as_template.go b/resource/resource_transformers/templates/execute_as_template.go
new file mode 100644
index 000000000..a126b26c9
--- /dev/null
+++ b/resource/resource_transformers/templates/execute_as_template.go
@@ -0,0 +1,75 @@
+// Copyright 2018 The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Package templates contains functions for template processing of Resource objects.
+package templates
+
+import (
+ "github.com/gohugoio/hugo/helpers"
+ "github.com/gohugoio/hugo/resource"
+ "github.com/gohugoio/hugo/tpl"
+ "github.com/pkg/errors"
+)
+
+// Client contains methods to perform template processing of Resource objects.
+type Client struct {
+ rs *resource.Spec
+
+ textTemplate tpl.TemplateParseFinder
+}
+
+// New creates a new Client with the given specification.
+func New(rs *resource.Spec, textTemplate tpl.TemplateParseFinder) *Client {
+ if rs == nil {
+ panic("must provice a resource Spec")
+ }
+ if textTemplate == nil {
+ panic("must provide a textTemplate")
+ }
+ return &Client{rs: rs, textTemplate: textTemplate}
+}
+
+type executeAsTemplateTransform struct {
+ rs *resource.Spec
+ textTemplate tpl.TemplateParseFinder
+ targetPath string
+ data interface{}
+}
+
+func (t *executeAsTemplateTransform) Key() resource.ResourceTransformationKey {
+ return resource.NewResourceTransformationKey("execute-as-template", t.targetPath)
+}
+
+func (t *executeAsTemplateTransform) Transform(ctx *resource.ResourceTransformationCtx) error {
+ tplStr := helpers.ReaderToString(ctx.From)
+ templ, err := t.textTemplate.Parse(ctx.InPath, tplStr)
+ if err != nil {
+ return errors.Wrapf(err, "failed to parse Resource %q as Template:", ctx.InPath)
+ }
+
+ ctx.OutPath = t.targetPath
+
+ return templ.Execute(ctx.To, t.data)
+}
+
+func (c *Client) ExecuteAsTemplate(res resource.Resource, targetPath string, data interface{}) (resource.Resource, error) {
+ return c.rs.Transform(
+ res,
+ &executeAsTemplateTransform{
+ rs: c.rs,
+ targetPath: helpers.ToSlashTrimLeading(targetPath),
+ textTemplate: c.textTemplate,
+ data: data,
+ },
+ )
+}