Skip to content

Commit b223842

Browse files
authored
Merge pull request #222 from dusrdev/issue-220
Implements better error messages for enums (Issue #220)
2 parents 0574e08 + 5db839b commit b223842

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

src/ConsoleAppFramework/Command.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,8 @@ string Core(ITypeSymbol type, bool nullable)
254254
// Enum
255255
if (type.TypeKind == TypeKind.Enum)
256256
{
257-
return $"if ({incrementIndex}!Enum.TryParse<{type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>(commandArgs[i], true, {outArgVar})) {{ ThrowArgumentParseFailed(\"{argumentName}\", commandArgs[i]); }}{elseExpr}";
257+
string typeName = type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
258+
return $"if ({incrementIndex}!Enum.TryParse<{typeName}>(commandArgs[i], true, {outArgVar})) {{ ThrowArgumentParseFailed<{typeName}>(\"{argumentName}\", commandArgs[i]); }}{elseExpr}";
258259
}
259260

260261
// ParamsArray

src/ConsoleAppFramework/ConsoleAppBaseCode.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,11 @@ 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.GetValues<TEnum>());
262+
throw new ArgumentParseFailedException($"Argument '{argumentName}' is invalid. Provided value: {value}. Valid values: {values}");
263+
}
264+
260265
static void ThrowRequiredArgumentNotParsed(string name)
261266
{
262267
throw new ArgumentParseFailedException($"Required argument '{name}' was not specified.");

tests/ConsoleAppFramework.GeneratorTests/RunTest.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,23 @@ await Assert.That(verifier.Error("""
9090

9191
}
9292

93+
[Test]
94+
public async Task EnumErrorShowsValidValues()
95+
{
96+
var result = verifier.Error("""
97+
ConsoleApp.Log = x => Console.Write(x);
98+
ConsoleApp.Run(args, (Fruit fruit) => { Console.Write(fruit); });
99+
100+
enum Fruit
101+
{
102+
Orange, Grape, Apple
103+
}
104+
""", "--fruit Potato");
105+
106+
await Assert.That(result.Stdout).Contains("Argument 'fruit' is invalid. Provided value: Potato. Valid values: Orange, Grape, Apple");
107+
await Assert.That(result.ExitCode).IsEqualTo(1);
108+
}
109+
93110
[Test]
94111
public async Task MissingArgument()
95112
{

0 commit comments

Comments
 (0)