using System.IO.Abstractions; using Recyclarr.Config.ExceptionTypes; using Recyclarr.Config.Models; using Recyclarr.Config.Parsing; using Recyclarr.Config.Parsing.ErrorHandling; namespace Recyclarr.Config; public class ConfigurationRegistry(IConfigurationLoader loader, IConfigurationFinder finder, IFileSystem fs) : IConfigurationRegistry { public IReadOnlyCollection FindAndLoadConfigs(ConfigFilterCriteria? filterCriteria = null) { filterCriteria ??= new ConfigFilterCriteria(); var manualConfigs = filterCriteria.ManualConfigFiles; var configs = manualConfigs is not null && manualConfigs.Any() ? PrepareManualConfigs(manualConfigs) : finder.GetConfigFiles(); return LoadAndFilterConfigs(configs, filterCriteria).ToList(); } private IReadOnlyCollection PrepareManualConfigs(IEnumerable manualConfigs) { var configFiles = manualConfigs .Select(x => fs.FileInfo.New(x)) .ToLookup(x => x.Exists); if (configFiles[false].Any()) { throw new InvalidConfigurationFilesException(configFiles[false].ToList()); } return configFiles[true].ToList(); } private IEnumerable LoadAndFilterConfigs( IEnumerable configs, ConfigFilterCriteria filterCriteria) { var loadedConfigs = configs.SelectMany(x => loader.Load(x)).ToList(); var dupeInstances = loadedConfigs.GetDuplicateInstanceNames().ToList(); if (dupeInstances.Any()) { throw new DuplicateInstancesException(dupeInstances); } var invalidInstances = loadedConfigs.GetInvalidInstanceNames(filterCriteria).ToList(); if (invalidInstances.Any()) { throw new InvalidInstancesException(invalidInstances); } var splitInstances = loadedConfigs.GetSplitInstances().ToList(); if (splitInstances.Any()) { throw new SplitInstancesException(splitInstances); } return loadedConfigs.GetConfigsBasedOnSettings(filterCriteria); } }