summaryrefslogtreecommitdiffstats
path: root/tpl/transform/unmarshal.go
diff options
context:
space:
mode:
Diffstat (limited to 'tpl/transform/unmarshal.go')
-rw-r--r--tpl/transform/unmarshal.go43
1 files changed, 37 insertions, 6 deletions
diff --git a/tpl/transform/unmarshal.go b/tpl/transform/unmarshal.go
index 3936126ca..d876c88d7 100644
--- a/tpl/transform/unmarshal.go
+++ b/tpl/transform/unmarshal.go
@@ -14,18 +14,18 @@
package transform
import (
+ "errors"
"fmt"
"io"
"strings"
+ "github.com/gohugoio/hugo/resources"
"github.com/gohugoio/hugo/resources/resource"
"github.com/gohugoio/hugo/common/types"
"github.com/mitchellh/mapstructure"
- "errors"
-
"github.com/gohugoio/hugo/helpers"
"github.com/gohugoio/hugo/parser/metadecoders"
@@ -71,7 +71,7 @@ func (ns *Namespace) Unmarshal(args ...any) (any, error) {
key += decoder.OptionsKey()
}
- return ns.cache.GetOrCreate(key, func() (any, error) {
+ v, err := ns.cache.GetOrCreate(key, func(string) (*resources.StaleValue[any], error) {
f := metadecoders.FormatFromStrings(r.MediaType().Suffixes()...)
if f == "" {
return nil, fmt.Errorf("MIME %q not supported", r.MediaType())
@@ -88,8 +88,24 @@ func (ns *Namespace) Unmarshal(args ...any) (any, error) {
return nil, err
}
- return decoder.Unmarshal(b, f)
+ v, err := decoder.Unmarshal(b, f)
+ if err != nil {
+ return nil, err
+ }
+
+ return &resources.StaleValue[any]{
+ Value: v,
+ IsStaleFunc: func() bool {
+ return resource.IsStaleAny(r)
+ },
+ }, nil
})
+ if err != nil {
+ return nil, err
+ }
+
+ return v.Value, nil
+
}
dataStr, err := types.ToStringE(data)
@@ -103,14 +119,29 @@ func (ns *Namespace) Unmarshal(args ...any) (any, error) {
key := helpers.MD5String(dataStr)
- return ns.cache.GetOrCreate(key, func() (any, error) {
+ v, err := ns.cache.GetOrCreate(key, func(string) (*resources.StaleValue[any], error) {
f := decoder.FormatFromContentString(dataStr)
if f == "" {
return nil, errors.New("unknown format")
}
- return decoder.Unmarshal([]byte(dataStr), f)
+ v, err := decoder.Unmarshal([]byte(dataStr), f)
+ if err != nil {
+ return nil, err
+ }
+
+ return &resources.StaleValue[any]{
+ Value: v,
+ IsStaleFunc: func() bool {
+ return false
+ },
+ }, nil
})
+ if err != nil {
+ return nil, err
+ }
+
+ return v.Value, nil
}
func decodeDecoder(m map[string]any) (metadecoders.Decoder, error) {