...

Source file src/github.com/go-task/slim-sprig/v3/dict.go

Documentation: github.com/go-task/slim-sprig/v3

     1  package sprig
     2  
     3  func get(d map[string]interface{}, key string) interface{} {
     4  	if val, ok := d[key]; ok {
     5  		return val
     6  	}
     7  	return ""
     8  }
     9  
    10  func set(d map[string]interface{}, key string, value interface{}) map[string]interface{} {
    11  	d[key] = value
    12  	return d
    13  }
    14  
    15  func unset(d map[string]interface{}, key string) map[string]interface{} {
    16  	delete(d, key)
    17  	return d
    18  }
    19  
    20  func hasKey(d map[string]interface{}, key string) bool {
    21  	_, ok := d[key]
    22  	return ok
    23  }
    24  
    25  func pluck(key string, d ...map[string]interface{}) []interface{} {
    26  	res := []interface{}{}
    27  	for _, dict := range d {
    28  		if val, ok := dict[key]; ok {
    29  			res = append(res, val)
    30  		}
    31  	}
    32  	return res
    33  }
    34  
    35  func keys(dicts ...map[string]interface{}) []string {
    36  	k := []string{}
    37  	for _, dict := range dicts {
    38  		for key := range dict {
    39  			k = append(k, key)
    40  		}
    41  	}
    42  	return k
    43  }
    44  
    45  func pick(dict map[string]interface{}, keys ...string) map[string]interface{} {
    46  	res := map[string]interface{}{}
    47  	for _, k := range keys {
    48  		if v, ok := dict[k]; ok {
    49  			res[k] = v
    50  		}
    51  	}
    52  	return res
    53  }
    54  
    55  func omit(dict map[string]interface{}, keys ...string) map[string]interface{} {
    56  	res := map[string]interface{}{}
    57  
    58  	omit := make(map[string]bool, len(keys))
    59  	for _, k := range keys {
    60  		omit[k] = true
    61  	}
    62  
    63  	for k, v := range dict {
    64  		if _, ok := omit[k]; !ok {
    65  			res[k] = v
    66  		}
    67  	}
    68  	return res
    69  }
    70  
    71  func dict(v ...interface{}) map[string]interface{} {
    72  	dict := map[string]interface{}{}
    73  	lenv := len(v)
    74  	for i := 0; i < lenv; i += 2 {
    75  		key := strval(v[i])
    76  		if i+1 >= lenv {
    77  			dict[key] = ""
    78  			continue
    79  		}
    80  		dict[key] = v[i+1]
    81  	}
    82  	return dict
    83  }
    84  
    85  func values(dict map[string]interface{}) []interface{} {
    86  	values := []interface{}{}
    87  	for _, value := range dict {
    88  		values = append(values, value)
    89  	}
    90  
    91  	return values
    92  }
    93  
    94  func dig(ps ...interface{}) (interface{}, error) {
    95  	if len(ps) < 3 {
    96  		panic("dig needs at least three arguments")
    97  	}
    98  	dict := ps[len(ps)-1].(map[string]interface{})
    99  	def := ps[len(ps)-2]
   100  	ks := make([]string, len(ps)-2)
   101  	for i := 0; i < len(ks); i++ {
   102  		ks[i] = ps[i].(string)
   103  	}
   104  
   105  	return digFromDict(dict, def, ks)
   106  }
   107  
   108  func digFromDict(dict map[string]interface{}, d interface{}, ks []string) (interface{}, error) {
   109  	k, ns := ks[0], ks[1:len(ks)]
   110  	step, has := dict[k]
   111  	if !has {
   112  		return d, nil
   113  	}
   114  	if len(ns) == 0 {
   115  		return step, nil
   116  	}
   117  	return digFromDict(step.(map[string]interface{}), d, ns)
   118  }
   119  

View as plain text