115 lines
4.4 KiB
Smarty
115 lines
4.4 KiB
Smarty
{{- /*
|
|
tplYaml
|
|
input: map with 2 keys:
|
|
- doc: interface{}
|
|
- ctx: context to pass to tpl function
|
|
output: JSON encoded map with 1 key:
|
|
- doc: interface{} with any keys called tpl or tplSpread values templated and replaced
|
|
|
|
maps matching the following syntax will be templated and parsed as YAML
|
|
{
|
|
$tplYaml: string
|
|
}
|
|
|
|
maps matching the follow syntax will be templated, parsed as YAML, and spread into the parent map/slice
|
|
{
|
|
$tplYamlSpread: string
|
|
}
|
|
*/}}
|
|
{{- define "tplYaml" -}}
|
|
{{- $patch := get (include "tplYamlItr" (dict "ctx" .ctx "parentKind" "" "parentPath" "" "path" "/" "value" .doc) | fromJson) "patch" -}}
|
|
{{- include "jsonpatch" (dict "doc" .doc "patch" $patch) -}}
|
|
{{- end -}}
|
|
|
|
{{- /*
|
|
tplYamlItr
|
|
input: map with 4 keys:
|
|
- path: string JSONPath to current element
|
|
- parentKind: string kind of parent element
|
|
- parentPath: string JSONPath to parent element
|
|
- value: interface{}
|
|
- ctx: context to pass to tpl function
|
|
output: JSON encoded map with 1 key:
|
|
- patch: list of patches to apply in order to template
|
|
*/}}
|
|
{{- define "tplYamlItr" -}}
|
|
{{- $params := . -}}
|
|
{{- $kind := kindOf $params.value -}}
|
|
{{- $patch := list -}}
|
|
{{- $joinPath := $params.path -}}
|
|
{{- if eq $params.path "/" -}}
|
|
{{- $joinPath = "" -}}
|
|
{{- end -}}
|
|
{{- $joinParentPath := $params.parentPath -}}
|
|
{{- if eq $params.parentPath "/" -}}
|
|
{{- $joinParentPath = "" -}}
|
|
{{- end -}}
|
|
|
|
{{- if eq $kind "slice" -}}
|
|
{{- $iAdj := 0 -}}
|
|
{{- range $i, $v := $params.value -}}
|
|
{{- $iPath := printf "%s/%d" $joinPath (add $i $iAdj) -}}
|
|
{{- $itrPatch := get (include "tplYamlItr" (dict "ctx" $params.ctx "parentKind" $kind "parentPath" $params.path "path" $iPath "value" $v) | fromJson) "patch" -}}
|
|
{{- $itrLen := len $itrPatch -}}
|
|
{{- if gt $itrLen 0 -}}
|
|
{{- $patch = concat $patch $itrPatch -}}
|
|
{{- if eq (get (index $itrPatch 0) "op") "remove" -}}
|
|
{{- $iAdj = add $iAdj (sub $itrLen 2) -}}
|
|
{{- end -}}
|
|
{{- end -}}
|
|
{{- end -}}
|
|
|
|
{{- else if eq $kind "map" -}}
|
|
{{- if and (eq (len $params.value) 1) (or (hasKey $params.value "$tplYaml") (hasKey $params.value "$tplYamlSpread")) -}}
|
|
{{- $tpl := get $params.value "$tplYaml" -}}
|
|
{{- $spread := false -}}
|
|
{{- if hasKey $params.value "$tplYamlSpread" -}}
|
|
{{- if eq $params.path "/" -}}
|
|
{{- fail "cannot $tplYamlSpread on root object" -}}
|
|
{{- end -}}
|
|
{{- $tpl = get $params.value "$tplYamlSpread" -}}
|
|
{{- $spread = true -}}
|
|
{{- end -}}
|
|
|
|
{{- $res := tpl $tpl $params.ctx -}}
|
|
{{- $res = get (fromYaml (tpl "tpl: {{ nindent 2 .res }}" (merge (dict "res" $res) $params.ctx))) "tpl" -}}
|
|
|
|
{{- if eq $spread false -}}
|
|
{{- $patch = append $patch (dict "op" "replace" "path" $params.path "value" $res) -}}
|
|
{{- else -}}
|
|
{{- $resKind := kindOf $res -}}
|
|
{{- if and (ne $resKind "invalid") (ne $resKind $params.parentKind) -}}
|
|
{{- fail (cat "can only $tplYamlSpread slice onto a slice or map onto a map; attempted to spread" $resKind "on" $params.parentKind "at path" $params.path) -}}
|
|
{{- end -}}
|
|
{{- $patch = append $patch (dict "op" "remove" "path" $params.path) -}}
|
|
{{- if eq $resKind "invalid" -}}
|
|
{{- /* no-op */ -}}
|
|
{{- else if eq $resKind "slice" -}}
|
|
{{- range $v := reverse $res -}}
|
|
{{- $patch = append $patch (dict "op" "add" "path" $params.path "value" $v) -}}
|
|
{{- end -}}
|
|
{{- else -}}
|
|
{{- range $k, $v := $res -}}
|
|
{{- $kPath := replace "~" "~0" $k -}}
|
|
{{- $kPath = replace "/" "~1" $kPath -}}
|
|
{{- $kPath = printf "%s/%s" $joinParentPath $kPath -}}
|
|
{{- $patch = append $patch (dict "op" "add" "path" $kPath "value" $v) -}}
|
|
{{- end -}}
|
|
{{- end -}}
|
|
{{- end -}}
|
|
{{- else -}}
|
|
{{- range $k, $v := $params.value -}}
|
|
{{- $kPath := replace "~" "~0" $k -}}
|
|
{{- $kPath = replace "/" "~1" $kPath -}}
|
|
{{- $kPath = printf "%s/%s" $joinPath $kPath -}}
|
|
{{- $itrPatch := get (include "tplYamlItr" (dict "ctx" $params.ctx "parentKind" $kind "parentPath" $params.path "path" $kPath "value" $v) | fromJson) "patch" -}}
|
|
{{- if gt (len $itrPatch) 0 -}}
|
|
{{- $patch = concat $patch $itrPatch -}}
|
|
{{- end -}}
|
|
{{- end -}}
|
|
{{- end -}}
|
|
{{- end -}}
|
|
|
|
{{- toJson (dict "patch" $patch) -}}
|
|
{{- end -}}
|