code: func nodeWalk(node interface{}, key string, vars map[string]string) error {
  	switch node.(type) {
  	case []interface{}:
  		for i, j := range node.([]interface{}) {
  			key := path.Join(key, strconv.Itoa(i))
  			nodeWalk(j, key, vars)
  		}
  	case map[interface{}]interface{}:
  		for k, v := range node.(map[interface{}]interface{}) {
  			key := path.Join(key, k.(string))
  			nodeWalk(v, key, vars)
  		}
  	case string:
  		vars[key] = node.(string)
  	case int:
  		vars[key] = strconv.Itoa(node.(int))
  	case bool:
  		vars[key] = strconv.FormatBool(node.(bool))
  	case float64:
  		vars[key] = strconv.FormatFloat(node.(float64), 'f', -1, 64)
  	}
  	return nil
  }
docs: // nodeWalk recursively descends nodes, updating vars.