Skip to content

Commit 8925095

Browse files
Update dependency System.CommandLine to 2.0.4 (#259)
* Update dependency System.CommandLine to 2.0.4 * Adjust code and also make sure the builder is properly disposed --------- Co-authored-by: dependencyupdates[bot] <218638057+dependencyupdates[bot]@users.noreply.github.com> Co-authored-by: Daniel Marbach <danielmarbach@users.noreply.github.com>
1 parent 7e9a918 commit 8925095

6 files changed

Lines changed: 101 additions & 103 deletions

File tree

Lines changed: 55 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,71 @@
11
namespace ServiceControl.Connector.MassTransit.Host.Commands;
22

33
using System.CommandLine;
4-
using System.CommandLine.Parsing;
54

65
public static class ConnectorCommandOptions
76
{
8-
static Option<string> ConnectionString { get; } = new(
9-
"--connection-string",
10-
"The connection string for the transport. Can also be set via CONNECTION_STRING environment variable.");
7+
static Option<string> ConnectionString { get; } = new("--connection-string")
8+
{
9+
Description = "The connection string for the transport. Can also be set via CONNECTION_STRING environment variable."
10+
};
1111

12-
static Option<string> TransportType { get; } = new(
13-
"--transport-type",
14-
"The transport type (AzureServiceBus, AzureServiceBusWithDeadLetter, RabbitMQ, AmazonSQS). Can also be set via TRANSPORT_TYPE environment variable.");
12+
static Option<string> TransportType { get; } = new("--transport-type")
13+
{
14+
Description = "The transport type (AzureServiceBus, AzureServiceBusWithDeadLetter, RabbitMQ, AmazonSQS). Can also be set via TRANSPORT_TYPE environment variable."
15+
};
1516

16-
static Option<string> QueuesFile { get; } = new(
17-
"--queues-file",
18-
"Path to the file containing the list of queues to monitor. Can also be set via QUEUES_FILE environment variable.");
17+
static Option<string> QueuesFile { get; } = new("--queues-file")
18+
{
19+
Description = "Path to the file containing the list of queues to monitor. Can also be set via QUEUES_FILE environment variable."
20+
};
1921

20-
static Option<string> ReturnQueue { get; } = new(
21-
"--return-queue",
22-
"The return queue name. Defaults to 'Particular.ServiceControl.Connector.MassTransit_return'. Can also be set via RETURN_QUEUE environment variable.");
22+
static Option<string> ReturnQueue { get; } = new("--return-queue")
23+
{
24+
Description = "The return queue name. Defaults to 'Particular.ServiceControl.Connector.MassTransit_return'. Can also be set via RETURN_QUEUE environment variable."
25+
};
2326

24-
static Option<string> ErrorQueue { get; } = new(
25-
"--error-queue",
26-
"The error queue name. Defaults to 'error'. Can also be set via ERROR_QUEUE environment variable.");
27+
static Option<string> ErrorQueue { get; } = new("--error-queue")
28+
{
29+
Description = "The error queue name. Defaults to 'error'. Can also be set via ERROR_QUEUE environment variable."
30+
};
2731

28-
static Option<string> ServiceControlQueue { get; } = new(
29-
"--servicecontrol-queue",
30-
"The ServiceControl queue name. Defaults to 'Particular.ServiceControl'. Can also be set via SERVICECONTROL_QUEUE environment variable.");
32+
static Option<string> ServiceControlQueue { get; } = new("--servicecontrol-queue")
33+
{
34+
Description = "The ServiceControl queue name. Defaults to 'Particular.ServiceControl'. Can also be set via SERVICECONTROL_QUEUE environment variable."
35+
};
3136

32-
static Option<string> RabbitMqManagementApiUrl { get; } = new(
33-
"--rabbitmq-management-api-url",
34-
"The RabbitMQ management API URL (required for RabbitMQ transport). Can also be set via RABBITMQ_MANAGEMENT_API_URL environment variable.");
37+
static Option<string> RabbitMqManagementApiUrl { get; } = new("--rabbitmq-management-api-url")
38+
{
39+
Description = "The RabbitMQ management API URL (required for RabbitMQ transport). Can also be set via RABBITMQ_MANAGEMENT_API_URL environment variable."
40+
};
3541

36-
static Option<string> RabbitMqManagementApiUsername { get; } = new(
37-
"--rabbitmq-management-api-username",
38-
"The RabbitMQ management API username. Can also be set via RABBITMQ_MANAGEMENT_API_USERNAME environment variable.");
42+
static Option<string> RabbitMqManagementApiUsername { get; } = new("--rabbitmq-management-api-username")
43+
{
44+
Description = "The RabbitMQ management API username. Can also be set via RABBITMQ_MANAGEMENT_API_USERNAME environment variable."
45+
};
3946

40-
static Option<string> RabbitMqManagementApiPassword { get; } = new(
41-
"--rabbitmq-management-api-password",
42-
"The RabbitMQ management API password. Can also be set via RABBITMQ_MANAGEMENT_API_PASSWORD environment variable.");
47+
static Option<string> RabbitMqManagementApiPassword { get; } = new("--rabbitmq-management-api-password")
48+
{
49+
Description = "The RabbitMQ management API password. Can also be set via RABBITMQ_MANAGEMENT_API_PASSWORD environment variable."
50+
};
4351

44-
static Option<string> RabbitMqQueueType { get; } = new(
45-
"--rabbitmq-queue-type",
46-
"The RabbitMQ queue type (Classic or Quorum). Defaults to Quorum. Can also be set via RABBITMQ_QUEUE_TYPE environment variable.");
52+
static Option<string> RabbitMqQueueType { get; } = new("--rabbitmq-queue-type")
53+
{
54+
Description = "The RabbitMQ queue type (Classic or Quorum). Defaults to Quorum. Can also be set via RABBITMQ_QUEUE_TYPE environment variable."
55+
};
4756

4857
public static void AddConnectorOptions(this Command command)
4958
{
50-
command.AddOption(ConnectionString);
51-
command.AddOption(TransportType);
52-
command.AddOption(QueuesFile);
53-
command.AddOption(ReturnQueue);
54-
command.AddOption(ErrorQueue);
55-
command.AddOption(ServiceControlQueue);
56-
command.AddOption(RabbitMqManagementApiUrl);
57-
command.AddOption(RabbitMqManagementApiUsername);
58-
command.AddOption(RabbitMqManagementApiPassword);
59-
command.AddOption(RabbitMqQueueType);
59+
command.Add(ConnectionString);
60+
command.Add(TransportType);
61+
command.Add(QueuesFile);
62+
command.Add(ReturnQueue);
63+
command.Add(ErrorQueue);
64+
command.Add(ServiceControlQueue);
65+
command.Add(RabbitMqManagementApiUrl);
66+
command.Add(RabbitMqManagementApiUsername);
67+
command.Add(RabbitMqManagementApiPassword);
68+
command.Add(RabbitMqQueueType);
6069
}
6170

6271
public static string[] BuildArgs(ParseResult parseResult)
@@ -80,16 +89,16 @@ void AddArgIfExplicit(Option<string> option, string configKey)
8089
{
8190
// Only forward options that the user explicitly provided on the command line.
8291
// Omitting defaults lets environment variables take effect through normal config precedence.
83-
if (parseResult.FindResultFor(option) == null)
92+
var token = parseResult.GetValue(option);
93+
if (token == null)
8494
{
8595
return;
8696
}
8797

88-
var value = parseResult.GetValueForOption(option);
89-
if (!string.IsNullOrEmpty(value))
98+
if (!string.IsNullOrEmpty(token))
9099
{
91-
args.Add($"--{configKey}={value}");
100+
args.Add($"--{configKey}={token}");
92101
}
93102
}
94103
}
95-
}
104+
}

src/ServiceControl.Connector.MassTransit.Host/Commands/HealthCheckCommand.cs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
namespace ServiceControl.Connector.MassTransit.Host.Commands;
22

33
using System.CommandLine;
4-
using Microsoft.Extensions.Configuration;
54
using Microsoft.Extensions.DependencyInjection;
65
using Microsoft.Extensions.Hosting;
76

@@ -11,22 +10,20 @@ public HealthCheckCommand() : base("health-check", "Performs a validation that t
1110
{
1211
this.AddConnectorOptions();
1312

14-
this.SetHandler(async context =>
13+
SetAction(async (parseResult, cancellationToken) =>
1514
{
16-
var connectorArgs = ConnectorCommandOptions.BuildArgs(context.ParseResult);
15+
var connectorArgs = ConnectorCommandOptions.BuildArgs(parseResult);
1716

18-
context.ExitCode = await InternalHandler(connectorArgs, context.GetCancellationToken());
17+
return await InternalHandler(connectorArgs, cancellationToken);
1918
});
2019
}
2120

2221
async Task<int> InternalHandler(string[] connectorArgs, CancellationToken cancellationToken)
2322
{
24-
var builder = Host.CreateEmptyApplicationBuilder(null);
25-
builder.Configuration.AddEnvironmentVariables();
26-
builder.Configuration.AddCommandLine(connectorArgs);
23+
var builder = Host.CreateApplicationBuilder(connectorArgs);
2724
builder.UseMassTransitConnector(true);
2825

29-
var host = builder.Build();
26+
using var host = builder.Build();
3027

3128
var queueInformationProvider = host.Services.GetRequiredService<IHealthCheckerProvider>();
3229
var (success, errorMessage) = await queueInformationProvider.TryCheck(cancellationToken);

src/ServiceControl.Connector.MassTransit.Host/Commands/QueuesCommand.cs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,37 @@ namespace ServiceControl.Connector.MassTransit.Host.Commands;
22

33
using System.CommandLine;
44
using System.Text.RegularExpressions;
5-
using Microsoft.Extensions.Configuration;
65
using Microsoft.Extensions.DependencyInjection;
76
using Microsoft.Extensions.Hosting;
87

98
public class QueuesCommand : Command
109
{
1110
public QueuesCommand() : base("queues-list", "List queues")
1211
{
13-
var filterOption = new Option<string>("--filter", () => ".*_error$", "Use a regex to filter queues by name.");
14-
AddOption(filterOption);
12+
var filterOption = new Option<string>("--filter")
13+
{
14+
DefaultValueFactory = _ => ".*_error$",
15+
Description = "Use a regex to filter queues by name.",
16+
};
17+
Add(filterOption);
1518

1619
this.AddConnectorOptions();
1720

18-
this.SetHandler(async context =>
21+
SetAction(async (parseResult, cancellationToken) =>
1922
{
20-
var filter = context.ParseResult.GetValueForOption(filterOption);
21-
var connectorArgs = ConnectorCommandOptions.BuildArgs(context.ParseResult);
23+
var filter = parseResult.GetValue(filterOption);
24+
var connectorArgs = ConnectorCommandOptions.BuildArgs(parseResult);
2225

23-
context.ExitCode = await InternalHandler(filter!, connectorArgs, context.GetCancellationToken());
26+
return await InternalHandler(filter!, connectorArgs, cancellationToken);
2427
});
2528
}
2629

2730
async Task<int> InternalHandler(string filter, string[] connectorArgs, CancellationToken cancellationToken)
2831
{
29-
var builder = Host.CreateEmptyApplicationBuilder(null);
30-
builder.Configuration.AddEnvironmentVariables();
31-
builder.Configuration.AddCommandLine(connectorArgs);
32+
var builder = Host.CreateApplicationBuilder(connectorArgs);
3233
builder.UseMassTransitConnector(true);
3334

34-
var host = builder.Build();
35+
using var host = builder.Build();
3536

3637
var queueInformationProvider = host.Services.GetRequiredService<IQueueInformationProvider>();
3738
var queues = queueInformationProvider.GetQueues(cancellationToken);

src/ServiceControl.Connector.MassTransit.Host/Commands/StartupCommand.cs

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,30 @@ public class StartupCommand : RootCommand
1111
{
1212
public StartupCommand(string[] args) : base("Particular Software ServiceControl Masstransit Connector")
1313
{
14-
var consoleOption = new Option<bool>(
15-
"--console",
16-
"Run in console mode.");
17-
consoleOption.AddAlias("-c");
18-
19-
var runModeOption = new Option<RunMode>(
20-
"--run-mode",
21-
() => RunMode.SetupAndRun,
22-
"Mode to run in.")
23-
{ Arity = ArgumentArity.ExactlyOne };
24-
25-
AddOption(consoleOption);
26-
AddOption(runModeOption);
27-
this.AddConnectorOptions();
14+
var consoleOption = new Option<bool>("--console")
15+
{
16+
Aliases = { "-c" },
17+
Description = "Run in console mode."
18+
};
19+
20+
var runModeOption = new Option<RunMode>("--run-mode")
21+
{
22+
Description = "Mode to run in.",
23+
Arity = ArgumentArity.ExactlyOne,
24+
DefaultValueFactory = _ => RunMode.SetupAndRun,
25+
};
26+
27+
Add(consoleOption);
28+
Add(runModeOption);
2829

29-
this.SetHandler(async context =>
30+
this.AddConnectorOptions();
31+
SetAction(async (parseResult, cancellationToken) =>
3032
{
31-
var isConsole = context.ParseResult.GetValueForOption(consoleOption);
32-
var runMode = context.ParseResult.GetValueForOption(runModeOption);
33-
var connectorArgs = ConnectorCommandOptions.BuildArgs(context.ParseResult);
33+
var isConsole = parseResult.GetValue(consoleOption);
34+
var runMode = parseResult.GetValue(runModeOption);
35+
var connectorArgs = ConnectorCommandOptions.BuildArgs(parseResult);
3436

35-
context.ExitCode = await InternalHandler(runMode, isConsole, connectorArgs, context.GetCancellationToken());
37+
return await InternalHandler(runMode, isConsole, connectorArgs, cancellationToken);
3638
});
3739
}
3840

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,10 @@
1-
using System.CommandLine.Builder;
2-
using System.CommandLine.Parsing;
31
using ServiceControl.Connector.MassTransit.Host.Commands;
42

5-
var startupCommand = new StartupCommand(args);
3+
StartupCommand startupCommand = new(args)
4+
{
5+
new QueuesCommand(),
6+
new HealthCheckCommand()
7+
};
68

7-
startupCommand.AddCommand(new QueuesCommand());
8-
startupCommand.AddCommand(new HealthCheckCommand());
9-
10-
var commandLineBuilder = new CommandLineBuilder(startupCommand);
11-
12-
commandLineBuilder
13-
.UseVersionOption()
14-
.UseHelp()
15-
.UseTypoCorrections()
16-
.UseParseErrorReporting()
17-
.UseExceptionHandler()
18-
.CancelOnProcessTermination();
19-
20-
var parser = commandLineBuilder.Build();
21-
return await parser.InvokeAsync(args);
9+
var exitCode = await startupCommand.Parse(args).InvokeAsync();
10+
return exitCode;

src/ServiceControl.Connector.MassTransit.Host/ServiceControl.Connector.MassTransit.Host.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.14" />
1818
<PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" Version="9.0.14" />
1919
<PackageReference Include="NServiceBus.Extensions.Logging" Version="3.0.1" />
20-
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
20+
<PackageReference Include="System.CommandLine" Version="2.0.4" />
2121
</ItemGroup>
2222

2323
<ItemGroup>

0 commit comments

Comments
 (0)