tests fixes and sprints work

This commit is contained in:
master
2026-01-22 19:08:46 +02:00
parent c32fff8f86
commit 726d70dc7f
881 changed files with 134434 additions and 6228 deletions

View 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;
}

View File

@@ -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);
}
}