mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-04-16 00:42:51 +08:00
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:
parent
19eb273813
commit
8fed3bc575
@ -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
|
||||
{
|
||||
|
@ -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")]
|
||||
|
Loading…
x
Reference in New Issue
Block a user