aboutsummaryrefslogtreecommitdiffhomepage
path: root/config/namespace.go
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <[email protected]>2023-01-04 18:24:36 +0100
committerBjørn Erik Pedersen <[email protected]>2023-05-16 18:01:29 +0200
commit241b21b0fd34d91fccb2ce69874110dceae6f926 (patch)
treed4e0118eac7e9c42f065815447a70805f8d6ad3e /config/namespace.go
parent6aededf6b42011c3039f5f66487a89a8dd65e0e7 (diff)
downloadhugo-241b21b0fd34d91fccb2ce69874110dceae6f926.tar.gz
hugo-241b21b0fd34d91fccb2ce69874110dceae6f926.zip
Create a struct with all of Hugo's config options
Primary motivation is documentation, but it will also hopefully simplify the code. Also, * Lower case the default output format names; this is in line with the custom ones (map keys) and how it's treated all the places. This avoids doing `stringds.EqualFold` everywhere. Closes #10896 Closes #10620
Diffstat (limited to 'config/namespace.go')
-rw-r--r--config/namespace.go76
1 files changed, 76 insertions, 0 deletions
diff --git a/config/namespace.go b/config/namespace.go
new file mode 100644
index 000000000..3ecd01014
--- /dev/null
+++ b/config/namespace.go
@@ -0,0 +1,76 @@
+// Copyright 2023 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 config
+
+import (
+ "encoding/json"
+
+ "github.com/gohugoio/hugo/identity"
+)
+
+func DecodeNamespace[S, C any](configSource any, buildConfig func(any) (C, any, error)) (*ConfigNamespace[S, C], error) {
+
+ // Calculate the hash of the input (not including any defaults applied later).
+ // This allows us to introduce new config options without breaking the hash.
+ h := identity.HashString(configSource)
+
+ // Build the config
+ c, ext, err := buildConfig(configSource)
+ if err != nil {
+ return nil, err
+ }
+
+ if ext == nil {
+ ext = configSource
+ }
+
+ if ext == nil {
+ panic("ext is nil")
+ }
+
+ ns := &ConfigNamespace[S, C]{
+ SourceStructure: ext,
+ SourceHash: h,
+ Config: c,
+ }
+
+ return ns, nil
+}
+
+// ConfigNamespace holds a Hugo configuration namespace.
+// The construct looks a little odd, but it's built to make the configuration elements
+// both self-documenting and contained in a common structure.
+type ConfigNamespace[S, C any] struct {
+ // SourceStructure represents the source configuration with any defaults applied.
+ // This is used for documentation and printing of the configuration setup to the user.
+ SourceStructure any
+
+ // SourceHash is a hash of the source configuration before any defaults gets applied.
+ SourceHash string
+
+ // Config is the final configuration as used by Hugo.
+ Config C
+}
+
+// MarshalJSON marshals the source structure.
+func (ns *ConfigNamespace[S, C]) MarshalJSON() ([]byte, error) {
+ return json.Marshal(ns.SourceStructure)
+}
+
+// Signature returns the signature of the source structure.
+// Note that this is for documentation purposes only and SourceStructure may not always be cast to S (it's usually just a map).
+func (ns *ConfigNamespace[S, C]) Signature() S {
+ var s S
+ return s
+}