2

In my console application, whichever handler I specify list (parameter 3 in this case) will be executed when no console arguments are provided. The handler is called with the boolean parameter set to false. But it makes more sense to me for it to not be called at all.

How do I prevent this from happening and instead show me the help text?

using System;
using System.CommandLine;

namespace GlideRush.LeaderboardsConsole // Note: actual namespace depends on the project name.
{
    internal class Program
    {
        static async Task<int> Main(string[] args)
        {
            var test1 = new Option<bool>(
                name: "test1",
                description: "test param 1");
            var test2 = new Option<bool>(
                name: "test2",
                description: "test param 2");
            var test3 = new Option<bool>(
                name: "test3",
                description: "test param 3");

            var rootCommand = new RootCommand("Testing console params");

            rootCommand.AddOption(test1);
            rootCommand.AddOption(test2);
            rootCommand.AddOption(test3);

            rootCommand.SetHandler(boolparam => Console.WriteLine($"Param 1 {boolparam}"), test1);
            rootCommand.SetHandler(boolparam => Console.WriteLine($"Param 2 {boolparam}"), test2);
            rootCommand.SetHandler(boolparam => Console.WriteLine($"Param 3 {boolparam}"), test3);

            return await rootCommand.InvokeAsync(args);
        }
    }
}

When I provide no parameters, it outputs:

$ dotnet run
Param 3 False

I would like it to output the default:

Description:
  Testing console params

Usage:
  GlideRushConsole [options]

Options:
  test1           test param 1
  test2           test param 2
  test3           test param 3
  --version       Show version information
  -?, -h, --help  Show help and usage information

It does not feel right to have the order of handlers determine the default behaviour, nor do I want to check for the bool to be false on every parameter handler. And in any case that still doesn't give me the default help menu.

joon
  • 832
  • 13
  • 31
  • 2
    You specified three different handlers for the same command instead of handling three options. Each call to `SetHandler` overrides the previous one. Use only *one* handler that accepts the three options as parameters, eg `SetHandler((b1,b2,b3)=>{ .....});`. Better yet, create a separate method that accepts three boolean parameters. – Panagiotis Kanavos Oct 18 '22 at 12:41

2 Answers2

2

A single command can only have one handler as Panagiotis Kanavos already stated.

If you want different handlers based on a parameter you probably are looking for subcommands or verbs.

for example (freehand code)

var smoothOrNot = new Option<bool>(
            name: "smooth",
            description: "smooth gliding or nah?");
var fastOrNot = new Option<bool>(
            name: "fast",
            description: "fast gliding or prefer slow");

var glideRushCommand = new RootCommand();
var glideVerb = new Command("glide", "glide subcommand");
var rushVerb = new Command("rush", "rush subcommand");
glideVerb.Add(glideOptionOne);
glideVerb.Add(glideOptionTwo);
glideRushCommand.Add(glideVerb);
Boris Callens
  • 90,659
  • 85
  • 207
  • 305
  • yes this is what I needed! When not providing a handler for the rootcommand it shows me the help message, and adding subcommands let's me define the correct handlers – joon Oct 18 '22 at 13:20
1

A command can have only a single handler at a time. Calling SetHandler three times replaced the previous handlers so only the last one is used.

To handle 3 parameters, use an action with three parameters:

rootCommand.SetHandler((b1,b2,b2)=>{
    Console.WriteLine($"Param 1 {b1}");
    Console.WriteLine($"Param 2 {b2}");
    Console.WriteLine($"Param 3 {b3}");
}, test1, test2, test3);

Better yet, use a separate method :

rootCommand.SetHandler(DoSomething, test1, test2, test3);

...

void DoSomething(bool? b1,bool? b2, bool? b3)
{
    Console.WriteLine($"Param 1 {b1}");
    Console.WriteLine($"Param 2 {b2}");
    Console.WriteLine($"Param 3 {b3}");
};

Panagiotis Kanavos
  • 120,703
  • 13
  • 188
  • 236