in loader/loader.go [47:99]
func (l *Loader) Load(files []string) (*Config, error) {
inputsList := make([]*ucfg.Config, 0)
merger := cfgutil.NewCollector(nil)
for _, f := range files {
cfg, err := LoadFile(f)
if err != nil {
if l.isFileUnderInputsFolder(f) {
return nil, fmt.Errorf("failed to load external configuration file '%s': %w. Are you sure it contains an inputs section?", f, err)
}
return nil, fmt.Errorf("failed to load configuration file '%s': %w", f, err)
}
l.logger.Debugf("Loaded configuration from %s", f)
if l.isFileUnderInputsFolder(f) {
inp, err := getInput(cfg)
if err != nil {
return nil, fmt.Errorf("cannot get configuration from '%s': %w", f, err)
}
inputsList = append(inputsList, inp...)
l.logger.Debugf("Loaded %s input(s) from configuration from %s", len(inp), f)
} else {
if err := merger.Add(cfg.access(), err); err != nil {
return nil, fmt.Errorf("failed to merge configuration file '%s' to existing one: %w", f, err)
}
l.logger.Debugf("Merged configuration from %s into result", f)
}
}
config := merger.Config()
// if there is no input configuration, return what we have collected.
if len(inputsList) == 0 {
l.logger.Debugf("Merged all configuration files from %v, no external input files", files)
return newConfigFrom(config), nil
}
// merge inputs sections from the last standalone configuration
// file and all files from the inputs folder
start := 0
if config.HasField("inputs") {
var err error
start, err = config.CountField("inputs")
if err != nil {
return nil, fmt.Errorf("failed to count the number of inputs in the configuration: %w", err)
}
}
for i, ll := range inputsList {
if err := config.SetChild("inputs", start+i, ll); err != nil {
return nil, fmt.Errorf("failed to add inputs to result configuration: %w", err)
}
}
l.logger.Debugf("Merged all configuration files from %v, with external input files", files)
return newConfigFrom(config), nil
}