CommandLineParser.Core icon indicating copy to clipboard operation
CommandLineParser.Core copied to clipboard

Add Choices Option

Open zackmark29 opened this issue 3 years ago • 4 comments

I can't seem find any in the documentation about choices option. Like in python there is choices option in the argument. Is it possible to do with this great extension?

zackmark29 avatar Apr 27 '22 12:04 zackmark29

At the moment it is not possible.

However I feel like you could get very close using enum's.

Example:

public enum TestEnum
{
    Value1,
    Value2,
    Value3,
}

public class Options
{
    public TestEnum MyEnum { get; set; }
}

parser.Configure(opt => opt.MyEnum)
                .Name("e");
> Example.exe -e "Value2"
> MyEnum=Value2
> Example.exe -e "Value10"
> Unable to parse option '-e|--e' value 'value10' is invalid!

Another way to achieve this without enums would be to use FluentValidations Extension.

Matthiee avatar Apr 27 '22 12:04 Matthiee

At the moment it is not possible.

However I feel like you could get very close using enum's.

Example:

public enum TestEnum
{
    Value1,
    Value2,
    Value3,
}

public class Options
{
    public TestEnum MyEnum { get; set; }
}

parser.Configure(opt => opt.MyEnum)
                .Name("e");
> Example.exe -e "Value2"
> MyEnum=Value2
> Example.exe -e "Value10"
> Unable to parse option '-e|--e' value 'value10' is invalid!

Another way to achieve this without enums would be to use FluentValidations Extension.

Thank you for the response. Yeah Enum is good idea I'll do it instead. I still preferred your extension it's easy to use :)

zackmark29 avatar Apr 27 '22 12:04 zackmark29

Thank you that solved my problem. However there's just little problem when I set the default and input invalid value, It's not throwing the exception but still getting the default value only. But it's ok I just skip the default value

zackmark29 avatar Apr 27 '22 12:04 zackmark29

I do like the choices idea.

API could look something like this:

IOptionsBuilder<T> Choices(IEnumerable<T> choices);

parser.Configure(opt => opt.SomeOption)
          .Choices(new []{  1, 2, 3 });

Not sure how this would work when the option type is a Collection.

Matthiee avatar Apr 27 '22 13:04 Matthiee