using System.IO.Abstractions; using System.Reflection; using Autofac; using CliFx; using Serilog; using Serilog.Core; using Trash.Config; using Trash.Radarr.Api; using Trash.Radarr.QualityDefinition; 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().SingleInstance(); builder.Register(c => { const string template = "[{Level:u3}] {Message:lj}{NewLine}{Exception}"; return new LoggerConfiguration() .MinimumLevel.ControlledBy(c.Resolve()) .WriteTo.Console(outputTemplate: template) .CreateLogger(); }) .As(); } 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) { builder.RegisterType().As(); // Quality Definition Support builder.RegisterType(); builder.RegisterType().As(); } public static IContainer Setup() { var builder = new ContainerBuilder(); builder.RegisterType().As(); // Configuration builder.RegisterType().As(); builder.RegisterGeneric(typeof(ConfigurationLoader<>)).As(typeof(IConfigurationLoader<>)); builder.RegisterGeneric(typeof(ConfigurationProvider<>)) .As(typeof(IConfigurationProvider<>)) .SingleInstance(); // 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))); SetupLogging(builder); SonarrRegistrations(builder); RadarrRegistrations(builder); // builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource()); return builder.Build(); } } }