public CommandHelpBuilder(Func <string>?getExecutionCommandName, IServiceProviderIsService isService, ConsoleAppOptions options) { this.getExecutionCommandName = getExecutionCommandName ?? GetExecutionCommandNameDefault; this.isStrictOption = options.StrictOption; this.isService = isService; this.options = options; }
internal ConsoleApp(IHost host) { this.Host = host; this.Logger = host.Services.GetRequiredService <ILogger <ConsoleApp> >(); this.options = host.Services.GetRequiredService <ConsoleAppOptions>(); this.commands = options.CommandDescriptors; }
public ConsoleAppEngine(ILogger <ConsoleAppEngine> logger, IServiceProvider provider, ConsoleAppOptions options, CancellationToken cancellationToken) { this.logger = logger; this.provider = provider; this.cancellationToken = cancellationToken; this.options = options; this.isStrict = this.options.StrictOption; }
public string[] GetNames(ConsoleAppOptions options) { if (CommandAttribute != null) { return(CommandAttribute.CommandNames); } return(new[] { options.NameConverter(MethodInfo.Name) }); }
public string GetCommandName(ConsoleAppOptions options) { if (ParentCommand != null) { return($"{ParentCommand} {GetNamesFormatted(options)}"); } else { return(GetNamesFormatted(options)); } }
static ConsoleAppOptions ConfigureLegacyCompatible(ConsoleAppOptions?options) { if (options == null) { options = new ConsoleAppOptions(); } options.NoAttributeCommandAsImplicitlyDefault = true; options.StrictOption = false; options.NameConverter = x => x.ToLower(); options.ReplaceToUseSimpleConsoleLogger = false; return(options); }
IHostBuilder AddConsoleAppFramework(IHostBuilder builder, string[] args, ConsoleAppOptions options, Action <HostBuilderContext, ConsoleAppOptions>?configureOptions) { return(builder .ConfigureServices((ctx, services) => { services.AddOptions <ConsoleLifetimeOptions>().Configure(x => x.SuppressStatusMessages = true); services.AddHostedService <ConsoleAppEngineService>(); configureOptions?.Invoke(ctx, options); options.CommandLineArguments = args; services.AddSingleton(options); if (options.ReplaceToUseSimpleConsoleLogger) { services.AddLogging(builder => { builder.ReplaceToSimpleConsole(); }); } }) .UseConsoleLifetime()); }
public CommandDescriptorCollection(ConsoleAppOptions options) { this.options = options; }
static void ShowMethodList(Assembly[] searchAssemblies, ConsoleAppOptions options) { Console.Write(new CommandHelpBuilder(null, options.StrictOption, options.ShowDefaultCommand).BuildHelpMessage(GetConsoleAppTypes(searchAssemblies))); }
/// <summary> /// Setup multiple ConsoleApp that are searched from all assemblies. /// </summary> public static IHostBuilder UseConsoleAppFramework(this IHostBuilder hostBuilder, string[] args, ConsoleAppOptions?options = null, Assembly[]?searchAssemblies = null) { IHostBuilder ConfigureEmptyService() { hostBuilder.ConfigureServices(services => { services.AddOptions <ConsoleLifetimeOptions>().Configure(x => x.SuppressStatusMessages = true); services.AddSingleton <IHostedService, EmptyHostedService>(); }); return(hostBuilder); } searchAssemblies ??= AppDomain.CurrentDomain.GetAssemblies(); if (options == null) { options = new ConsoleAppOptions(); } // () or -help if (args.Length == 0 || (args.Length == 1 && TrimEquals(args[0], HelpCommand))) { ShowMethodList(searchAssemblies, options); ConfigureEmptyService(); return(hostBuilder); } // -version if (args.Length == 1 && TrimEquals(args[0], VersionCommand)) { ShowVersion(); ConfigureEmptyService(); return(hostBuilder); } // backward compatibility, logic use Class.Method if (!args[0].Contains(".") && args.Length >= 2) { var newArgs = new string[args.Length - 1]; newArgs[0] = args[0] + "." + args[1]; Array.Copy(args, 2, newArgs, 1, newArgs.Length - 1); args = newArgs; } if (args.Length == 2) { int methodIndex = -1; // help command if (TrimEquals(args[0], HelpCommand)) { methodIndex = 1; } // command -help else if (TrimEquals(args[1], HelpCommand)) { methodIndex = 0; } if (methodIndex != -1) { var(t, mi) = GetTypeFromAssemblies(args[methodIndex], null, searchAssemblies); if (mi != null) { Console.Write(new CommandHelpBuilder(null, options.StrictOption, options.ShowDefaultCommand).BuildHelpMessage(mi, showCommandName: true, true)); } else { Console.Error.WriteLine("Method not found, please check \"help\" command."); } ConfigureEmptyService(); return(hostBuilder); } } Type? type = null; MethodInfo?methodInfo = null; if (args.Length >= 1) { (type, methodInfo) = GetTypeFromAssemblies(args[0], null, searchAssemblies); } hostBuilder = hostBuilder .ConfigureServices(services => { services.AddOptions <ConsoleLifetimeOptions>().Configure(x => x.SuppressStatusMessages = true); services.AddSingleton <string[]>(args); services.AddSingleton <IHostedService, ConsoleAppEngineService>(); services.AddSingleton <ConsoleAppOptions>(options ?? new ConsoleAppOptions()); if (type != null) { services.AddSingleton <Type>(type); services.AddTransient(type); } else { services.AddSingleton <Type>(typeof(void)); } if (methodInfo != null) { services.AddSingleton <MethodInfo>(methodInfo); } foreach (var item in CollectFilterType(type, methodInfo)) { services.AddTransient(item); } }); return(hostBuilder.UseConsoleLifetime()); }
/// <summary> /// Setup a single ConsoleApp type that is targeted by type argument. /// </summary> public static IHostBuilder UseConsoleAppFramework <T>(this IHostBuilder hostBuilder, string[] args, ConsoleAppOptions?options = null, Assembly[]?searchAssemblies = null) where T : ConsoleAppBase { IHostBuilder ConfigureEmptyService() { hostBuilder.ConfigureServices(services => { services.AddOptions <ConsoleLifetimeOptions>().Configure(x => x.SuppressStatusMessages = true); services.AddSingleton <IHostedService, EmptyHostedService>(); }); return(hostBuilder); } searchAssemblies ??= AppDomain.CurrentDomain.GetAssemblies(); if (options == null) { options = new ConsoleAppOptions(); } var methods = typeof(T).GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); var defaultMethod = methods.FirstOrDefault(x => x.GetCustomAttribute <CommandAttribute>() == null); var hasHelp = methods.Any(x => x.GetCustomAttribute <CommandAttribute>()?.EqualsAny(HelpCommand) ?? false); var hasVersion = methods.Any(x => x.GetCustomAttribute <CommandAttribute>()?.EqualsAny(VersionCommand) ?? false); if (args.Length == 0) { if (defaultMethod == null || (defaultMethod.GetParameters().Length != 0 && !defaultMethod.GetParameters().All(x => x.HasDefaultValue))) { if (!hasHelp) { Console.Write(new CommandHelpBuilder(null, options.StrictOption, options.ShowDefaultCommand).BuildHelpMessage(methods, defaultMethod)); ConfigureEmptyService(); return(hostBuilder); } else { // override default Help args = new string[] { "--help" }; } } } if (!hasHelp && args.Length == 1 && OptionEquals(args[0], HelpCommand)) { Console.Write(new CommandHelpBuilder(null, options.StrictOption, options.ShowDefaultCommand).BuildHelpMessage(methods, defaultMethod)); ConfigureEmptyService(); return(hostBuilder); } if (args.Length == 1 && OptionEquals(args[0], VersionCommand)) { ShowVersion(); ConfigureEmptyService(); return(hostBuilder); } if (args.Length == 2 && methods.Length > 0 && defaultMethod == null) { int methodIndex = -1; // help command if (TrimEquals(args[0], HelpCommand)) { methodIndex = 1; } // command -help else if (OptionEquals(args[1], HelpCommand)) { methodIndex = 0; } if (methodIndex != -1) { var(_, mi) = GetTypeFromAssemblies(args[methodIndex], typeof(T), searchAssemblies); if (mi != null) { Console.Write(new CommandHelpBuilder(null, options.StrictOption, options.ShowDefaultCommand).BuildHelpMessage(mi, showCommandName: true, fromMultiCommand: false)); ConfigureEmptyService(); return(hostBuilder); } } } hostBuilder = hostBuilder.ConfigureServices(services => { services.AddOptions <ConsoleLifetimeOptions>().Configure(x => x.SuppressStatusMessages = true); services.AddSingleton <string[]>(args); services.AddSingleton <Type>(typeof(T)); services.AddSingleton <IHostedService, ConsoleAppEngineService>(); services.AddSingleton <ConsoleAppOptions>(options ?? new ConsoleAppOptions()); services.AddTransient <T>(); foreach (var item in CollectFilterType(typeof(T), null)) { services.AddTransient(item); } }); return(hostBuilder.UseConsoleLifetime()); }
public string GetNamesFormatted(ConsoleAppOptions options) { return(string.Join(", ", GetNames(options))); }
internal ConsoleAppBuilder(string[] args, IHostBuilder hostBuilder, ConsoleAppOptions consoleAppOptions) { this.builder = AddConsoleAppFramework(hostBuilder, args, consoleAppOptions, null); }