diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2023-01-04 18:24:36 +0100 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2023-05-16 18:01:29 +0200 |
commit | 241b21b0fd34d91fccb2ce69874110dceae6f926 (patch) | |
tree | d4e0118eac7e9c42f065815447a70805f8d6ad3e /config/defaultConfigProvider.go | |
parent | 6aededf6b42011c3039f5f66487a89a8dd65e0e7 (diff) |
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/defaultConfigProvider.go')
-rw-r--r-- | config/defaultConfigProvider.go | 97 |
1 files changed, 27 insertions, 70 deletions
diff --git a/config/defaultConfigProvider.go b/config/defaultConfigProvider.go index 822f421fa..e8a08e281 100644 --- a/config/defaultConfigProvider.go +++ b/config/defaultConfigProvider.go @@ -19,6 +19,8 @@ import ( "strings" "sync" + xmaps "golang.org/x/exp/maps" + "github.com/spf13/cast" "github.com/gohugoio/hugo/common/maps" @@ -75,11 +77,6 @@ func NewFrom(params maps.Params) Provider { } } -// NewWithTestDefaults is used in tests only. -func NewWithTestDefaults() Provider { - return SetBaseTestDefaults(New()) -} - // defaultConfigProvider is a Provider backed by a map where all keys are lower case. // All methods are thread safe. type defaultConfigProvider struct { @@ -160,9 +157,9 @@ func (c *defaultConfigProvider) Set(k string, v any) { k = strings.ToLower(k) if k == "" { - if p, ok := maps.ToParamsAndPrepare(v); ok { + if p, err := maps.ToParamsAndPrepare(v); err == nil { // Set the values directly in root. - c.root.Set(p) + maps.SetParams(c.root, p) } else { c.root[k] = v } @@ -184,7 +181,7 @@ func (c *defaultConfigProvider) Set(k string, v any) { if existing, found := m[key]; found { if p1, ok := existing.(maps.Params); ok { if p2, ok := v.(maps.Params); ok { - p1.Set(p2) + maps.SetParams(p1, p2) return } } @@ -208,12 +205,6 @@ func (c *defaultConfigProvider) Merge(k string, v any) { defer c.mu.Unlock() k = strings.ToLower(k) - const ( - languagesKey = "languages" - paramsKey = "params" - menusKey = "menus" - ) - if k == "" { rs, f := c.root.GetMergeStrategy() if f && rs == maps.ParamsMergeStrategyNone { @@ -222,7 +213,7 @@ func (c *defaultConfigProvider) Merge(k string, v any) { return } - if p, ok := maps.ToParamsAndPrepare(v); ok { + if p, err := maps.ToParamsAndPrepare(v); err == nil { // As there may be keys in p not in root, we need to handle // those as a special case. var keysToDelete []string @@ -230,49 +221,14 @@ func (c *defaultConfigProvider) Merge(k string, v any) { if pp, ok := vv.(maps.Params); ok { if pppi, ok := c.root[kk]; ok { ppp := pppi.(maps.Params) - if kk == languagesKey { - // Languages is currently a special case. - // We may have languages with menus or params in the - // right map that is not present in the left map. - // With the default merge strategy those items will not - // be passed over. - var hasParams, hasMenus bool - for _, rv := range pp { - if lkp, ok := rv.(maps.Params); ok { - _, hasMenus = lkp[menusKey] - _, hasParams = lkp[paramsKey] - } - } - - if hasMenus || hasParams { - for _, lv := range ppp { - if lkp, ok := lv.(maps.Params); ok { - if hasMenus { - if _, ok := lkp[menusKey]; !ok { - p := maps.Params{} - p.SetDefaultMergeStrategy(maps.ParamsMergeStrategyShallow) - lkp[menusKey] = p - } - } - if hasParams { - if _, ok := lkp[paramsKey]; !ok { - p := maps.Params{} - p.SetDefaultMergeStrategy(maps.ParamsMergeStrategyShallow) - lkp[paramsKey] = p - } - } - } - } - } - } - ppp.Merge(pp) + maps.MergeParamsWithStrategy("", ppp, pp) } else { // We need to use the default merge strategy for // this key. np := make(maps.Params) - strategy := c.determineMergeStrategy(KeyParams{Key: "", Params: c.root}, KeyParams{Key: kk, Params: np}) - np.SetDefaultMergeStrategy(strategy) - np.Merge(pp) + strategy := c.determineMergeStrategy(maps.KeyParams{Key: "", Params: c.root}, maps.KeyParams{Key: kk, Params: np}) + np.SetMergeStrategy(strategy) + maps.MergeParamsWithStrategy("", np, pp) c.root[kk] = np if np.IsZero() { // Just keep it until merge is done. @@ -282,7 +238,7 @@ func (c *defaultConfigProvider) Merge(k string, v any) { } } // Merge the rest. - c.root.MergeRoot(p) + maps.MergeParams(c.root, p) for _, k := range keysToDelete { delete(c.root, k) } @@ -307,7 +263,7 @@ func (c *defaultConfigProvider) Merge(k string, v any) { if existing, found := m[key]; found { if p1, ok := existing.(maps.Params); ok { if p2, ok := v.(maps.Params); ok { - p1.Merge(p2) + maps.MergeParamsWithStrategy("", p1, p2) } } } else { @@ -315,9 +271,15 @@ func (c *defaultConfigProvider) Merge(k string, v any) { } } -func (c *defaultConfigProvider) WalkParams(walkFn func(params ...KeyParams) bool) { - var walk func(params ...KeyParams) - walk = func(params ...KeyParams) { +func (c *defaultConfigProvider) Keys() []string { + c.mu.RLock() + defer c.mu.RUnlock() + return xmaps.Keys(c.root) +} + +func (c *defaultConfigProvider) WalkParams(walkFn func(params ...maps.KeyParams) bool) { + var walk func(params ...maps.KeyParams) + walk = func(params ...maps.KeyParams) { if walkFn(params...) { return } @@ -325,17 +287,17 @@ func (c *defaultConfigProvider) WalkParams(walkFn func(params ...KeyParams) bool i := len(params) for k, v := range p1.Params { if p2, ok := v.(maps.Params); ok { - paramsplus1 := make([]KeyParams, i+1) + paramsplus1 := make([]maps.KeyParams, i+1) copy(paramsplus1, params) - paramsplus1[i] = KeyParams{Key: k, Params: p2} + paramsplus1[i] = maps.KeyParams{Key: k, Params: p2} walk(paramsplus1...) } } } - walk(KeyParams{Key: "", Params: c.root}) + walk(maps.KeyParams{Key: "", Params: c.root}) } -func (c *defaultConfigProvider) determineMergeStrategy(params ...KeyParams) maps.ParamsMergeStrategy { +func (c *defaultConfigProvider) determineMergeStrategy(params ...maps.KeyParams) maps.ParamsMergeStrategy { if len(params) == 0 { return maps.ParamsMergeStrategyNone } @@ -391,13 +353,8 @@ func (c *defaultConfigProvider) determineMergeStrategy(params ...KeyParams) maps return strategy } -type KeyParams struct { - Key string - Params maps.Params -} - func (c *defaultConfigProvider) SetDefaultMergeStrategy() { - c.WalkParams(func(params ...KeyParams) bool { + c.WalkParams(func(params ...maps.KeyParams) bool { if len(params) == 0 { return false } @@ -409,7 +366,7 @@ func (c *defaultConfigProvider) SetDefaultMergeStrategy() { } strategy := c.determineMergeStrategy(params...) if strategy != "" { - p.SetDefaultMergeStrategy(strategy) + p.SetMergeStrategy(strategy) } return false }) |