From 6a6f95d70f6935fcbcb6a53ae50422a927d86c13 Mon Sep 17 00:00:00 2001 From: halgari Date: Fri, 30 Sep 2022 18:46:15 -0600 Subject: [PATCH] rework cli stuff a bit --- Wabbajack.CLI/CommandLineBuilder.cs | 39 ++++++++++++++++++++++++++++- Wabbajack.CLI/Program.cs | 27 +------------------- Wabbajack.CLI/VerbRegistration.cs | 34 +++++++++++++++++++++++++ Wabbajack.CLI/VerbRegistration.tt | 26 +++++++++++++++++++ Wabbajack.CLI/Verbs/Compile.cs | 2 +- Wabbajack.CLI/Wabbajack.CLI.csproj | 12 +++++++++ 6 files changed, 112 insertions(+), 28 deletions(-) create mode 100644 Wabbajack.CLI/VerbRegistration.cs create mode 100644 Wabbajack.CLI/VerbRegistration.tt diff --git a/Wabbajack.CLI/CommandLineBuilder.cs b/Wabbajack.CLI/CommandLineBuilder.cs index 91fc91ae..ca45fb84 100644 --- a/Wabbajack.CLI/CommandLineBuilder.cs +++ b/Wabbajack.CLI/CommandLineBuilder.cs @@ -1,12 +1,16 @@ +using System; using System.Collections.Generic; using System.CommandLine; +using System.ComponentModel.Design; +using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Wabbajack.CLI.Verbs; using Wabbajack.Services.OSIntegrated; namespace Wabbajack.CLI; -public class CommandLineBuilder +public partial class CommandLineBuilder { private readonly IConsole _console; private readonly IEnumerable _verbs; @@ -17,6 +21,11 @@ public class CommandLineBuilder _verbs = verbs; } + static CommandLineBuilder() + { + RegisterAll(); + } + public async Task Run(string[] args) { var root = new RootCommand(); @@ -25,4 +34,32 @@ public class CommandLineBuilder return await root.InvokeAsync(args); } + + private static List<(Type, Func)> _commands { get; set; } = new(); + public static IEnumerable Verbs => _commands.Select(c => c.Item1); + public static void RegisterCommand(Func makeCommand) + { + _commands.Add((typeof(T), makeCommand)); + + } +} + +public record VerbDefinition() +{ + +} + +public static class CommandLineBuilderExtensions +{ + public static IServiceCollection AddCommands(this IServiceCollection services) + { + services.AddSingleton(); + + foreach (var verb in CommandLineBuilder.Verbs) + { + services.AddSingleton(typeof(IVerb), verb); + } + + return services; + } } \ No newline at end of file diff --git a/Wabbajack.CLI/Program.cs b/Wabbajack.CLI/Program.cs index 1a1a56f6..a5575efd 100644 --- a/Wabbajack.CLI/Program.cs +++ b/Wabbajack.CLI/Program.cs @@ -57,32 +57,7 @@ internal class Program services.AddTransient(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - + services.AddCommands(); services.AddSingleton(); }).Build(); diff --git a/Wabbajack.CLI/VerbRegistration.cs b/Wabbajack.CLI/VerbRegistration.cs new file mode 100644 index 00000000..dbb54a8e --- /dev/null +++ b/Wabbajack.CLI/VerbRegistration.cs @@ -0,0 +1,34 @@ + +namespace Wabbajack.CLI; +using Wabbajack.CLI.Verbs; + +public partial class CommandLineBuilder { + +private static void RegisterAll() { +RegisterCommand(Compile.MakeCommand); +RegisterCommand(Decrypt.MakeCommand); +RegisterCommand(DownloadAll.MakeCommand); +RegisterCommand(DownloadCef.MakeCommand); +RegisterCommand(DownloadUrl.MakeCommand); +RegisterCommand(DumpZipInfo.MakeCommand); +RegisterCommand(Encrypt.MakeCommand); +RegisterCommand(Extract.MakeCommand); +RegisterCommand(ForceHeal.MakeCommand); +RegisterCommand(GenerateMetricsReports.MakeCommand); +RegisterCommand(HashFile.MakeCommand); +RegisterCommand(HashUrlString.MakeCommand); +RegisterCommand(Install.MakeCommand); +RegisterCommand(InstallCompileInstallVerify.MakeCommand); +RegisterCommand(ListCreationClubContent.MakeCommand); +RegisterCommand(ListGames.MakeCommand); +RegisterCommand(ListModlists.MakeCommand); +RegisterCommand(MirrorFile.MakeCommand); +RegisterCommand(ModlistReport.MakeCommand); +RegisterCommand(SteamDownloadFile.MakeCommand); +RegisterCommand(SteamDumpAppInfo.MakeCommand); +RegisterCommand(SteamLogin.MakeCommand); +RegisterCommand(UploadToNexus.MakeCommand); +RegisterCommand(ValidateLists.MakeCommand); +RegisterCommand(VFSIndex.MakeCommand); +} +} \ No newline at end of file diff --git a/Wabbajack.CLI/VerbRegistration.tt b/Wabbajack.CLI/VerbRegistration.tt new file mode 100644 index 00000000..d8491df6 --- /dev/null +++ b/Wabbajack.CLI/VerbRegistration.tt @@ -0,0 +1,26 @@ +<#@ template language="C#v3.5" #> +<#@ assembly name="System.Core" #> +<#@ import namespace="System.Text" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="System.IO"#> +<#@ import namespace="System.Collections.Generic" #> + +namespace Wabbajack.CLI; +using Wabbajack.CLI.Verbs; + +public partial class CommandLineBuilder { + +private static void RegisterAll() { +<# +foreach (var verb in Directory.EnumerateFiles("Verbs")) +{ + var klass = verb.Split('\\').Last().Split('.').First(); + if (klass == "IVerb") continue; + #> +RegisterCommand<<#=klass#>>(<#=klass#>.MakeCommand); +<# +} + +#> +} +} \ No newline at end of file diff --git a/Wabbajack.CLI/Verbs/Compile.cs b/Wabbajack.CLI/Verbs/Compile.cs index e332d2bf..ab6f821d 100644 --- a/Wabbajack.CLI/Verbs/Compile.cs +++ b/Wabbajack.CLI/Verbs/Compile.cs @@ -38,7 +38,7 @@ public class Compile : IVerb _inferencer = inferencer; } - public Command MakeCommand() + public static Command MakeCommand() { var command = new Command("compile"); command.Add(new Option(new[] {"-i", "-installPath"}, "Install Path")); diff --git a/Wabbajack.CLI/Wabbajack.CLI.csproj b/Wabbajack.CLI/Wabbajack.CLI.csproj index 82df7317..f52b795f 100644 --- a/Wabbajack.CLI/Wabbajack.CLI.csproj +++ b/Wabbajack.CLI/Wabbajack.CLI.csproj @@ -40,6 +40,18 @@ + + TextTemplatingFileGenerator + VerbRegistration.cs + + + + + + True + True + VerbRegistration.tt +