func()

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
}