MatthiWare / CommandLineParser.Core

:computer: A simple, light-weight and strongly typed Command Line Parser made in .NET Standard!
MIT License
32 stars 9 forks source link

Add Choices Option #172

Open zackmark29 opened 2 years ago

zackmark29 commented 2 years ago

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?

Matthiee commented 2 years ago

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.

zackmark29 commented 2 years ago

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 commented 2 years ago

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

Matthiee commented 2 years ago

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.