Range through values within variable containing dashes in Golang templates

I would like to range through values specified under a variable containing dashes within Golang template:

data:
  init: |
{{- range .Values.something.something-else.values.list }}
{{ . | indent 4 }}{{ end }}

I've seen that to access values from a variable with dashes in the name index function should be used.

I'm not understanding though how to combine the two functions.

Upvotes: 3

Views: 2627

Answers (1)

icza
icza

Reputation: 417612

The index function is documented at text/template: Functions section:

index
    Returns the result of indexing its first argument by the
    following arguments. Thus "index x 1 2 3" is, in Go syntax,
    x[1][2][3]. Each indexed item must be a map, slice, or array.

To use index: pass the value you want to index, and the values to index by, e.g.

index . "Values" "something" "something-else" "values" "list"

Combined with the {{range}} action:

Items:
{{range index . "Values" "something" "something-else" "values" "list"}}
    {{.}},
{{end}}

See a simplified working example:

func main() {
    t := template.Must(template.New("").Parse(src))
    m := map[string]interface{}{
        "something": map[string]interface{}{
            "something-else": map[string]interface{}{
                "list": []string{"one", "two", "three"},
            },
        },
    }
    if err := t.Execute(os.Stdout, m); err != nil {
        panic(err)
    }
}

const src = `data:
{{- range index . "something" "something-else" "list" }} {{.}},{{ end }}`

Output (try it on the Go Playground):

data: one, two, three,

Upvotes: 3

Related Questions