Skip to content

Commit 9d625bc

Browse files
committed
Add grouped help output for CLI commands
Introduces OptionGroup and GroupedHelpAction to enable grouped, visually enhanced help output using Spectre.Console. Adds SetGroupedHelp extension and applies it to all major commands, organizing options under logical headings for improved CLI usability. No changes to command execution logic.
1 parent ce95ea5 commit 9d625bc

8 files changed

Lines changed: 317 additions & 1 deletion

src/SqlBuildManager.Console/CommandLine/CommandLineBuilder.Aci.cs

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,17 @@ private static Command AciSaveSettingsCommand
4848
cmd.AddRange(DatabaseAuthArgs);
4949
cmd.AddRange(IdentityArgumentsForContainerApp);
5050
cmd.AddRange(ContainerRegistryAndImageOptions);
51+
cmd.SetGroupedHelp(
52+
new OptionGroup("Settings File", new List<Option> { settingsfileNewOption }),
53+
new OptionGroup("ACI", new List<Option> { aciIResourceGroupNameOption, aciInstanceNameOption, subscriptionIdOption }),
54+
new OptionGroup("Execution", new List<Option> { sectionPlaceholderOption, defaultscripttimeoutOption, timeoutretrycountOption, silentOption, cleartextOption }),
55+
new OptionGroup("Connections & Secrets", new List<Option> { keyVaultNameOption, storageaccountnameOption, storageaccountkeyOption, eventhubconnectionOption, serviceBusconnectionOption }),
56+
new OptionGroup("Event Hub", EventHubResourceOptions),
57+
new OptionGroup("VNET", VnetOptions),
58+
new OptionGroup("Authentication", DatabaseAuthArgs),
59+
new OptionGroup("Identity", IdentityArgumentsForContainerApp),
60+
new OptionGroup("Container Registry", ContainerRegistryAndImageOptions)
61+
);
5162
cmd.SetAction((parseResult) => {
5263
var cmdLine = CommandLineArgsBinder.Bind(parseResult);
5364
var clearText = parseResult.GetValue(cleartextOption);
@@ -96,6 +107,17 @@ private static Command AciRun
96107
cmd.Add(identityResourceGroupOption);
97108
cmd.Add(subscriptionIdOption);
98109
cmd.AddRange(ConcurrencyRequiredOptions);
110+
cmd.SetGroupedHelp(
111+
new OptionGroup("Build Options", new List<Option> { jobnameRequiredOption, packagenameAsFileToUploadOption, overrideRequiredOption, platinumdacpacFileInfoOption, allowForObjectDeletionOption, aciMonitorOption, forceOption }),
112+
new OptionGroup("ACI", new List<Option> { aciIResourceGroupNameNotReqOption, aciInstanceNameNotReqOption, aciContainerCountOption }),
113+
new OptionGroup("Event Hub", EventHubResourceOptions),
114+
new OptionGroup("VNET", VnetOptions),
115+
new OptionGroup("Container Registry", ContainerRegistryAndImageOptions),
116+
new OptionGroup("Connections & Secrets", new List<Option> { keyVaultNameOption, storageaccountnameOption, storageaccountkeyOption }),
117+
new OptionGroup("Authentication", DatabaseAuthArgs),
118+
new OptionGroup("Identity", new List<Option> { clientIdOption, identityNameOption, identityResourceGroupOption, subscriptionIdOption }),
119+
new OptionGroup("Concurrency", ConcurrencyRequiredOptions)
120+
);
99121
cmd.SetAction(async (parseResult, ct) => {
100122
var cmdLine = CommandLineArgsBinder.Bind(parseResult);
101123
var packagename = parseResult.GetValue(packagenameAsFileToUploadOption);
@@ -148,7 +170,19 @@ private static Command AciQuery
148170
cmd.Add(subscriptionIdOption);
149171
cmd.AddRange(ConcurrencyRequiredOptions);
150172
cmd.Add(streamEventsOption);
151-
173+
cmd.SetGroupedHelp(
174+
new OptionGroup("Query", new List<Option> { overrideRequiredOption, queryFileOption, outputFileOption }),
175+
new OptionGroup("ACI", new List<Option> { aciIResourceGroupNameNotReqOption, aciInstanceNameNotReqOption, aciContainerCountOption }),
176+
new OptionGroup("Execution", new List<Option> { jobnameOption, aciMonitorOption, forceOption }),
177+
new OptionGroup("Settings File", SettingsFileExistingOptions),
178+
new OptionGroup("Event Hub", EventHubResourceOptions),
179+
new OptionGroup("VNET", VnetOptions),
180+
new OptionGroup("Container Registry", ContainerRegistryAndImageOptions),
181+
new OptionGroup("Connections & Secrets", new List<Option> { keyVaultNameOption, storageaccountnameOption, storageaccountkeyOption }),
182+
new OptionGroup("Authentication", new List<Option> { authtypeOption, platformOption }),
183+
new OptionGroup("Identity", new List<Option> { clientIdOption, identityNameOption, identityResourceGroupOption, subscriptionIdOption }),
184+
new OptionGroup("Concurrency", ConcurrencyRequiredOptions)
185+
);
152186

153187
cmd.SetAction(async (parseResult, ct) => {
154188
var cmdLine = CommandLineArgsBinder.Bind(parseResult);
@@ -257,6 +291,18 @@ private static Command AciDeployCommand
257291
cmd.Add(clientIdOption);
258292
cmd.Add(subscriptionIdOption);
259293
cmd.AddRange(ConcurrencyRequiredOptions);
294+
cmd.SetGroupedHelp(
295+
new OptionGroup("Build Options", new List<Option> { jobnameRequiredOption, packagenameAsFileToUploadOption, overrideOption, platinumdacpacFileInfoOption, allowForObjectDeletionOption, aciMonitorOption }),
296+
new OptionGroup("ACI", new List<Option> { aciIResourceGroupNameNotReqOption, aciInstanceNameNotReqOption, aciContainerCountOption }),
297+
new OptionGroup("Settings File", new List<Option> { settingsfileExistingOption }),
298+
new OptionGroup("Event Hub", EventHubResourceOptions),
299+
new OptionGroup("VNET", VnetOptions),
300+
new OptionGroup("Container Registry", ContainerRegistryAndImageOptions),
301+
new OptionGroup("Connections & Secrets", new List<Option> { keyVaultNameOption, storageaccountnameOption, storageaccountkeyOption }),
302+
new OptionGroup("Authentication", new List<Option> { authtypeOption, platformOption }),
303+
new OptionGroup("Identity", new List<Option> { identityNameOption, identityResourceGroupOption, clientIdOption, subscriptionIdOption }),
304+
new OptionGroup("Concurrency", ConcurrencyRequiredOptions)
305+
);
260306

261307
cmd.SetAction(async (parseResult, ct) => {
262308
var cmdLine = CommandLineArgsBinder.Bind(parseResult);

src/SqlBuildManager.Console/CommandLine/CommandLineBuilder.Batch.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,18 @@ private static Command BatchRunCommand
5050
cmd.AddRange(IdentityArgumentsForBatch);
5151
cmd.AddRange(ConcurrencyOptions);
5252
cmd.AddRange(EventHubResourceOptions);
53+
cmd.SetGroupedHelp(
54+
new OptionGroup("Build Options", new List<Option> { overrideRequiredOption, packagenameNotReqOption, rootloggingpathOption, defaultscripttimeoutOption, batchJobMonitorTimeoutMin, batchMonitorOption }),
55+
new OptionGroup("DACPAC", new List<Option> { platinumdacpacOption, targetdacpacOption, forcecustomdacpacOption, platinumdbsourceOption, platinumserversourceOption }),
56+
new OptionGroup("Settings File", SettingsFileExistingOptions),
57+
new OptionGroup("Batch Settings", BatchSettingsOptions),
58+
new OptionGroup("Batch Compute", BatchComputeOptions),
59+
new OptionGroup("Authentication", DatabaseAuthArgs),
60+
new OptionGroup("Connections & Secrets", ConnectionAndSecretsOptionsForBatch),
61+
new OptionGroup("Identity", IdentityArgumentsForBatch),
62+
new OptionGroup("Concurrency", ConcurrencyOptions),
63+
new OptionGroup("Event Hub", EventHubResourceOptions)
64+
);
5365
cmd.SetAction(async (parseResult, ct) => {
5466
var cmdLine = CommandLineArgsBinder.Bind(parseResult);
5567
var unittest = parseResult.GetValue(unitTestOption);
@@ -205,6 +217,16 @@ private static Command BatchSaveSettingsCommand
205217
cmd.AddRange(IdentityArgumentsForBatch);
206218
cmd.AddRange(ConcurrencyOptions);
207219
cmd.AddRange(EventHubResourceOptions);
220+
cmd.SetGroupedHelp(
221+
new OptionGroup("Settings File", SettingsFileNewOptions),
222+
new OptionGroup("Execution", new List<Option> { deletebatchjobOption, rootloggingpathOption, defaultscripttimeoutOption, timeoutretrycountOption, pollbatchpoolstatusOption, silentOption, cleartextOption }),
223+
new OptionGroup("Batch Compute", BatchComputeOptions),
224+
new OptionGroup("Authentication", DatabaseAuthArgs),
225+
new OptionGroup("Connections & Secrets", ConnectionAndSecretsOptionsForBatch),
226+
new OptionGroup("Identity", IdentityArgumentsForBatch),
227+
new OptionGroup("Concurrency", ConcurrencyOptions),
228+
new OptionGroup("Event Hub", EventHubResourceOptions)
229+
);
208230
cmd.SetAction((parseResult) => {
209231
var cmdLine = CommandLineArgsBinder.Bind(parseResult);
210232
var clearText = parseResult.GetValue(cleartextOption);
@@ -289,6 +311,17 @@ private static Command BatchQueryCommand
289311
cmd.AddRange(ConnectionAndSecretsOptionsForBatch);
290312
cmd.AddRange(IdentityArgumentsForBatch);
291313
cmd.AddRange(ConcurrencyOptions);
314+
cmd.SetGroupedHelp(
315+
new OptionGroup("Query", new List<Option> { overrideRequiredOption, queryFileRequiredOption, outputFileRequiredOption, silentOption }),
316+
new OptionGroup("Batch Settings", new List<Option> { deletebatchjobOption, jobnameOption, rootloggingpathOption, defaultscripttimeoutOption, batchMonitorOption }),
317+
new OptionGroup("Settings File", SettingsFileExistingOptions),
318+
new OptionGroup("Batch Compute", BatchComputeOptions),
319+
new OptionGroup("Authentication", DatabaseAuthArgs),
320+
new OptionGroup("Connections & Secrets", ConnectionAndSecretsOptionsForBatch),
321+
new OptionGroup("Identity", IdentityArgumentsForBatch),
322+
new OptionGroup("Concurrency", ConcurrencyOptions),
323+
new OptionGroup("Event Hub", EventHubResourceOptions)
324+
);
292325
cmd.SetAction(async (parseResult, ct) => {
293326
var cmdLine = CommandLineArgsBinder.Bind(parseResult);
294327
var unittest = parseResult.GetValue(unitTestOption);

src/SqlBuildManager.Console/CommandLine/CommandLineBuilder.ContainerApp.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,17 @@ private static Command ContainerAppSaveSettingsCommand
3636
cmd.AddRange(DatabaseAuthArgs);
3737
cmd.AddRange(ContainerRegistryAndImageOptions);
3838
cmd.AddRange(ConcurrencyOptions);
39+
cmd.SetGroupedHelp(
40+
new OptionGroup("Settings File", SettingsFileNewOptions),
41+
new OptionGroup("Execution", new List<Option> { defaultscripttimeoutOption, cleartextOption, silentOption }),
42+
new OptionGroup("Container App", ContainerAppOptions),
43+
new OptionGroup("Identity", IdentityArgumentsForContainerApp),
44+
new OptionGroup("Connections & Secrets", ConnectionAndSecretsOptions),
45+
new OptionGroup("Event Hub", EventHubResourceOptions),
46+
new OptionGroup("Authentication", DatabaseAuthArgs),
47+
new OptionGroup("Container Registry", ContainerRegistryAndImageOptions),
48+
new OptionGroup("Concurrency", ConcurrencyOptions)
49+
);
3950
cmd.SetAction((parseResult) => {
4051
var cmdLine = CommandLineArgsBinder.Bind(parseResult);
4152
var clearText = parseResult.GetValue(cleartextOption);
@@ -79,6 +90,18 @@ private static Command ContainerAppRunCommand
7990
cmd.AddRange(DatabaseAuthArgs);
8091
cmd.AddRange(ContainerRegistryAndImageOptions);
8192
cmd.AddRange(ConcurrencyOptions);
93+
cmd.SetGroupedHelp(
94+
new OptionGroup("Build Options", new List<Option> { packagenameOption, platinumdacpacOption, defaultscripttimeoutOption, overrideOption, jobnameRequiredOption, decryptedOption, allowForObjectDeletionOption, forceOption }),
95+
new OptionGroup("Settings File", SettingsFileExistingOptions),
96+
new OptionGroup("Container App", ContainerAppOptions),
97+
new OptionGroup("Container App Execution", new List<Option> { containerAppMonitorOption, containerAppDeleteAppUponCompletion }),
98+
new OptionGroup("Identity", IdentityArgumentsForContainerApp),
99+
new OptionGroup("Connections & Secrets", ConnectionAndSecretsOptions),
100+
new OptionGroup("Event Hub", EventHubResourceOptions),
101+
new OptionGroup("Authentication", DatabaseAuthArgs),
102+
new OptionGroup("Container Registry", ContainerRegistryAndImageOptions),
103+
new OptionGroup("Concurrency", ConcurrencyOptions)
104+
);
82105
cmd.SetAction(async (parseResult, ct) => {
83106
var cmdLine = CommandLineArgsBinder.Bind(parseResult);
84107
var unittest = parseResult.GetValue(unitTestOption);
@@ -181,6 +204,18 @@ private static Command ContainerAppDeployCommand
181204

182205
cmd.AddRange(ContainerRegistryAndImageOptions);
183206
cmd.AddRange(ConcurrencyOptions);
207+
cmd.SetGroupedHelp(
208+
new OptionGroup("Build Options", new List<Option> { packagenameOption, platinumdacpacOption, defaultscripttimeoutOption, overrideOption, jobnameRequiredOption, decryptedOption, allowForObjectDeletionOption }),
209+
new OptionGroup("Settings File", SettingsFileExistingOptions),
210+
new OptionGroup("Container App", ContainerAppOptions),
211+
new OptionGroup("Container App Execution", new List<Option> { containerAppMonitorOption, containerAppDeleteAppUponCompletion }),
212+
new OptionGroup("Identity", IdentityArgumentsForContainerApp),
213+
new OptionGroup("Connections & Secrets", ConnectionAndSecretsOptions),
214+
new OptionGroup("Event Hub", EventHubResourceOptions),
215+
new OptionGroup("Authentication", DatabaseAuthArgs),
216+
new OptionGroup("Container Registry", ContainerRegistryAndImageOptions),
217+
new OptionGroup("Concurrency", ConcurrencyOptions)
218+
);
184219
cmd.SetAction(async (parseResult, ct) => {
185220
var cmdLine = CommandLineArgsBinder.Bind(parseResult);
186221
var unittest = parseResult.GetValue(unitTestOption);

src/SqlBuildManager.Console/CommandLine/CommandLineBuilder.Kubernetes.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@ private static Command KubernetesRunCommand
5353
cmd.Add(subscriptionIdOption);
5454
cmd.Add(unitTestOption);
5555

56+
cmd.SetGroupedHelp(
57+
new OptionGroup("Build Options", new List<Option> { jobnameOption, overrideAsFileOption, packagenameAsFileToUploadOption, platinumdacpacFileInfoOption, forceOption, allowForObjectDeletionOption, k8sCleanupOnFailureOption }),
58+
new OptionGroup("Kubernetes", new List<Option> { podCountOption, subscriptionIdOption }),
59+
new OptionGroup("Container Registry", new List<Option> { imageTagOption, imageNameOption, imageRepositoryOption }),
60+
new OptionGroup("Settings File", SettingsFileExistingOptions),
61+
new OptionGroup("Identity", IdentityArgumentsForKubernetes),
62+
new OptionGroup("Connections & Secrets", ConnectionAndSecretsOptions),
63+
new OptionGroup("Event Hub", EventHubResourceOptions),
64+
new OptionGroup("Authentication", DatabaseAuthArgs),
65+
new OptionGroup("Concurrency", ConcurrencyOptions)
66+
);
5667

5768
cmd.SetAction(async (parseResult, ct) => {
5869
var cmdLine = CommandLineArgsBinder.Bind(parseResult);
@@ -103,6 +114,17 @@ private static Command KubernetesQueryCommand
103114
cmd.Add(subscriptionIdOption);
104115
cmd.Add(unitTestOption);
105116

117+
cmd.SetGroupedHelp(
118+
new OptionGroup("Query", new List<Option> { overrideRequiredOption, queryFileOption, outputFileOption }),
119+
new OptionGroup("Kubernetes", new List<Option> { podCountOption, k8sCleanupOnFailureOption, subscriptionIdOption }),
120+
new OptionGroup("Container Registry", new List<Option> { imageTagOption, imageNameOption, imageRepositoryOption }),
121+
new OptionGroup("Settings File", SettingsFileExistingOptions),
122+
new OptionGroup("Identity", IdentityArgumentsForKubernetes),
123+
new OptionGroup("Connections & Secrets", ConnectionAndSecretsOptions),
124+
new OptionGroup("Event Hub", EventHubResourceOptions),
125+
new OptionGroup("Authentication", DatabaseAuthArgs),
126+
new OptionGroup("Concurrency", ConcurrencyOptions)
127+
);
106128

107129
cmd.SetAction(async (parseResult, ct) => {
108130
var cmdLine = CommandLineArgsBinder.Bind(parseResult);
@@ -255,6 +277,17 @@ private static Command KubernetesSaveSettingsCommand
255277
cmd.Add(clientIdOption);
256278
cmd.Add(cleartextOption);
257279

280+
cmd.SetGroupedHelp(
281+
new OptionGroup("Settings File", SettingsFileNewOptions),
282+
new OptionGroup("Kubernetes", new List<Option> { podCountOption, subscriptionIdOption }),
283+
new OptionGroup("Container Registry", new List<Option> { imageTagOption, imageNameOption, imageRepositoryOption }),
284+
new OptionGroup("Identity", new List<Option> { serviceAccountNameOption, tenantIdOption, identityNameNotReqOption, identityResourceGroupNotReqOption, clientIdOption }),
285+
new OptionGroup("Connections & Secrets", ConnectionAndSecretsOptions),
286+
new OptionGroup("Event Hub", EventHubResourceOptions),
287+
new OptionGroup("Authentication", DatabaseAuthArgs),
288+
new OptionGroup("Concurrency", ConcurrencyOptions),
289+
new OptionGroup("Execution", new List<Option> { silentOption, cleartextOption })
290+
);
258291

259292
cmd.SetAction((parseResult) => {
260293
var cmdLine = CommandLineArgsBinder.Bind(parseResult);

0 commit comments

Comments
 (0)