tests fixes and sprints work
This commit is contained in:
437
src/Cli/StellaOps.Cli/Extensions/CommandLineCompatExtensions.cs
Normal file
437
src/Cli/StellaOps.Cli/Extensions/CommandLineCompatExtensions.cs
Normal file
@@ -0,0 +1,437 @@
|
||||
using System;
|
||||
using System.CommandLine;
|
||||
using System.CommandLine.Parsing;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StellaOps.Cli.Extensions;
|
||||
|
||||
public static class CommandLineCompatExtensions
|
||||
{
|
||||
public static Command AddCommand(this Command command, Command subcommand)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(subcommand);
|
||||
command.Add(subcommand);
|
||||
return command;
|
||||
}
|
||||
|
||||
public static Command AddOption(this Command command, Option option)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(option);
|
||||
command.Add(option);
|
||||
return command;
|
||||
}
|
||||
|
||||
public static Command AddArgument(this Command command, Argument argument)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(argument);
|
||||
command.Add(argument);
|
||||
return command;
|
||||
}
|
||||
|
||||
public static RootCommand AddGlobalOption(this RootCommand command, Option option)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(option);
|
||||
option.Recursive = true;
|
||||
command.Add(option);
|
||||
return command;
|
||||
}
|
||||
|
||||
public static void SetHandler(this Command command, Action handler)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(_ => handler());
|
||||
}
|
||||
|
||||
public static void SetHandler(this Command command, Func<Task> handler)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(_ => handler());
|
||||
}
|
||||
|
||||
public static void SetHandler(this Command command, Func<Task<int>> handler)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(_ => handler());
|
||||
}
|
||||
|
||||
public static void SetHandler<T1>(this Command command, Action<T1> handler, Symbol symbol1)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult => handler(GetValue<T1>(parseResult, symbol1)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1>(this Command command, Func<T1, Task> handler, Symbol symbol1)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult => handler(GetValue<T1>(parseResult, symbol1)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1>(this Command command, Func<T1, Task<int>> handler, Symbol symbol1)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult => handler(GetValue<T1>(parseResult, symbol1)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1, T2>(this Command command, Action<T1, T2> handler, Symbol symbol1, Symbol symbol2)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult =>
|
||||
handler(
|
||||
GetValue<T1>(parseResult, symbol1),
|
||||
GetValue<T2>(parseResult, symbol2)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1, T2>(this Command command, Func<T1, T2, Task> handler, Symbol symbol1, Symbol symbol2)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult =>
|
||||
handler(
|
||||
GetValue<T1>(parseResult, symbol1),
|
||||
GetValue<T2>(parseResult, symbol2)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1, T2>(this Command command, Func<T1, T2, Task<int>> handler, Symbol symbol1, Symbol symbol2)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult =>
|
||||
handler(
|
||||
GetValue<T1>(parseResult, symbol1),
|
||||
GetValue<T2>(parseResult, symbol2)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1, T2, T3>(
|
||||
this Command command,
|
||||
Action<T1, T2, T3> handler,
|
||||
Symbol symbol1,
|
||||
Symbol symbol2,
|
||||
Symbol symbol3)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult =>
|
||||
handler(
|
||||
GetValue<T1>(parseResult, symbol1),
|
||||
GetValue<T2>(parseResult, symbol2),
|
||||
GetValue<T3>(parseResult, symbol3)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1, T2, T3>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, Task> handler,
|
||||
Symbol symbol1,
|
||||
Symbol symbol2,
|
||||
Symbol symbol3)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult =>
|
||||
handler(
|
||||
GetValue<T1>(parseResult, symbol1),
|
||||
GetValue<T2>(parseResult, symbol2),
|
||||
GetValue<T3>(parseResult, symbol3)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1, T2, T3>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, Task<int>> handler,
|
||||
Symbol symbol1,
|
||||
Symbol symbol2,
|
||||
Symbol symbol3)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult =>
|
||||
handler(
|
||||
GetValue<T1>(parseResult, symbol1),
|
||||
GetValue<T2>(parseResult, symbol2),
|
||||
GetValue<T3>(parseResult, symbol3)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1, T2, T3, T4>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, T4, Task> handler,
|
||||
Symbol symbol1,
|
||||
Symbol symbol2,
|
||||
Symbol symbol3,
|
||||
Symbol symbol4)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult =>
|
||||
handler(
|
||||
GetValue<T1>(parseResult, symbol1),
|
||||
GetValue<T2>(parseResult, symbol2),
|
||||
GetValue<T3>(parseResult, symbol3),
|
||||
GetValue<T4>(parseResult, symbol4)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1, T2, T3, T4>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, T4, Task<int>> handler,
|
||||
Symbol symbol1,
|
||||
Symbol symbol2,
|
||||
Symbol symbol3,
|
||||
Symbol symbol4)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult =>
|
||||
handler(
|
||||
GetValue<T1>(parseResult, symbol1),
|
||||
GetValue<T2>(parseResult, symbol2),
|
||||
GetValue<T3>(parseResult, symbol3),
|
||||
GetValue<T4>(parseResult, symbol4)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1, T2, T3, T4, T5>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, T4, T5, Task> handler,
|
||||
Symbol symbol1,
|
||||
Symbol symbol2,
|
||||
Symbol symbol3,
|
||||
Symbol symbol4,
|
||||
Symbol symbol5)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult =>
|
||||
handler(
|
||||
GetValue<T1>(parseResult, symbol1),
|
||||
GetValue<T2>(parseResult, symbol2),
|
||||
GetValue<T3>(parseResult, symbol3),
|
||||
GetValue<T4>(parseResult, symbol4),
|
||||
GetValue<T5>(parseResult, symbol5)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1, T2, T3, T4, T5>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, T4, T5, Task<int>> handler,
|
||||
Symbol symbol1,
|
||||
Symbol symbol2,
|
||||
Symbol symbol3,
|
||||
Symbol symbol4,
|
||||
Symbol symbol5)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult =>
|
||||
handler(
|
||||
GetValue<T1>(parseResult, symbol1),
|
||||
GetValue<T2>(parseResult, symbol2),
|
||||
GetValue<T3>(parseResult, symbol3),
|
||||
GetValue<T4>(parseResult, symbol4),
|
||||
GetValue<T5>(parseResult, symbol5)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1, T2, T3, T4, T5, T6>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, T4, T5, T6, Task> handler,
|
||||
Symbol symbol1,
|
||||
Symbol symbol2,
|
||||
Symbol symbol3,
|
||||
Symbol symbol4,
|
||||
Symbol symbol5,
|
||||
Symbol symbol6)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult =>
|
||||
handler(
|
||||
GetValue<T1>(parseResult, symbol1),
|
||||
GetValue<T2>(parseResult, symbol2),
|
||||
GetValue<T3>(parseResult, symbol3),
|
||||
GetValue<T4>(parseResult, symbol4),
|
||||
GetValue<T5>(parseResult, symbol5),
|
||||
GetValue<T6>(parseResult, symbol6)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1, T2, T3, T4, T5, T6>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, T4, T5, T6, Task<int>> handler,
|
||||
Symbol symbol1,
|
||||
Symbol symbol2,
|
||||
Symbol symbol3,
|
||||
Symbol symbol4,
|
||||
Symbol symbol5,
|
||||
Symbol symbol6)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction(parseResult =>
|
||||
handler(
|
||||
GetValue<T1>(parseResult, symbol1),
|
||||
GetValue<T2>(parseResult, symbol2),
|
||||
GetValue<T3>(parseResult, symbol3),
|
||||
GetValue<T4>(parseResult, symbol4),
|
||||
GetValue<T5>(parseResult, symbol5),
|
||||
GetValue<T6>(parseResult, symbol6)));
|
||||
}
|
||||
|
||||
public static void SetHandler(this Command command, Action<InvocationContext> handler)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction((parseResult, cancellationToken) =>
|
||||
{
|
||||
handler(new InvocationContext(parseResult, cancellationToken));
|
||||
return Task.CompletedTask;
|
||||
});
|
||||
}
|
||||
|
||||
public static void SetHandler(this Command command, Func<InvocationContext, Task> handler)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(command);
|
||||
ArgumentNullException.ThrowIfNull(handler);
|
||||
command.SetAction((parseResult, cancellationToken) => handler(new InvocationContext(parseResult, cancellationToken)));
|
||||
}
|
||||
|
||||
public static void SetHandler<T1>(this Command command, Action<T1> handler, Option<T1> option1)
|
||||
=> command.SetHandler(handler, (Symbol)option1);
|
||||
|
||||
public static void SetHandler<T1>(this Command command, Func<T1, Task> handler, Option<T1> option1)
|
||||
=> command.SetHandler(handler, (Symbol)option1);
|
||||
|
||||
public static void SetHandler<T1>(this Command command, Func<T1, Task<int>> handler, Option<T1> option1)
|
||||
=> command.SetHandler(handler, (Symbol)option1);
|
||||
|
||||
public static void SetHandler<T1, T2>(this Command command, Action<T1, T2> handler, Option<T1> option1, Option<T2> option2)
|
||||
=> command.SetHandler(handler, (Symbol)option1, (Symbol)option2);
|
||||
|
||||
public static void SetHandler<T1, T2>(this Command command, Func<T1, T2, Task> handler, Option<T1> option1, Option<T2> option2)
|
||||
=> command.SetHandler(handler, (Symbol)option1, (Symbol)option2);
|
||||
|
||||
public static void SetHandler<T1, T2>(this Command command, Func<T1, T2, Task<int>> handler, Option<T1> option1, Option<T2> option2)
|
||||
=> command.SetHandler(handler, (Symbol)option1, (Symbol)option2);
|
||||
|
||||
public static void SetHandler<T1, T2, T3>(
|
||||
this Command command,
|
||||
Action<T1, T2, T3> handler,
|
||||
Option<T1> option1,
|
||||
Option<T2> option2,
|
||||
Option<T3> option3)
|
||||
=> command.SetHandler(handler, (Symbol)option1, (Symbol)option2, (Symbol)option3);
|
||||
|
||||
public static void SetHandler<T1, T2, T3>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, Task> handler,
|
||||
Option<T1> option1,
|
||||
Option<T2> option2,
|
||||
Option<T3> option3)
|
||||
=> command.SetHandler(handler, (Symbol)option1, (Symbol)option2, (Symbol)option3);
|
||||
|
||||
public static void SetHandler<T1, T2, T3>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, Task<int>> handler,
|
||||
Option<T1> option1,
|
||||
Option<T2> option2,
|
||||
Option<T3> option3)
|
||||
=> command.SetHandler(handler, (Symbol)option1, (Symbol)option2, (Symbol)option3);
|
||||
|
||||
public static void SetHandler<T1, T2, T3, T4>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, T4, Task> handler,
|
||||
Option<T1> option1,
|
||||
Option<T2> option2,
|
||||
Option<T3> option3,
|
||||
Option<T4> option4)
|
||||
=> command.SetHandler(handler, (Symbol)option1, (Symbol)option2, (Symbol)option3, (Symbol)option4);
|
||||
|
||||
public static void SetHandler<T1, T2, T3, T4>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, T4, Task<int>> handler,
|
||||
Option<T1> option1,
|
||||
Option<T2> option2,
|
||||
Option<T3> option3,
|
||||
Option<T4> option4)
|
||||
=> command.SetHandler(handler, (Symbol)option1, (Symbol)option2, (Symbol)option3, (Symbol)option4);
|
||||
|
||||
public static void SetHandler<T1, T2, T3, T4, T5>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, T4, T5, Task> handler,
|
||||
Option<T1> option1,
|
||||
Option<T2> option2,
|
||||
Option<T3> option3,
|
||||
Option<T4> option4,
|
||||
Option<T5> option5)
|
||||
=> command.SetHandler(handler, (Symbol)option1, (Symbol)option2, (Symbol)option3, (Symbol)option4, (Symbol)option5);
|
||||
|
||||
public static void SetHandler<T1, T2, T3, T4, T5>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, T4, T5, Task<int>> handler,
|
||||
Option<T1> option1,
|
||||
Option<T2> option2,
|
||||
Option<T3> option3,
|
||||
Option<T4> option4,
|
||||
Option<T5> option5)
|
||||
=> command.SetHandler(handler, (Symbol)option1, (Symbol)option2, (Symbol)option3, (Symbol)option4, (Symbol)option5);
|
||||
|
||||
public static void SetHandler<T1, T2, T3, T4, T5, T6>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, T4, T5, T6, Task> handler,
|
||||
Option<T1> option1,
|
||||
Option<T2> option2,
|
||||
Option<T3> option3,
|
||||
Option<T4> option4,
|
||||
Option<T5> option5,
|
||||
Option<T6> option6)
|
||||
=> command.SetHandler(handler, (Symbol)option1, (Symbol)option2, (Symbol)option3, (Symbol)option4, (Symbol)option5, (Symbol)option6);
|
||||
|
||||
public static void SetHandler<T1, T2, T3, T4, T5, T6>(
|
||||
this Command command,
|
||||
Func<T1, T2, T3, T4, T5, T6, Task<int>> handler,
|
||||
Option<T1> option1,
|
||||
Option<T2> option2,
|
||||
Option<T3> option3,
|
||||
Option<T4> option4,
|
||||
Option<T5> option5,
|
||||
Option<T6> option6)
|
||||
=> command.SetHandler(handler, (Symbol)option1, (Symbol)option2, (Symbol)option3, (Symbol)option4, (Symbol)option5, (Symbol)option6);
|
||||
|
||||
private static T GetValue<T>(ParseResult parseResult, Symbol symbol)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(parseResult);
|
||||
ArgumentNullException.ThrowIfNull(symbol);
|
||||
|
||||
if (symbol is Option<T> option)
|
||||
{
|
||||
return parseResult.GetValue(option)!;
|
||||
}
|
||||
|
||||
if (symbol is Argument<T> argument)
|
||||
{
|
||||
return parseResult.GetValue(argument)!;
|
||||
}
|
||||
|
||||
return parseResult.GetValue<T>(symbol.Name)!;
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class InvocationContext
|
||||
{
|
||||
public InvocationContext(ParseResult parseResult, CancellationToken cancellationToken)
|
||||
{
|
||||
ParseResult = parseResult ?? throw new ArgumentNullException(nameof(parseResult));
|
||||
CancellationToken = cancellationToken;
|
||||
}
|
||||
|
||||
public ParseResult ParseResult { get; }
|
||||
|
||||
public CancellationToken CancellationToken { get; }
|
||||
|
||||
public int ExitCode { get; set; }
|
||||
|
||||
public CancellationToken GetCancellationToken() => CancellationToken;
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.CommandLine;
|
||||
using System.CommandLine.Parsing;
|
||||
namespace StellaOps.Cli.Extensions;
|
||||
|
||||
/// <summary>
|
||||
@@ -18,6 +19,16 @@ public static class CommandLineExtensions
|
||||
return option;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set a default value for an argument.
|
||||
/// </summary>
|
||||
public static Argument<T> SetDefaultValue<T>(this Argument<T> argument, T defaultValue)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(argument);
|
||||
argument.DefaultValueFactory = _ => defaultValue;
|
||||
return argument;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Restrict the option to a fixed set of values and add completions.
|
||||
/// </summary>
|
||||
@@ -41,4 +52,35 @@ public static class CommandLineExtensions
|
||||
option.Required = isRequired;
|
||||
return option;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add an alias to an option.
|
||||
/// </summary>
|
||||
public static Option<T> AddAlias<T>(this Option<T> option, string alias)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(option);
|
||||
ArgumentException.ThrowIfNullOrWhiteSpace(alias);
|
||||
option.Aliases.Add(alias);
|
||||
return option;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Compatibility shim for GetValueForOption.
|
||||
/// </summary>
|
||||
public static T? GetValueForOption<T>(this ParseResult parseResult, Option<T> option)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(parseResult);
|
||||
ArgumentNullException.ThrowIfNull(option);
|
||||
return parseResult.GetValue(option);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Compatibility shim for GetValueForArgument.
|
||||
/// </summary>
|
||||
public static T? GetValueForArgument<T>(this ParseResult parseResult, Argument<T> argument)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(parseResult);
|
||||
ArgumentNullException.ThrowIfNull(argument);
|
||||
return parseResult.GetValue(argument);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user