Masterminds / sprig

Useful template functions for Go templates.
http://masterminds.github.io/sprig/
MIT License
4.07k stars 423 forks source link

Expose digFromDict function #368

Open pursultani opened 1 year ago

pursultani commented 1 year ago

dig is a very useful function. Since it uses a variadic argument to specify the keys, the caller needs to know them prior to calling it. While handy in most cases, this is a limitation for implementing more advanced templates partials and helpers where the helper receives the list of the keys as a parameter.

digFromDict (which dig already uses) has the signature that satisfies the requirements that was mentioned above and can be a complement to dig for special purposes. It just needs to be exposed.

The following example (for Helm) tries to depict this:

--- values.yaml
global:
  module1:
    settings: {}
    #  foo:
    #    bar:

module1:
  settings: {}
  #  foo:
  #    bar:
{{- define "settings.helper" -}}
{{- coalesce (digFromDict .local "" .keys) (digFromDict .global "" .keys) .default -}}
{{- end -}}

{{- define "module1.settings.fooBar" -}}
{{- include "settings.helper" (dict
        "local" .Values.module1.settings
        "global" .Values.global.module1.settings
        "default" "fooBar"
        "keys" (list "foo" "bar")
    )
-}}
{{- end -}}

A helper like "settings.helper" can not be implemented with dig.

pursultani commented 1 year ago

I want to make an additional note that this is a generic problem with functions with variadic arguments. They can be used in a limited settings and their usage can not be parametrized with lists. #330 is a similar issue.