diff --git a/src/CommandLine/ParserResultExtensionsAsync.cs b/src/CommandLine/ParserResultExtensionsAsync.cs
new file mode 100644
index 00000000..207dfa23
--- /dev/null
+++ b/src/CommandLine/ParserResultExtensionsAsync.cs
@@ -0,0 +1,63 @@
+// Copyright 2005-2015 Giacomo Stelluti Scala & Contributors. All rights reserved. See License.md in the project root for license information.
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace CommandLine
+{
+ public static partial class ParserResultExtensions
+ {
+ ///
+ /// Executes asynchronously if contains
+ /// parsed values.
+ ///
+ /// Type of the target instance built with parsed value.
+ /// An instance.
+ /// The to execute.
+ /// The same instance as a instance.
+ public static async Task> WithParsedAsync(this ParserResult result, Func action)
+ {
+ if (result is Parsed parsed)
+ {
+ await action(parsed.Value);
+ }
+ return result;
+ }
+
+ ///
+ /// Executes asynchronously if parsed values are of .
+ ///
+ /// Type of the target instance built with parsed value.
+ /// An verb result instance.
+ /// The to execute.
+ /// The same instance as a instance.
+ public static async Task> WithParsedAsync(this ParserResult result, Func action)
+ {
+ if (result is Parsed parsed)
+ {
+ if (parsed.Value is T value)
+ {
+ await action(value);
+ }
+ }
+ return result;
+ }
+
+ ///
+ /// Executes asynchronously if lacks
+ /// parsed values and contains errors.
+ ///
+ /// Type of the target instance built with parsed value.
+ /// An instance.
+ /// The delegate to execute.
+ /// The same instance as a instance.
+ public static async Task> WithNotParsedAsync(this ParserResult result, Func, Task> action)
+ {
+ if (result is NotParsed notParsed)
+ {
+ await action(notParsed.Errors);
+ }
+ return result;
+ }
+ }
+}
diff --git a/tests/CommandLine.Tests/Unit/ParserResultExtensionsTests.cs b/tests/CommandLine.Tests/Unit/ParserResultExtensionsTests.cs
index 97755940..f639a72f 100644
--- a/tests/CommandLine.Tests/Unit/ParserResultExtensionsTests.cs
+++ b/tests/CommandLine.Tests/Unit/ParserResultExtensionsTests.cs
@@ -6,6 +6,7 @@
using CommandLine.Tests.Fakes;
using Xunit;
using FluentAssertions;
+using System.Threading.Tasks;
namespace CommandLine.Tests.Unit
{
@@ -21,6 +22,16 @@ public static void Invoke_parsed_lambda_when_parsed()
"value".Should().BeEquivalentTo(expected);
}
+ [Fact]
+ public static async Task Invoke_parsed_lambda_when_parsedAsync()
+ {
+ var expected = string.Empty;
+ await Parser.Default.ParseArguments(new[] { "--stringvalue", "value" })
+ .WithParsedAsync(opts => Task.Run(() => expected = opts.StringValue));
+
+ "value".Should().BeEquivalentTo(expected);
+ }
+
[Fact]
public static void Invoke_parsed_lambda_when_parsed_for_verbs()
{
@@ -34,6 +45,20 @@ public static void Invoke_parsed_lambda_when_parsed_for_verbs()
"https://value.org/user/file.git".Should().BeEquivalentTo(expected);
}
+ [Fact]
+ public static async Task Invoke_parsed_lambda_when_parsed_for_verbsAsync()
+ {
+ var expected = string.Empty;
+ var parsedArguments = Parser.Default.ParseArguments(
+ new[] { "clone", "https://value.org/user/file.git" });
+
+ await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = "wrong1"));
+ await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = "wrong2"));
+ await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = opts.Urls.First()));
+
+ "https://value.org/user/file.git".Should().BeEquivalentTo(expected);
+ }
+
[Fact]
public static void Invoke_not_parsed_lambda_when_not_parsed()
{
@@ -44,6 +69,16 @@ public static void Invoke_not_parsed_lambda_when_not_parsed()
"changed".Should().BeEquivalentTo(expected);
}
+ [Fact]
+ public static async Task Invoke_not_parsed_lambda_when_not_parsedAsync()
+ {
+ var expected = "a default";
+ await Parser.Default.ParseArguments(new[] { "-i", "aaa" })
+ .WithNotParsedAsync(_ => Task.Run(() => expected = "changed"));
+
+ "changed".Should().BeEquivalentTo(expected);
+ }
+
[Fact]
public static void Invoke_not_parsed_lambda_when_parsed_for_verbs()
{
@@ -57,6 +92,20 @@ public static void Invoke_not_parsed_lambda_when_parsed_for_verbs()
"changed".Should().BeEquivalentTo(expected);
}
+ [Fact]
+ public static async Task Invoke_not_parsed_lambda_when_parsed_for_verbsAsync()
+ {
+ var expected = "a default";
+ var parsedArguments = Parser.Default.ParseArguments(new[] { "undefined", "-xyz" });
+
+ await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = "wrong1"));
+ await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = "wrong2"));
+ await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = "wrong3"));
+ await parsedArguments.WithNotParsedAsync(_ => Task.Run(() => expected = "changed"));
+
+ "changed".Should().BeEquivalentTo(expected);
+ }
+
[Fact]
public static void Invoke_proper_lambda_when_parsed()
{
@@ -68,6 +117,18 @@ public static void Invoke_proper_lambda_when_parsed()
"value".Should().BeEquivalentTo(expected);
}
+ [Fact]
+ public static async Task Invoke_proper_lambda_when_parsedAsync()
+ {
+ var expected = string.Empty;
+ var parsedArguments = Parser.Default.ParseArguments(new[] { "--stringvalue", "value" });
+
+ await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = opts.StringValue));
+ await parsedArguments.WithNotParsedAsync(_ => Task.Run(() => expected = "changed"));
+
+ "value".Should().BeEquivalentTo(expected);
+ }
+
[Fact]
public static void Invoke_proper_lambda_when_not_parsed()
{
@@ -79,6 +140,18 @@ public static void Invoke_proper_lambda_when_not_parsed()
"changed".Should().BeEquivalentTo(expected);
}
+ [Fact]
+ public static async Task Invoke_proper_lambda_when_not_parsedAsync()
+ {
+ var expected = "a default";
+ var parsedArguments = Parser.Default.ParseArguments(new[] { "-i", "aaa" });
+
+ await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = opts.StringValue));
+ await parsedArguments.WithNotParsedAsync(_ => Task.Run(() => expected = "changed"));
+
+ "changed".Should().BeEquivalentTo(expected);
+ }
+
[Fact]
public static void Turn_sucessful_parsing_into_exit_code()
{
@@ -139,6 +212,21 @@ public static void Invoke_parsed_lambda_when_parsed_for_base_verbs()
"dummy.bin".Should().BeEquivalentTo(expected);
}
+ [Fact]
+ public static async Task Invoke_parsed_lambda_when_parsed_for_base_verbsAsync()
+ {
+ var expected = string.Empty;
+ var parsedArguments = Parser.Default.ParseArguments(
+ new[] { "derivedadd", "dummy.bin" });
+
+ await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = "wrong1"));
+ await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = "wrong2"));
+ await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = "wrong3"));
+ await parsedArguments.WithParsedAsync(opts => Task.Run(() => expected = opts.FileName));
+
+ "dummy.bin".Should().BeEquivalentTo(expected);
+ }
+
[Fact]
public static void Turn_sucessful_parsing_into_exit_code_for_single_base_verbs()
{