Пример #1
0
 public CommandHelpBuilder(Func <string>?getExecutionCommandName, IServiceProviderIsService isService, ConsoleAppOptions options)
 {
     this.getExecutionCommandName = getExecutionCommandName ?? GetExecutionCommandNameDefault;
     this.isStrictOption          = options.StrictOption;
     this.isService = isService;
     this.options   = options;
 }
Пример #2
0
 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;
 }
Пример #4
0
 public string[] GetNames(ConsoleAppOptions options)
 {
     if (CommandAttribute != null)
     {
         return(CommandAttribute.CommandNames);
     }
     return(new[] { options.NameConverter(MethodInfo.Name) });
 }
Пример #5
0
 public string GetCommandName(ConsoleAppOptions options)
 {
     if (ParentCommand != null)
     {
         return($"{ParentCommand} {GetNamesFormatted(options)}");
     }
     else
     {
         return(GetNamesFormatted(options));
     }
 }
Пример #6
0
        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());
        }
Пример #8
0
 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());
        }
Пример #12
0
 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);
 }