using System; using System.CommandLine; using System.CommandLine.IO; using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using NLog.Extensions.Logging; using NLog.Targets; using Octokit; using Wabbajack.DTOs.Interventions; using Wabbajack.Networking.Http; using Wabbajack.Networking.Http.Interfaces; using Wabbajack.Paths.IO; using Wabbajack.Server.Lib; using Wabbajack.Services.OSIntegrated; using Wabbajack.VFS; using Client = Wabbajack.Networking.GitHub.Client; using Wabbajack.CLI.Builder; namespace Wabbajack.CLI; internal class Program { private static async Task Main(string[] args) { var host = Host.CreateDefaultBuilder(Array.Empty()) .ConfigureLogging(AddLogging) .ConfigureServices((host, services) => { services.AddSingleton(new JsonSerializerOptions()); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(new ParallelOptions {MaxDegreeOfParallelism = Environment.ProcessorCount}); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(s => new GitHubClient(new ProductHeaderValue("wabbajack"))); services.AddOSIntegrated(); services.AddServerLib(); services.AddTransient(); services.AddSingleton(); services.AddCLIVerbs(); services.AddSingleton(); }).Build(); var service = host.Services.GetService(); return await service!.Run(args); } private static void AddLogging(ILoggingBuilder loggingBuilder) { var config = new NLog.Config.LoggingConfiguration(); var fileTarget = new FileTarget("file") { FileName = "logs/wabbajack-cli.current.log", ArchiveFileName = "logs/wabbajack-cli.{##}.log", ArchiveOldFileOnStartup = true, MaxArchiveFiles = 10, Layout = "${processtime} [${level:uppercase=true}] (${logger}) ${message:withexception=true}", Header = "############ Wabbajack log file - ${longdate} ############" }; var consoleTarget = new ConsoleTarget("console") { Layout = "${processtime} [${level:uppercase=true}] ${message:withexception=true}", }; config.AddRuleForAllLevels(fileTarget); config.AddRuleForAllLevels(consoleTarget); loggingBuilder.ClearProviders(); loggingBuilder.SetMinimumLevel(LogLevel.Trace); loggingBuilder.AddNLog(config); } }