package sprig func get(d map[string]interface{}, key string) interface{} { if val, ok := d[key]; ok { return val } return "" } func set(d map[string]interface{}, key string, value interface{}) map[string]interface{} { d[key] = value return d } func unset(d map[string]interface{}, key string) map[string]interface{} { delete(d, key) return d } func hasKey(d map[string]interface{}, key string) bool { _, ok := d[key] return ok } func pluck(key string, d ...map[string]interface{}) []interface{} { res := []interface{}{} for _, dict := range d { if val, ok := dict[key]; ok { res = append(res, val) } } return res } func keys(dicts ...map[string]interface{}) []string { k := []string{} for _, dict := range dicts { for key := range dict { k = append(k, key) } } return k } func pick(dict map[string]interface{}, keys ...string) map[string]interface{} { res := map[string]interface{}{} for _, k := range keys { if v, ok := dict[k]; ok { res[k] = v } } return res } func omit(dict map[string]interface{}, keys ...string) map[string]interface{} { res := map[string]interface{}{} omit := make(map[string]bool, len(keys)) for _, k := range keys { omit[k] = true } for k, v := range dict { if _, ok := omit[k]; !ok { res[k] = v } } return res } func dict(v ...interface{}) map[string]interface{} { dict := map[string]interface{}{} lenv := len(v) for i := 0; i < lenv; i += 2 { key := strval(v[i]) if i+1 >= lenv { dict[key] = "" continue } dict[key] = v[i+1] } return dict } func values(dict map[string]interface{}) []interface{} { values := []interface{}{} for _, value := range dict { values = append(values, value) } return values } func dig(ps ...interface{}) (interface{}, error) { if len(ps) < 3 { panic("dig needs at least three arguments") } dict := ps[len(ps)-1].(map[string]interface{}) def := ps[len(ps)-2] ks := make([]string, len(ps)-2) for i := 0; i < len(ks); i++ { ks[i] = ps[i].(string) } return digFromDict(dict, def, ks) } func digFromDict(dict map[string]interface{}, d interface{}, ks []string) (interface{}, error) { k, ns := ks[0], ks[1:len(ks)] step, has := dict[k] if !has { return d, nil } if len(ns) == 0 { return step, nil } return digFromDict(step.(map[string]interface{}), d, ns) }