using System; using System.IO; using System.IO.Abstractions; using System.Reflection; using Autofac; using Autofac.Extras.AggregateService; using CliFx; using Serilog; using Serilog.Core; using Trash.Cache; using Trash.Command; using Trash.Config; using Trash.Radarr.CustomFormat; using Trash.Radarr.CustomFormat.Api; using Trash.Radarr.CustomFormat.Guide; using Trash.Radarr.CustomFormat.Processors; using Trash.Radarr.CustomFormat.Processors.GuideSteps; using Trash.Radarr.CustomFormat.Processors.PersistenceSteps; using Trash.Radarr.QualityDefinition; using Trash.Radarr.QualityDefinition.Api; using Trash.Sonarr.Api; using Trash.Sonarr.QualityDefinition; using Trash.Sonarr.ReleaseProfile; using YamlDotNet.Serialization; namespace Trash { public static class CompositionRoot { private static void SetupLogging(ContainerBuilder builder) { builder.RegisterType().As(); builder.RegisterType().SingleInstance(); builder.Register(c => { var logPath = Path.Combine(AppPaths.LogDirectory, $"trash_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.log"); const string consoleTemplate = "[{Level:u3}] {Message:lj}{NewLine}{Exception}"; return new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console(outputTemplate: consoleTemplate, levelSwitch: c.Resolve()) .WriteTo.File(logPath) .CreateLogger(); }) .As() .SingleInstance(); } private static void SonarrRegistrations(ContainerBuilder builder) { builder.RegisterType().As(); // Release Profile Support builder.RegisterType(); builder.RegisterType().As(); // Quality Definition Support builder.RegisterType(); builder.RegisterType().As(); } private static void RadarrRegistrations(ContainerBuilder builder) { // Api Services builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); // Quality Definition Support builder.RegisterType(); builder.RegisterType().As(); // Custom Format Support builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); // Guide Processor builder.RegisterType().As(); builder.RegisterAggregateService(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); // Persistence Processor builder.RegisterType().As(); builder.RegisterAggregateService(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); } private static void ConfigurationRegistrations(ContainerBuilder builder) { builder.RegisterType() .As(); builder.RegisterGeneric(typeof(ConfigurationLoader<>)) .As(typeof(IConfigurationLoader<>)); builder.RegisterType() .As() .SingleInstance(); // note: Do not allow consumers to resolve IServiceConfiguration directly; if this gets cached // they end up using the wrong configuration when multiple instances are used. // builder.Register(c => c.Resolve().ActiveConfiguration) // .As(); } private static void CommandRegistrations(ContainerBuilder builder) { // Register all types deriving from CliFx's ICommand. These are all of our supported subcommands. builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) .Where(t => t.IsAssignableTo(typeof(ICommand))); // Used to access the chosen command class. This is assigned from CliTypeActivator builder.RegisterType() .As() .SingleInstance(); builder.Register(c => c.Resolve().ActiveCommand) .As(); } public static IContainer Setup() { return Setup(new ContainerBuilder()); } public static IContainer Setup(ContainerBuilder builder) { builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); ConfigurationRegistrations(builder); CommandRegistrations(builder); SetupLogging(builder); SonarrRegistrations(builder); RadarrRegistrations(builder); // builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource()); return builder.Build(); } } }