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

View File

@ -35,6 +35,12 @@ namespace Spectre.Console.Tests.Unit.Cli
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
{
[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]
[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")]