Fix type conversion in the default pair deconstructor implementation (#618)

The code using the TypeConverter was written backwards (using `ConvertTo` instead of `ConvertFrom` and would thus throw an exception.
This commit is contained in:
Cédric Luthi 2021-11-22 15:07:58 +01:00 committed by GitHub
parent 19eb273813
commit 8fed3bc575
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 7 deletions

View File

@ -19,9 +19,6 @@ namespace Spectre.Console.Cli
throw new ArgumentNullException(nameof(value)); throw new ArgumentNullException(nameof(value));
} }
var keyConverter = GetConverter(keyType);
var valueConverter = GetConverter(valueType);
var parts = value.Split(new[] { '=' }, StringSplitOptions.None); var parts = value.Split(new[] { '=' }, StringSplitOptions.None);
if (parts.Length < 1 || parts.Length > 2) if (parts.Length < 1 || parts.Length > 2)
{ {
@ -47,15 +44,16 @@ namespace Spectre.Console.Cli
} }
} }
return (Parse(keyConverter, keyType, stringkey), return (Parse(stringkey, keyType),
Parse(valueConverter, valueType, stringValue)); Parse(stringValue, valueType));
} }
private static object Parse(TypeConverter converter, Type type, string value) private static object? Parse(string value, Type targetType)
{ {
try try
{ {
return converter.ConvertTo(value, type); var converter = GetConverter(targetType);
return converter.ConvertFrom(value);
} }
catch catch
{ {

View File

@ -35,6 +35,12 @@ namespace Spectre.Console.Tests.Unit.Cli
public IDictionary<string, int> Values { get; set; } public IDictionary<string, int> Values { get; set; }
} }
public sealed class DefaultPairDeconstructorEnumValueSettings : CommandSettings
{
[CommandOption("--var <VALUE>")]
public IDictionary<string, DayOfWeek> Values { get; set; }
}
public sealed class LookupSettings : CommandSettings public sealed class LookupSettings : CommandSettings
{ {
[CommandOption("--var <VALUE>")] [CommandOption("--var <VALUE>")]
@ -153,6 +159,35 @@ namespace Spectre.Console.Tests.Unit.Cli
}); });
} }
[Fact]
public void Should_Map_Pairs_With_Enum_Value_To_Pair_Deconstructable_Collection_Using_Default_Deconstructor()
{
// Given
var app = new CommandAppTester();
app.SetDefaultCommand<GenericCommand<DefaultPairDeconstructorEnumValueSettings>>();
app.Configure(config =>
{
config.PropagateExceptions();
});
// When
var result = app.Run(new[]
{
"--var", "foo=Monday",
"--var", "bar=Tuesday",
});
// Then
result.ExitCode.ShouldBe(0);
result.Settings.ShouldBeOfType<DefaultPairDeconstructorEnumValueSettings>().And(pair =>
{
pair.Values.ShouldNotBeNull();
pair.Values.Count.ShouldBe(2);
pair.Values["foo"].ShouldBe(DayOfWeek.Monday);
pair.Values["bar"].ShouldBe(DayOfWeek.Tuesday);
});
}
[Theory] [Theory]
[InlineData("foo=1=2", "Error: The value 'foo=1=2' is not in a correct format")] [InlineData("foo=1=2", "Error: The value 'foo=1=2' is not in a correct format")]
[InlineData("foo=1=2=3", "Error: The value 'foo=1=2=3' is not in a correct format")] [InlineData("foo=1=2=3", "Error: The value 'foo=1=2=3' is not in a correct format")]