Skip to content

Commit 5a79f5a

Browse files
committed
Fix enum error message to apply to global options
1 parent 5df3c3c commit 5a79f5a

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

src/ConsoleAppFramework/Command.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ string Core(ITypeSymbol type, bool nullable)
255255
if (type.TypeKind == TypeKind.Enum)
256256
{
257257
string typeName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
258-
return $"if ({incrementIndex}!Enum.TryParse<{typeName}>(commandArgs[i], true, {outArgVar})) {{ ThrowArgumentParseFailed<{typeName}>(\"{argumentName}\", commandArgs[i]); }}{elseExpr}";
258+
return $"if ({incrementIndex}!Enum.TryParse<{typeName}>(commandArgs[i], true, {outArgVar})) {{ ThrowArgumentParseFailedEnum(typeof({typeName}), \"{argumentName}\", commandArgs[i]); }}{elseExpr}";
259259
}
260260

261261
// ParamsArray

src/ConsoleAppFramework/ConsoleAppBaseCode.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,9 @@ static void ThrowArgumentParseFailed(string argumentName, string value)
257257
throw new ArgumentParseFailedException($"Argument '{argumentName}' failed to parse, provided value: {value}");
258258
}
259259
260-
static void ThrowArgumentParseFailed<TEnum>(string argumentName, string value) where TEnum : struct, Enum {
261-
var values = string.Join(", ", Enum.GetNames<TEnum>());
260+
static void ThrowArgumentParseFailedEnum(Type enumType, string argumentName, string value)
261+
{
262+
var values = string.Join(", ", Enum.GetNames(enumType));
262263
throw new ArgumentParseFailedException($"Argument '{argumentName}' is invalid. Provided value: {value}. Valid values: {values}");
263264
}
264265
@@ -747,6 +748,11 @@ static T ParseArgument<T>(ref ReadOnlyMemory<string> args, int i)
747748
return value;
748749
}
749750
751+
if (typeof(T).IsEnum)
752+
{
753+
ThrowArgumentParseFailedEnum(typeof(T), args.Span[i], args.Span[i + 1]);
754+
}
755+
750756
ThrowArgumentParseFailed(args.Span[i], args.Span[i + 1]);
751757
}
752758
else

tests/ConsoleAppFramework.GeneratorTests/GlobalOptionTest.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,32 @@ enum Fruit
8585
""", "--parameter 100 --x 10 --dry-run --y 20 --fruit grape", "(100, True, Grape) -> (10, 20)");
8686
}
8787

88+
[Test]
89+
public async Task EnumErrorShowsValidValues()
90+
{
91+
var result = verifier.Error("""
92+
ConsoleApp.Log = x => Console.Write(x);
93+
94+
var app = ConsoleApp.Create();
95+
app.ConfigureGlobalOptions((ref ConsoleApp.GlobalOptionsBuilder builder) =>
96+
{
97+
var fruit = builder.AddGlobalOption("--fruit", "", Fruit.Apple);
98+
return fruit;
99+
});
100+
101+
app.Add("", (ConsoleAppContext context) => { });
102+
app.Run(args);
103+
104+
enum Fruit
105+
{
106+
Orange, Apple, Grape
107+
}
108+
""", "--fruit Potato");
109+
110+
await Assert.That(result.Stdout).Contains("Argument '--fruit' is invalid. Provided value: Potato. Valid values: Orange, Apple, Grape");
111+
await Assert.That(result.ExitCode).IsEqualTo(1);
112+
}
113+
88114
[Test]
89115
public async Task DefaultValueForOption()
90116
{

0 commit comments

Comments
 (0)