| 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) |
| } |