1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package config
- import (
- "github.com/rancher/os/log"
- "github.com/rancher/os/util"
- )
- type CfgFunc func(*CloudConfig) (*CloudConfig, error)
- type CfgFuncData struct {
- Name string
- Func CfgFunc
- }
- type CfgFuncs []CfgFuncData
- func ChainCfgFuncs(cfg *CloudConfig, cfgFuncs CfgFuncs) (*CloudConfig, error) {
- len := len(cfgFuncs)
- for c, d := range cfgFuncs {
- i := c + 1
- name := d.Name
- cfgFunc := d.Func
- if cfg == nil {
- log.Infof("[%d/%d] Starting %s WITH NIL cfg", i, len, name)
- } else {
- log.Infof("[%d/%d] Starting %s", i, len, name)
- }
- var err error
- if cfg, err = cfgFunc(cfg); err != nil {
- log.Errorf("Failed [%d/%d] %s: %s", i, len, name, err)
- return cfg, err
- }
- log.Debugf("[%d/%d] Done %s", i, len, name)
- }
- return cfg, nil
- }
- func filterKey(data map[interface{}]interface{}, key []string) (filtered, rest map[interface{}]interface{}) {
- if len(key) == 0 {
- return data, map[interface{}]interface{}{}
- }
- filtered = map[interface{}]interface{}{}
- rest = util.MapCopy(data)
- k := key[0]
- if d, ok := data[k]; ok {
- switch d := d.(type) {
- case map[interface{}]interface{}:
- f, r := filterKey(d, key[1:])
- if len(f) != 0 {
- filtered[k] = f
- }
- if len(r) != 0 {
- rest[k] = r
- } else {
- delete(rest, k)
- }
- default:
- filtered[k] = d
- delete(rest, k)
- }
- }
- return
- }
|