Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Command line call help text from inside handler #2514

Open
DavidVTurley opened this issue Jan 29, 2025 · 0 comments
Open

Command line call help text from inside handler #2514

DavidVTurley opened this issue Jan 29, 2025 · 0 comments

Comments

@DavidVTurley
Copy link

DavidVTurley commented Jan 29, 2025

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!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant