post_publish.go (1491B)
1 // Copyright 2020 The Hugo Authors. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13
14 package resources
15
16 import (
17 "github.com/gohugoio/hugo/resources/postpub"
18 "github.com/gohugoio/hugo/resources/resource"
19 )
20
21 type transformationKeyer interface {
22 TransformationKey() string
23 }
24
25 // PostProcess wraps the given Resource for later processing.
26 func (spec *Spec) PostProcess(r resource.Resource) (postpub.PostPublishedResource, error) {
27 key := r.(transformationKeyer).TransformationKey()
28 spec.postProcessMu.RLock()
29 result, found := spec.PostProcessResources[key]
30 spec.postProcessMu.RUnlock()
31 if found {
32 return result, nil
33 }
34
35 spec.postProcessMu.Lock()
36 defer spec.postProcessMu.Unlock()
37
38 // Double check
39 result, found = spec.PostProcessResources[key]
40 if found {
41 return result, nil
42 }
43
44 result = postpub.NewPostPublishResource(spec.incr.Incr(), r)
45 if result == nil {
46 panic("got nil result")
47 }
48 spec.PostProcessResources[key] = result
49
50 return result, nil
51 }