// Merges data into the our attributes configuration tier from a struct. func (manager *Config) MergeAttributes(val interface{}) error { merged_config := maps.Merge( manager.attributes.ToStringMap(), cast.ToStringMap(val), ) manager.attributes.FromStringMap(merged_config) return nil }
// Loads and sequentially + recursively merges the provided config arguments. Returns // an error if any of the files fail to load, though this may be expecte // in the case of search paths. func (manager *Config) ReadPaths(paths ...string) error { var err error var loaded interface{} merged_config := manager.attributes.ToStringMap() errs := []error{} for _, base_path := range paths { var final_path string if filepath.IsAbs(base_path) == false { final_path = path.Join(manager.rootPath, base_path) } else { final_path = path.Join(manager.rootPath, base_path) } loaded, err = reader.ReadFile(final_path) if err != nil { errs = append(errs, err) continue } // In-place recursive coercion to stringmap. coerced := cast.ToStringMap(loaded) maps.ToStringMapRecursive(coerced) if merged_config == nil { merged_config = coerced } else { merged_config = maps.Merge( merged_config, coerced, ) } manager.attributes.FromStringMap(merged_config) } if len(errs) > 0 { return &errors.LoadError{Errors: errs} } else { return nil } }