using System.IO; using System.Runtime.InteropServices; using Avalonia.Input; using FileTime.App.Core.Configuration; using FileTime.App.Core.Services; using FileTime.App.Core.ViewModels; using FileTime.Core.Interactions; using FileTime.GuiApp.App.Configuration; using FileTime.GuiApp.CustomImpl.ViewModels; using FileTime.GuiApp.App.IconProviders; using FileTime.GuiApp.App.Logging; using FileTime.GuiApp.App.Services; using FileTime.GuiApp.App.ViewModels; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Serilog; namespace FileTime.GuiApp; public static class Startup { internal static IConfigurationRoot CreateConfiguration() { var configurationBuilder = new ConfigurationBuilder() .AddInMemoryCollection(MainConfiguration.Configuration) .AddJsonFile("appsettings.json", optional: true) .AddJsonFile($"appsettings.{Program.EnvironmentName}.json", true) .AddJsonFile("appsettings.Local.json", optional: true); var configurationDirectory = new DirectoryInfo(Path.Combine(Program.AppDataRoot, "config")); if (configurationDirectory.Exists) { foreach (var settingsFile in configurationDirectory.GetFiles("*.json")) { configurationBuilder.AddJsonFile(settingsFile.FullName, optional: true, reloadOnChange: true); } } return configurationBuilder.Build(); } internal static IServiceCollection AddViewModels(this IServiceCollection serviceCollection) { serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(s => s.GetRequiredService()); serviceCollection.TryAddSingleton(s => s.GetRequiredService()); return serviceCollection; } internal static IServiceCollection RegisterServices(this IServiceCollection serviceCollection) { serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(sp => sp.GetRequiredService()); serviceCollection.TryAddSingleton(); serviceCollection.TryAddSingleton(s => s.GetRequiredService()); serviceCollection.TryAddSingleton, GuiAppKeyService>(); if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { serviceCollection .AddSingleton() .AddSingleton(); } else { serviceCollection .AddSingleton() .AddSingleton(); } return serviceCollection .AddSingleton() .AddSingleton(sp => sp.GetRequiredService()); } internal static IServiceCollection RegisterLogging(this IServiceCollection serviceCollection) { serviceCollection.AddSerilog( (serviceProvider, loggerConfiguration) => { loggerConfiguration #if DEBUG || VERBOSE_LOGGING .MinimumLevel.Verbose() #endif .ReadFrom.Configuration(serviceProvider.GetRequiredService()) .Enrich.FromLogContext() .WriteTo.File( Path.Combine(Program.AppDataRoot, "logs", "appLog.log"), fileSizeLimitBytes: 10 * 1024 * 1024, rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true) .WriteTo.Sink(serviceProvider.GetRequiredService()); } ); serviceCollection.AddLogging(loggingBuilder => loggingBuilder.AddSerilog(dispose: true) ); return serviceCollection; } internal static IServiceCollection AddConfiguration(this IServiceCollection serviceCollection, IConfigurationRoot configuration) { return serviceCollection .Configure(configuration.GetSection(SectionNames.ProgramsSectionName)) .Configure(configuration.GetSection(SectionNames.KeybindingSectionName)) .AddSingleton(configuration); } }