diff --git a/src/ServiceControl.Connector.MassTransit.Host/Commands/ConnectorCommandOptions.cs b/src/ServiceControl.Connector.MassTransit.Host/Commands/ConnectorCommandOptions.cs index a4c6e03..912a076 100644 --- a/src/ServiceControl.Connector.MassTransit.Host/Commands/ConnectorCommandOptions.cs +++ b/src/ServiceControl.Connector.MassTransit.Host/Commands/ConnectorCommandOptions.cs @@ -1,62 +1,71 @@ namespace ServiceControl.Connector.MassTransit.Host.Commands; using System.CommandLine; -using System.CommandLine.Parsing; public static class ConnectorCommandOptions { - static Option ConnectionString { get; } = new( - "--connection-string", - "The connection string for the transport. Can also be set via CONNECTION_STRING environment variable."); + static Option ConnectionString { get; } = new("--connection-string") + { + Description = "The connection string for the transport. Can also be set via CONNECTION_STRING environment variable." + }; - static Option TransportType { get; } = new( - "--transport-type", - "The transport type (AzureServiceBus, AzureServiceBusWithDeadLetter, RabbitMQ, AmazonSQS). Can also be set via TRANSPORT_TYPE environment variable."); + static Option TransportType { get; } = new("--transport-type") + { + Description = "The transport type (AzureServiceBus, AzureServiceBusWithDeadLetter, RabbitMQ, AmazonSQS). Can also be set via TRANSPORT_TYPE environment variable." + }; - static Option QueuesFile { get; } = new( - "--queues-file", - "Path to the file containing the list of queues to monitor. Can also be set via QUEUES_FILE environment variable."); + static Option QueuesFile { get; } = new("--queues-file") + { + Description = "Path to the file containing the list of queues to monitor. Can also be set via QUEUES_FILE environment variable." + }; - static Option ReturnQueue { get; } = new( - "--return-queue", - "The return queue name. Defaults to 'Particular.ServiceControl.Connector.MassTransit_return'. Can also be set via RETURN_QUEUE environment variable."); + static Option ReturnQueue { get; } = new("--return-queue") + { + Description = "The return queue name. Defaults to 'Particular.ServiceControl.Connector.MassTransit_return'. Can also be set via RETURN_QUEUE environment variable." + }; - static Option ErrorQueue { get; } = new( - "--error-queue", - "The error queue name. Defaults to 'error'. Can also be set via ERROR_QUEUE environment variable."); + static Option ErrorQueue { get; } = new("--error-queue") + { + Description = "The error queue name. Defaults to 'error'. Can also be set via ERROR_QUEUE environment variable." + }; - static Option ServiceControlQueue { get; } = new( - "--servicecontrol-queue", - "The ServiceControl queue name. Defaults to 'Particular.ServiceControl'. Can also be set via SERVICECONTROL_QUEUE environment variable."); + static Option ServiceControlQueue { get; } = new("--servicecontrol-queue") + { + Description = "The ServiceControl queue name. Defaults to 'Particular.ServiceControl'. Can also be set via SERVICECONTROL_QUEUE environment variable." + }; - static Option RabbitMqManagementApiUrl { get; } = new( - "--rabbitmq-management-api-url", - "The RabbitMQ management API URL (required for RabbitMQ transport). Can also be set via RABBITMQ_MANAGEMENT_API_URL environment variable."); + static Option RabbitMqManagementApiUrl { get; } = new("--rabbitmq-management-api-url") + { + Description = "The RabbitMQ management API URL (required for RabbitMQ transport). Can also be set via RABBITMQ_MANAGEMENT_API_URL environment variable." + }; - static Option RabbitMqManagementApiUsername { get; } = new( - "--rabbitmq-management-api-username", - "The RabbitMQ management API username. Can also be set via RABBITMQ_MANAGEMENT_API_USERNAME environment variable."); + static Option RabbitMqManagementApiUsername { get; } = new("--rabbitmq-management-api-username") + { + Description = "The RabbitMQ management API username. Can also be set via RABBITMQ_MANAGEMENT_API_USERNAME environment variable." + }; - static Option RabbitMqManagementApiPassword { get; } = new( - "--rabbitmq-management-api-password", - "The RabbitMQ management API password. Can also be set via RABBITMQ_MANAGEMENT_API_PASSWORD environment variable."); + static Option RabbitMqManagementApiPassword { get; } = new("--rabbitmq-management-api-password") + { + Description = "The RabbitMQ management API password. Can also be set via RABBITMQ_MANAGEMENT_API_PASSWORD environment variable." + }; - static Option RabbitMqQueueType { get; } = new( - "--rabbitmq-queue-type", - "The RabbitMQ queue type (Classic or Quorum). Defaults to Quorum. Can also be set via RABBITMQ_QUEUE_TYPE environment variable."); + static Option RabbitMqQueueType { get; } = new("--rabbitmq-queue-type") + { + Description = "The RabbitMQ queue type (Classic or Quorum). Defaults to Quorum. Can also be set via RABBITMQ_QUEUE_TYPE environment variable." + }; public static void AddConnectorOptions(this Command command) { - command.AddOption(ConnectionString); - command.AddOption(TransportType); - command.AddOption(QueuesFile); - command.AddOption(ReturnQueue); - command.AddOption(ErrorQueue); - command.AddOption(ServiceControlQueue); - command.AddOption(RabbitMqManagementApiUrl); - command.AddOption(RabbitMqManagementApiUsername); - command.AddOption(RabbitMqManagementApiPassword); - command.AddOption(RabbitMqQueueType); + command.Add(ConnectionString); + command.Add(TransportType); + command.Add(QueuesFile); + command.Add(ReturnQueue); + command.Add(ErrorQueue); + command.Add(ServiceControlQueue); + command.Add(RabbitMqManagementApiUrl); + command.Add(RabbitMqManagementApiUsername); + command.Add(RabbitMqManagementApiPassword); + command.Add(RabbitMqQueueType); } public static string[] BuildArgs(ParseResult parseResult) @@ -80,16 +89,16 @@ void AddArgIfExplicit(Option option, string configKey) { // Only forward options that the user explicitly provided on the command line. // Omitting defaults lets environment variables take effect through normal config precedence. - if (parseResult.FindResultFor(option) == null) + var token = parseResult.GetValue(option); + if (token == null) { return; } - var value = parseResult.GetValueForOption(option); - if (!string.IsNullOrEmpty(value)) + if (!string.IsNullOrEmpty(token)) { - args.Add($"--{configKey}={value}"); + args.Add($"--{configKey}={token}"); } } } -} +} \ No newline at end of file diff --git a/src/ServiceControl.Connector.MassTransit.Host/Commands/HealthCheckCommand.cs b/src/ServiceControl.Connector.MassTransit.Host/Commands/HealthCheckCommand.cs index fbfbdfe..ce1ef00 100644 --- a/src/ServiceControl.Connector.MassTransit.Host/Commands/HealthCheckCommand.cs +++ b/src/ServiceControl.Connector.MassTransit.Host/Commands/HealthCheckCommand.cs @@ -1,7 +1,6 @@ namespace ServiceControl.Connector.MassTransit.Host.Commands; using System.CommandLine; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -11,22 +10,20 @@ public HealthCheckCommand() : base("health-check", "Performs a validation that t { this.AddConnectorOptions(); - this.SetHandler(async context => + SetAction(async (parseResult, cancellationToken) => { - var connectorArgs = ConnectorCommandOptions.BuildArgs(context.ParseResult); + var connectorArgs = ConnectorCommandOptions.BuildArgs(parseResult); - context.ExitCode = await InternalHandler(connectorArgs, context.GetCancellationToken()); + return await InternalHandler(connectorArgs, cancellationToken); }); } async Task InternalHandler(string[] connectorArgs, CancellationToken cancellationToken) { - var builder = Host.CreateEmptyApplicationBuilder(null); - builder.Configuration.AddEnvironmentVariables(); - builder.Configuration.AddCommandLine(connectorArgs); + var builder = Host.CreateApplicationBuilder(connectorArgs); builder.UseMassTransitConnector(true); - var host = builder.Build(); + using var host = builder.Build(); var queueInformationProvider = host.Services.GetRequiredService(); var (success, errorMessage) = await queueInformationProvider.TryCheck(cancellationToken); diff --git a/src/ServiceControl.Connector.MassTransit.Host/Commands/QueuesCommand.cs b/src/ServiceControl.Connector.MassTransit.Host/Commands/QueuesCommand.cs index 30073f0..7e12825 100644 --- a/src/ServiceControl.Connector.MassTransit.Host/Commands/QueuesCommand.cs +++ b/src/ServiceControl.Connector.MassTransit.Host/Commands/QueuesCommand.cs @@ -2,7 +2,6 @@ namespace ServiceControl.Connector.MassTransit.Host.Commands; using System.CommandLine; using System.Text.RegularExpressions; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -10,28 +9,30 @@ public class QueuesCommand : Command { public QueuesCommand() : base("queues-list", "List queues") { - var filterOption = new Option("--filter", () => ".*_error$", "Use a regex to filter queues by name."); - AddOption(filterOption); + var filterOption = new Option("--filter") + { + DefaultValueFactory = _ => ".*_error$", + Description = "Use a regex to filter queues by name.", + }; + Add(filterOption); this.AddConnectorOptions(); - this.SetHandler(async context => + SetAction(async (parseResult, cancellationToken) => { - var filter = context.ParseResult.GetValueForOption(filterOption); - var connectorArgs = ConnectorCommandOptions.BuildArgs(context.ParseResult); + var filter = parseResult.GetValue(filterOption); + var connectorArgs = ConnectorCommandOptions.BuildArgs(parseResult); - context.ExitCode = await InternalHandler(filter!, connectorArgs, context.GetCancellationToken()); + return await InternalHandler(filter!, connectorArgs, cancellationToken); }); } async Task InternalHandler(string filter, string[] connectorArgs, CancellationToken cancellationToken) { - var builder = Host.CreateEmptyApplicationBuilder(null); - builder.Configuration.AddEnvironmentVariables(); - builder.Configuration.AddCommandLine(connectorArgs); + var builder = Host.CreateApplicationBuilder(connectorArgs); builder.UseMassTransitConnector(true); - var host = builder.Build(); + using var host = builder.Build(); var queueInformationProvider = host.Services.GetRequiredService(); var queues = queueInformationProvider.GetQueues(cancellationToken); diff --git a/src/ServiceControl.Connector.MassTransit.Host/Commands/StartupCommand.cs b/src/ServiceControl.Connector.MassTransit.Host/Commands/StartupCommand.cs index 3cf1da6..90ad40b 100644 --- a/src/ServiceControl.Connector.MassTransit.Host/Commands/StartupCommand.cs +++ b/src/ServiceControl.Connector.MassTransit.Host/Commands/StartupCommand.cs @@ -11,28 +11,30 @@ public class StartupCommand : RootCommand { public StartupCommand(string[] args) : base("Particular Software ServiceControl Masstransit Connector") { - var consoleOption = new Option( - "--console", - "Run in console mode."); - consoleOption.AddAlias("-c"); - - var runModeOption = new Option( - "--run-mode", - () => RunMode.SetupAndRun, - "Mode to run in.") - { Arity = ArgumentArity.ExactlyOne }; - - AddOption(consoleOption); - AddOption(runModeOption); - this.AddConnectorOptions(); + var consoleOption = new Option("--console") + { + Aliases = { "-c" }, + Description = "Run in console mode." + }; + + var runModeOption = new Option("--run-mode") + { + Description = "Mode to run in.", + Arity = ArgumentArity.ExactlyOne, + DefaultValueFactory = _ => RunMode.SetupAndRun, + }; + + Add(consoleOption); + Add(runModeOption); - this.SetHandler(async context => + this.AddConnectorOptions(); + SetAction(async (parseResult, cancellationToken) => { - var isConsole = context.ParseResult.GetValueForOption(consoleOption); - var runMode = context.ParseResult.GetValueForOption(runModeOption); - var connectorArgs = ConnectorCommandOptions.BuildArgs(context.ParseResult); + var isConsole = parseResult.GetValue(consoleOption); + var runMode = parseResult.GetValue(runModeOption); + var connectorArgs = ConnectorCommandOptions.BuildArgs(parseResult); - context.ExitCode = await InternalHandler(runMode, isConsole, connectorArgs, context.GetCancellationToken()); + return await InternalHandler(runMode, isConsole, connectorArgs, cancellationToken); }); } diff --git a/src/ServiceControl.Connector.MassTransit.Host/Program.cs b/src/ServiceControl.Connector.MassTransit.Host/Program.cs index 60b0f00..8b5b8c5 100644 --- a/src/ServiceControl.Connector.MassTransit.Host/Program.cs +++ b/src/ServiceControl.Connector.MassTransit.Host/Program.cs @@ -1,21 +1,10 @@ -using System.CommandLine.Builder; -using System.CommandLine.Parsing; using ServiceControl.Connector.MassTransit.Host.Commands; -var startupCommand = new StartupCommand(args); +StartupCommand startupCommand = new(args) +{ + new QueuesCommand(), + new HealthCheckCommand() +}; -startupCommand.AddCommand(new QueuesCommand()); -startupCommand.AddCommand(new HealthCheckCommand()); - -var commandLineBuilder = new CommandLineBuilder(startupCommand); - -commandLineBuilder - .UseVersionOption() - .UseHelp() - .UseTypoCorrections() - .UseParseErrorReporting() - .UseExceptionHandler() - .CancelOnProcessTermination(); - -var parser = commandLineBuilder.Build(); -return await parser.InvokeAsync(args); +var exitCode = await startupCommand.Parse(args).InvokeAsync(); +return exitCode; diff --git a/src/ServiceControl.Connector.MassTransit.Host/ServiceControl.Connector.MassTransit.Host.csproj b/src/ServiceControl.Connector.MassTransit.Host/ServiceControl.Connector.MassTransit.Host.csproj index a1c1076..d4999f6 100644 --- a/src/ServiceControl.Connector.MassTransit.Host/ServiceControl.Connector.MassTransit.Host.csproj +++ b/src/ServiceControl.Connector.MassTransit.Host/ServiceControl.Connector.MassTransit.Host.csproj @@ -17,7 +17,7 @@ - +