mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-04-24 04:02:50 +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));
|
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
|
||||||
{
|
{
|
||||||
|
@ -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")]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user