Skip to content

Command line call help text from inside handler #2514

Open
@DavidVTurley

Description

@DavidVTurley

Hello,

I hope you can help me. I am trying to create a command line application, but I am having trouble with the handling of the commands.

I have a command: Barcode. This command has an option: --list.
When Barcode is called, I want the command to display the help text.
When --list is added, I want it to do something.

However I am running into the issue that I cant call the help from inside the command handler. Is there a way to do this? In my main project I have DI injection set up, but I wouldn't know what I would have to inject to get to the help part of the command.

Here is a simplifyed bit of code showing what I want to do:

using Microsoft.Extensions.Hosting;
using System.CommandLine;
using System.CommandLine.Builder;
using System.CommandLine.Hosting;
using System.CommandLine.Parsing;
using UtTools.Controller.Commands.Barcode;

namespace UtToolsCommandLineTest
{
	internal class Program
	{
		static void Main(string[] args)
		{
			RootCommand root = new RootCommand("Root");
			root.AddCommand(new BarcodeCommand());

			CommandLineBuilder builder = new CommandLineBuilder(root)
				.UseDefaults()
				.UseHost(_ => Host.CreateDefaultBuilder(args).ConfigureAppConfiguration((hostContext, config) =>
				{

				}),
				(builder) =>
				{
					builder.ConfigureServices(services =>
					{

					});

					builder.UseCommandHandler<BarcodeCommand, BarcodeCommand.BarcodeCommandHandler>();
				});

			builder.Build().InvokeAsync(args);
		}
	}
}
using System.CommandLine;
using System.CommandLine.Help;
using System.CommandLine.Invocation;

namespace UtTools.Controller.Commands.Barcode
{
	internal class BarcodeCommand : Command
	{
		public BarcodeCommand(string name = "Barcode", string description = "The base command for generating ccsg and q13 barcodes.") : base(name, description)
		{
			Option<bool> listOption = new Option<bool>(
				aliases: new string[] { "--list", "-l" },
				description: "List all available barcodes");

			AddOption(listOption);
		}

		public class BarcodeCommandHandler : ICommandHandler
		{
			public bool List { get; set; }

			public BarcodeCommandHandler()
			{
			}

			public int Invoke(InvocationContext context)
			{
				return InvokeAsync(context).GetAwaiter().GetResult();
			}

			public Task<int> InvokeAsync(InvocationContext context)
			{
				if(!List)
				{		
                                        /////////////////////////////////
                                        // Should call the help text //
                                        /////////////////////////////////

					return Task.FromResult(1);
				}

                               // Do stuff
				return Task.FromResult(0);
			}
		}
	}
}
The end goal is a command like this:
Barcode
├── --List                                                          Show all barcodes available
├──Generate
            ├── --OutputDirectoryPath                  The output directory
            ├── --Name
            ├──All                                                   Generate all barcodes
                    ├── --OutputDirectoryPath          The output directory

Thanks for any help you can give!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions