func NewConfig()

in src/ulsp/internal/core/config.go [28:77]


func NewConfig() (uber_config.Provider, error) {
	// Get the config directory path
	configDir := getConfigDir()

	// First, load meta.yaml to get the list of configuration files
	metaPath := filepath.Join(configDir, "meta.yaml")
	metaProvider, err := uber_config.NewYAML(
		uber_config.File(metaPath),
		uber_config.Expand(os.LookupEnv),
	)
	if err != nil {
		return nil, fmt.Errorf("failed to load meta configuration: %w", err)
	}

	// Get the files list from meta.yaml
	var configFiles []string
	if err := metaProvider.Get("files").Populate(&configFiles); err != nil {
		return nil, fmt.Errorf("failed to read files list from meta.yaml: %w", err)
	}

	// Create a slice to hold valid config files
	var validFiles []string

	// Check which files exist and add them to the list
	for _, file := range configFiles {
		fullPath := filepath.Join(configDir, file)
		if _, err := os.Stat(fullPath); err == nil {
			validFiles = append(validFiles, fullPath)
		}
	}

	if len(validFiles) == 0 {
		return nil, fmt.Errorf("no configuration files found in %s", configDir)
	}

	// Create options for loading all valid files
	var options []uber_config.YAMLOption
	for _, file := range validFiles {
		options = append(options, uber_config.File(file))
	}
	options = append(options, uber_config.Expand(os.LookupEnv))

	// Create the provider with all files and environment variable substitution
	provider, err := uber_config.NewYAML(options...)
	if err != nil {
		return nil, fmt.Errorf("failed to load configuration: %w", err)
	}

	return Config{provider: provider}, nil
}