github.imxd.top/hashicorp/consul@v1.4.5/agent/config/patch_hcl.go (about)

     1  package config
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  func patchSliceOfMaps(m map[string]interface{}, skip []string) map[string]interface{} {
     8  	return patchValue("", m, skip).(map[string]interface{})
     9  }
    10  
    11  func patchValue(name string, v interface{}, skip []string) interface{} {
    12  	// fmt.Printf("%q: %T\n", name, v)
    13  	switch x := v.(type) {
    14  	case map[string]interface{}:
    15  		if len(x) == 0 {
    16  			return x
    17  		}
    18  		mm := make(map[string]interface{})
    19  		for k, v := range x {
    20  			key := k
    21  			if name != "" {
    22  				key = name + "." + k
    23  			}
    24  			mm[k] = patchValue(key, v, skip)
    25  		}
    26  		return mm
    27  
    28  	case []interface{}:
    29  		if len(x) == 0 {
    30  			return nil
    31  		}
    32  		if strSliceContains(name, skip) {
    33  			for i, y := range x {
    34  				x[i] = patchValue(name, y, skip)
    35  			}
    36  			return x
    37  		}
    38  		if _, ok := x[0].(map[string]interface{}); !ok {
    39  			return x
    40  		}
    41  		if len(x) > 1 {
    42  			panic(fmt.Sprintf("%s: []map[string]interface{} with more than one element not supported: %s", name, v))
    43  		}
    44  		return patchValue(name, x[0], skip)
    45  
    46  	case []map[string]interface{}:
    47  		if len(x) == 0 {
    48  			return nil
    49  		}
    50  		if strSliceContains(name, skip) {
    51  			for i, y := range x {
    52  				x[i] = patchValue(name, y, skip).(map[string]interface{})
    53  			}
    54  			return x
    55  		}
    56  		if len(x) > 1 {
    57  			panic(fmt.Sprintf("%s: []map[string]interface{} with more than one element not supported: %s", name, v))
    58  		}
    59  		return patchValue(name, x[0], skip)
    60  
    61  	default:
    62  		return v
    63  	}
    64  }
    65  
    66  func strSliceContains(s string, v []string) bool {
    67  	for _, vv := range v {
    68  		if s == vv {
    69  			return true
    70  		}
    71  	}
    72  	return false
    73  }