Skip to content

Commit cab1103

Browse files
committed
Merge branch 'joseangelmt-develop' into develop (#390)
2 parents 746885a + e66cee7 commit cab1103

File tree

2 files changed

+151
-0
lines changed

2 files changed

+151
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// Copyright 2005-2015 Giacomo Stelluti Scala & Contributors. All rights reserved. See License.md in the project root for license information.
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Threading.Tasks;
5+
6+
namespace CommandLine
7+
{
8+
public static partial class ParserResultExtensions
9+
{
10+
/// <summary>
11+
/// Executes asynchronously <paramref name="action"/> if <see cref="CommandLine.ParserResult{T}"/> contains
12+
/// parsed values.
13+
/// </summary>
14+
/// <typeparam name="T">Type of the target instance built with parsed value.</typeparam>
15+
/// <param name="result">An <see cref="CommandLine.ParserResult{T}"/> instance.</param>
16+
/// <param name="action">The <see cref="Func{T, Task}"/> to execute.</param>
17+
/// <returns>The same <paramref name="result"/> instance as a <see cref="Task"/> instance.</returns>
18+
public static async Task<ParserResult<T>> WithParsedAsync<T>(this ParserResult<T> result, Func<T, Task> action)
19+
{
20+
if (result is Parsed<T> parsed)
21+
{
22+
await action(parsed.Value);
23+
}
24+
return result;
25+
}
26+
27+
/// <summary>
28+
/// Executes asynchronously <paramref name="action"/> if parsed values are of <typeparamref name="T"/>.
29+
/// </summary>
30+
/// <typeparam name="T">Type of the target instance built with parsed value.</typeparam>
31+
/// <param name="result">An verb result instance.</param>
32+
/// <param name="action">The <see cref="Func{T, Task}"/> to execute.</param>
33+
/// <returns>The same <paramref name="result"/> instance as a <see cref="Task"/> instance.</returns>
34+
public static async Task<ParserResult<object>> WithParsedAsync<T>(this ParserResult<object> result, Func<T, Task> action)
35+
{
36+
if (result is Parsed<object> parsed)
37+
{
38+
if (parsed.Value is T value)
39+
{
40+
await action(value);
41+
}
42+
}
43+
return result;
44+
}
45+
46+
/// <summary>
47+
/// Executes asynchronously <paramref name="action"/> if <see cref="CommandLine.ParserResult{T}"/> lacks
48+
/// parsed values and contains errors.
49+
/// </summary>
50+
/// <typeparam name="T">Type of the target instance built with parsed value.</typeparam>
51+
/// <param name="result">An <see cref="CommandLine.ParserResult{T}"/> instance.</param>
52+
/// <param name="action">The <see cref="System.Func{Task}"/> delegate to execute.</param>
53+
/// <returns>The same <paramref name="result"/> instance as a <see cref="Task"/> instance.</returns>
54+
public static async Task<ParserResult<T>> WithNotParsedAsync<T>(this ParserResult<T> result, Func<IEnumerable<Error>, Task> action)
55+
{
56+
if (result is NotParsed<T> notParsed)
57+
{
58+
await action(notParsed.Errors);
59+
}
60+
return result;
61+
}
62+
}
63+
}

tests/CommandLine.Tests/Unit/ParserResultExtensionsTests.cs

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Xunit;
55
using FluentAssertions;
66
using CommandLine.Tests.Fakes;
7+
using System.Threading.Tasks;
78

89
namespace CommandLine.Tests.Unit
910
{
@@ -19,6 +20,16 @@ public static void Invoke_parsed_lambda_when_parsed()
1920
"value".Should().BeEquivalentTo(expected);
2021
}
2122

23+
[Fact]
24+
public static async Task Invoke_parsed_lambda_when_parsedAsync()
25+
{
26+
var expected = string.Empty;
27+
await Parser.Default.ParseArguments<Simple_Options>(new[] { "--stringvalue", "value" })
28+
.WithParsedAsync(opts => Task.Run(() => expected = opts.StringValue));
29+
30+
"value".Should().BeEquivalentTo(expected);
31+
}
32+
2233
[Fact]
2334
public static void Invoke_parsed_lambda_when_parsed_for_verbs()
2435
{
@@ -32,6 +43,20 @@ public static void Invoke_parsed_lambda_when_parsed_for_verbs()
3243
"https://value.org/user/file.git".Should().BeEquivalentTo(expected);
3344
}
3445

46+
[Fact]
47+
public static async Task Invoke_parsed_lambda_when_parsed_for_verbsAsync()
48+
{
49+
var expected = string.Empty;
50+
var parsedArguments = Parser.Default.ParseArguments<Add_Verb, Commit_Verb, Clone_Verb>(
51+
new[] { "clone", "https://value.org/user/file.git" });
52+
53+
await parsedArguments.WithParsedAsync<Add_Verb>(opts => Task.Run(() => expected = "wrong1"));
54+
await parsedArguments.WithParsedAsync<Commit_Verb>(opts => Task.Run(() => expected = "wrong2"));
55+
await parsedArguments.WithParsedAsync<Clone_Verb>(opts => Task.Run(() => expected = opts.Urls.First()));
56+
57+
"https://value.org/user/file.git".Should().BeEquivalentTo(expected);
58+
}
59+
3560
[Fact]
3661
public static void Invoke_not_parsed_lambda_when_not_parsed()
3762
{
@@ -42,6 +67,16 @@ public static void Invoke_not_parsed_lambda_when_not_parsed()
4267
"changed".Should().BeEquivalentTo(expected);
4368
}
4469

70+
[Fact]
71+
public static async Task Invoke_not_parsed_lambda_when_not_parsedAsync()
72+
{
73+
var expected = "a default";
74+
await Parser.Default.ParseArguments<Simple_Options>(new[] { "-i", "aaa" })
75+
.WithNotParsedAsync(_ => Task.Run(() => expected = "changed"));
76+
77+
"changed".Should().BeEquivalentTo(expected);
78+
}
79+
4580
[Fact]
4681
public static void Invoke_not_parsed_lambda_when_parsed_for_verbs()
4782
{
@@ -55,6 +90,20 @@ public static void Invoke_not_parsed_lambda_when_parsed_for_verbs()
5590
"changed".Should().BeEquivalentTo(expected);
5691
}
5792

93+
[Fact]
94+
public static async Task Invoke_not_parsed_lambda_when_parsed_for_verbsAsync()
95+
{
96+
var expected = "a default";
97+
var parsedArguments = Parser.Default.ParseArguments<Add_Verb, Commit_Verb, Clone_Verb>(new[] { "undefined", "-xyz" });
98+
99+
await parsedArguments.WithParsedAsync<Add_Verb>(opts => Task.Run(() => expected = "wrong1"));
100+
await parsedArguments.WithParsedAsync<Commit_Verb>(opts => Task.Run(() => expected = "wrong2"));
101+
await parsedArguments.WithParsedAsync<Clone_Verb>(opts => Task.Run(() => expected = "wrong3"));
102+
await parsedArguments.WithNotParsedAsync(_ => Task.Run(() => expected = "changed"));
103+
104+
"changed".Should().BeEquivalentTo(expected);
105+
}
106+
58107
[Fact]
59108
public static void Invoke_proper_lambda_when_parsed()
60109
{
@@ -66,6 +115,18 @@ public static void Invoke_proper_lambda_when_parsed()
66115
"value".Should().BeEquivalentTo(expected);
67116
}
68117

118+
[Fact]
119+
public static async Task Invoke_proper_lambda_when_parsedAsync()
120+
{
121+
var expected = string.Empty;
122+
var parsedArguments = Parser.Default.ParseArguments<Simple_Options>(new[] { "--stringvalue", "value" });
123+
124+
await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = opts.StringValue));
125+
await parsedArguments.WithNotParsedAsync(_ => Task.Run(() => expected = "changed"));
126+
127+
"value".Should().BeEquivalentTo(expected);
128+
}
129+
69130
[Fact]
70131
public static void Invoke_proper_lambda_when_not_parsed()
71132
{
@@ -77,6 +138,18 @@ public static void Invoke_proper_lambda_when_not_parsed()
77138
"changed".Should().BeEquivalentTo(expected);
78139
}
79140

141+
[Fact]
142+
public static async Task Invoke_proper_lambda_when_not_parsedAsync()
143+
{
144+
var expected = "a default";
145+
var parsedArguments = Parser.Default.ParseArguments<Simple_Options>(new[] { "-i", "aaa" });
146+
147+
await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = opts.StringValue));
148+
await parsedArguments.WithNotParsedAsync(_ => Task.Run(() => expected = "changed"));
149+
150+
"changed".Should().BeEquivalentTo(expected);
151+
}
152+
80153
[Fact]
81154
public static void Turn_sucessful_parsing_into_exit_code()
82155
{
@@ -137,6 +210,21 @@ public static void Invoke_parsed_lambda_when_parsed_for_base_verbs()
137210
"dummy.bin".Should().BeEquivalentTo(expected);
138211
}
139212

213+
[Fact]
214+
public static async Task Invoke_parsed_lambda_when_parsed_for_base_verbsAsync()
215+
{
216+
var expected = string.Empty;
217+
var parsedArguments = Parser.Default.ParseArguments<Add_Verb, Commit_Verb, Clone_Verb, Derived_Verb>(
218+
new[] { "derivedadd", "dummy.bin" });
219+
220+
await parsedArguments.WithParsedAsync<Add_Verb>(opts => Task.Run(() => expected = "wrong1"));
221+
await parsedArguments.WithParsedAsync<Commit_Verb>(opts => Task.Run(() => expected = "wrong2"));
222+
await parsedArguments.WithParsedAsync<Clone_Verb>(opts => Task.Run(() => expected = "wrong3"));
223+
await parsedArguments.WithParsedAsync<Base_Class_For_Verb>(opts => Task.Run(() => expected = opts.FileName));
224+
225+
"dummy.bin".Should().BeEquivalentTo(expected);
226+
}
227+
140228
[Fact]
141229
public static void Turn_sucessful_parsing_into_exit_code_for_single_base_verbs()
142230
{

0 commit comments

Comments
 (0)