Skip to content

Commit 4ab2d5f

Browse files
committed
r more
1 parent 521bd58 commit 4ab2d5f

File tree

4 files changed

+54
-74
lines changed

4 files changed

+54
-74
lines changed
Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,16 @@
11
using ConsoleAppFramework;
2-
using System;
3-
using System.Linq;
4-
using System.Threading;
5-
using System.Threading.Tasks;
62

7-
public static class Program
8-
{
9-
public static void Main(string[] args)
10-
{
11-
var cmd = new Commands();
12-
ConsoleApp.Run(args, cmd.SomeCommand);
13-
14-
}
15-
}
16-
17-
internal record GlobalOptions(string Flag);
3+
var builder = ConsoleApp.Create();
4+
builder.Add<Commands>();
5+
await builder.RunAsync(args);
186

19-
internal class Commands
7+
public class Commands
208
{
21-
[Command("some-command")]
22-
public void SomeCommand([Argument] string commandArg, ConsoleAppContext context)
23-
{
24-
Console.WriteLine($"ARG: {commandArg}");
25-
Console.WriteLine($"ESCAPED: {string.Join(", ", context.EscapedArguments.ToArray()!)}");
26-
}
27-
}
9+
[Hidden]
10+
public void Command1() { Console.Write("command1"); }
2811

29-
internal class SomeFilter(ConsoleAppFilter next) : ConsoleAppFilter(next)
30-
{
31-
public override async Task InvokeAsync(ConsoleAppContext context, CancellationToken cancellationToken)
32-
{
33-
Console.WriteLine($"FLAG: {((GlobalOptions)context.GlobalOptions!).Flag}");
34-
await Next.InvokeAsync(context, cancellationToken);
35-
}
12+
public void Command2() { Console.Write("command2"); }
13+
14+
[Hidden]
15+
public void Command3(int x, [Hidden] int y) { Console.Write($"command3: x={x} y={y}"); }
3616
}

src/ConsoleAppFramework.Abstractions/ConsoleApp.Abstractions.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public record ConsoleAppContext
2020
/// <summary>
2121
/// Gets the raw arguments passed to the application, including the command name itself.
2222
/// </summary>
23-
public ReadOnlyMemory<string> Arguments { get; init; }
23+
public string[] Arguments { get; init; }
2424

2525
/// <summary>
2626
/// Gets the custom state object that can be used to share data across commands.
@@ -56,8 +56,8 @@ public record ConsoleAppContext
5656
public ReadOnlySpan<string> CommandArguments
5757
{
5858
get => (EscapeIndex == -1)
59-
? Arguments.Span.Slice(CommandDepth)
60-
: Arguments.Span.Slice(CommandDepth, EscapeIndex - CommandDepth);
59+
? Arguments.AsSpan(CommandDepth)
60+
: Arguments.AsSpan(CommandDepth, EscapeIndex - CommandDepth);
6161
}
6262

6363
/// <summary>
@@ -68,10 +68,10 @@ public ReadOnlySpan<string> EscapedArguments
6868
{
6969
get => (EscapeIndex == -1)
7070
? Array.Empty<string>()
71-
: Arguments.Span.Slice(EscapeIndex + 1);
71+
: Arguments.AsSpan(EscapeIndex + 1);
7272
}
7373

74-
public ConsoleAppContext(string commandName, ReadOnlyMemory<string> arguments, ReadOnlyMemory<string> internalCommandArgs, object? state, object? globalOptions, int commandDepth, int escapeIndex)
74+
public ConsoleAppContext(string commandName, string[] arguments, ReadOnlyMemory<string> internalCommandArgs, object? state, object? globalOptions, int commandDepth, int escapeIndex)
7575
{
7676
this.CommandName = commandName;
7777
this.Arguments = arguments;
@@ -88,7 +88,7 @@ public ConsoleAppContext(string commandName, ReadOnlyMemory<string> arguments, R
8888
/// <returns>A space-separated string of all arguments.</returns>
8989
public override string ToString()
9090
{
91-
return string.Join(" ", Arguments.ToArray());
91+
return string.Join(" ", Arguments);
9292
}
9393
}
9494

src/ConsoleAppFramework/ConsoleAppBaseCode.cs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ internal record ConsoleAppContext
5858
/// <summary>
5959
/// Gets the raw arguments passed to the application, including the command name itself.
6060
/// </summary>
61-
public ReadOnlyMemory<string> Arguments { get; init; }
61+
public string[] Arguments { get; init; }
6262
6363
/// <summary>
6464
/// Gets the custom state object that can be used to share data across commands.
@@ -91,8 +91,8 @@ internal record ConsoleAppContext
9191
public ReadOnlySpan<string> CommandArguments
9292
{
9393
get => (EscapeIndex == -1)
94-
? Arguments.Span.Slice(CommandDepth)
95-
: Arguments.Span.Slice(CommandDepth, EscapeIndex - CommandDepth);
94+
? Arguments.AsSpan(CommandDepth)
95+
: Arguments.AsSpan(CommandDepth, EscapeIndex - CommandDepth);
9696
}
9797
9898
/// <summary>
@@ -103,10 +103,10 @@ public ReadOnlySpan<string> EscapedArguments
103103
{
104104
get => (EscapeIndex == -1)
105105
? Array.Empty<string>()
106-
: Arguments.Span.Slice(EscapeIndex + 1);
106+
: Arguments.AsSpan(EscapeIndex + 1);
107107
}
108108
109-
public ConsoleAppContext(string commandName, ReadOnlyMemory<string> arguments, ReadOnlyMemory<string> internalCommandArgs, object? state, object? globalOptions, int commandDepth, int escapeIndex)
109+
public ConsoleAppContext(string commandName, string[] arguments, ReadOnlyMemory<string> internalCommandArgs, object? state, object? globalOptions, int commandDepth, int escapeIndex)
110110
{
111111
this.CommandName = commandName;
112112
this.Arguments = arguments;
@@ -123,7 +123,7 @@ public ConsoleAppContext(string commandName, ReadOnlyMemory<string> arguments, R
123123
/// <returns>A space-separated string of all arguments.</returns>
124124
public override string ToString()
125125
{
126-
return string.Join(" ", Arguments.ToArray());
126+
return string.Join(" ", Arguments);
127127
}
128128
}
129129
@@ -230,7 +230,7 @@ public static Action<string> LogError
230230
/// ConsoleApp.Run(args, Foo);<br/>
231231
/// ConsoleApp.Run(args, &amp;Foo);<br/>
232232
/// </summary>
233-
public static void Run(ReadOnlyMemory<string> args)
233+
public static void Run(string[] args)
234234
{
235235
}
236236
@@ -240,7 +240,7 @@ public static void Run(ReadOnlyMemory<string> args)
240240
/// ConsoleApp.RunAsync(args, Foo);<br/>
241241
/// ConsoleApp.RunAsync(args, &amp;Foo);<br/>
242242
/// </summary>
243-
public static Task RunAsync(ReadOnlyMemory<string> args)
243+
public static Task RunAsync(string[] args)
244244
{
245245
return Task.CompletedTask;
246246
}
@@ -510,10 +510,10 @@ public void UseFilter<T>() where T : ConsoleAppFilter { }
510510
partial void AddCore(string commandName, Delegate command);
511511
512512
[MethodImpl(MethodImplOptions.AggressiveInlining)]
513-
partial void RunCore(ReadOnlyMemory<string> args, CancellationToken cancellationToken);
513+
partial void RunCore(string[] args, CancellationToken cancellationToken);
514514
515515
[MethodImpl(MethodImplOptions.AggressiveInlining)]
516-
partial void RunAsyncCore(ReadOnlyMemory<string> args, CancellationToken cancellationToken, ref Task result);
516+
partial void RunAsyncCore(string[] args, CancellationToken cancellationToken, ref Task result);
517517
518518
partial void BuildAndSetServiceProvider(ConsoleAppContext context);
519519
@@ -557,13 +557,13 @@ public ConsoleAppBuilder ConfigureGlobalOptions(FuncGlobalOptionsBuilderObject c
557557
return this;
558558
}
559559
560-
async Task RunWithFilterAsync(string commandName, ReadOnlyMemory<string> args, int commandDepth, ConsoleAppFilter invoker, CancellationToken cancellationToken)
560+
async Task RunWithFilterAsync(string commandName, string[] args, int commandDepth, ConsoleAppFilter invoker, CancellationToken cancellationToken)
561561
{
562562
using var posixSignalHandler = PosixSignalHandler.Register(Timeout, cancellationToken);
563563
try
564564
{
565-
var escapeIndex = args.Span.IndexOf("--");
566-
var commandArgs = (escapeIndex == -1) ? args.Slice(commandDepth) : args.Slice(commandDepth, escapeIndex - commandDepth);
565+
var escapeIndex = args.AsSpan().IndexOf("--");
566+
var commandArgs = (escapeIndex == -1) ? args.AsMemory(commandDepth) : args.AsMemory(commandDepth, escapeIndex - commandDepth);
567567
568568
ConsoleAppContext context;
569569
if (configureGlobalOptions == null)
@@ -1077,10 +1077,10 @@ internal static partial class ConsoleApp
10771077
{
10781078
internal partial class ConsoleAppBuilder
10791079
{
1080-
public void Run(ReadOnlyMemory<string> args) => Run(args, true);
1081-
public void Run(ReadOnlyMemory<string> args, CancellationToken cancellationToken) => Run(args, true, cancellationToken);
1080+
public void Run(string[] args) => Run(args, true);
1081+
public void Run(string[] args, CancellationToken cancellationToken) => Run(args, true, cancellationToken);
10821082
1083-
public void Run(ReadOnlyMemory<string> args, bool disposeServiceProvider, CancellationToken cancellationToken = default)
1083+
public void Run(string[] args, bool disposeServiceProvider, CancellationToken cancellationToken = default)
10841084
{
10851085
try
10861086
{
@@ -1098,10 +1098,10 @@ public void Run(ReadOnlyMemory<string> args, bool disposeServiceProvider, Cancel
10981098
}
10991099
}
11001100
1101-
public Task RunAsync(ReadOnlyMemory<string> args) => RunAsync(args, true);
1102-
public Task RunAsync(ReadOnlyMemory<string> args, CancellationToken cancellationToken) => RunAsync(args, true, cancellationToken);
1101+
public Task RunAsync(string[] args) => RunAsync(args, true);
1102+
public Task RunAsync(string[] args, CancellationToken cancellationToken) => RunAsync(args, true, cancellationToken);
11031103
1104-
public async Task RunAsync(ReadOnlyMemory<string> args, bool disposeServiceProvider, CancellationToken cancellationToken = default)
1104+
public async Task RunAsync(string[] args, bool disposeServiceProvider, CancellationToken cancellationToken = default)
11051105
{
11061106
try
11071107
{
@@ -1155,10 +1155,10 @@ internal partial class ConsoleAppBuilder
11551155
Microsoft.Extensions.Hosting.IHost? host;
11561156
bool startHost;
11571157
1158-
public void Run(ReadOnlyMemory<string> args) => Run(args, true, true, true);
1159-
public void Run(ReadOnlyMemory<string> args, CancellationToken cancellationToken) => Run(args, true, true, true, cancellationToken);
1158+
public void Run(string[] args) => Run(args, true, true, true);
1159+
public void Run(string[] args, CancellationToken cancellationToken) => Run(args, true, true, true, cancellationToken);
11601160
1161-
public void Run(ReadOnlyMemory<string> args, bool startHost, bool stopHost, bool disposeServiceProvider, CancellationToken cancellationToken = default)
1161+
public void Run(string[] args, bool startHost, bool stopHost, bool disposeServiceProvider, CancellationToken cancellationToken = default)
11621162
{
11631163
this.startHost = startHost;
11641164
try
@@ -1182,10 +1182,10 @@ public void Run(ReadOnlyMemory<string> args, bool startHost, bool stopHost, bool
11821182
}
11831183
}
11841184
1185-
public Task RunAsync(ReadOnlyMemory<string> args) => RunAsync(args, true, true, true);
1186-
public Task RunAsync(ReadOnlyMemory<string> args, CancellationToken cancellationToken) => RunAsync(args, true, true, true, cancellationToken);
1185+
public Task RunAsync(string[] args) => RunAsync(args, true, true, true);
1186+
public Task RunAsync(string[] args, CancellationToken cancellationToken) => RunAsync(args, true, true, true, cancellationToken);
11871187
1188-
public async Task RunAsync(ReadOnlyMemory<string> args, bool startHost, bool stopHost, bool disposeServiceProvider, CancellationToken cancellationToken = default)
1188+
public async Task RunAsync(string[] args, bool startHost, bool stopHost, bool disposeServiceProvider, CancellationToken cancellationToken = default)
11891189
{
11901190
this.startHost = startHost;
11911191
try

src/ConsoleAppFramework/Emitter.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public void EmitRun(SourceBuilder sb, CommandWithId commandWithId, bool isRunAsy
6666

6767
var methodArgument = command.HasFilter
6868
? Join(", ", commandMethodType, "ConsoleAppContext context", "CancellationToken cancellationToken")
69-
: Join(", ", "ReadOnlyMemory<string> args", (emitForBuilder ? "int commandDepth" : ""), commandMethodType, cancellationTokenParameter);
69+
: Join(", ", "string[] args", (emitForBuilder ? "int commandDepth" : ""), commandMethodType, cancellationTokenParameter);
7070

7171
using (sb.BeginBlock($"{accessibility} {unsafeCode}{returnType} {methodName}({methodArgument})"))
7272
{
@@ -75,21 +75,20 @@ public void EmitRun(SourceBuilder sb, CommandWithId commandWithId, bool isRunAsy
7575
// prepare commandArgs
7676
if (command.HasFilter)
7777
{
78-
sb.AppendLine("var commandArgs = context.InternalCommandArgs.Span;"); // already prepared and craeted ConsoleAppContext
78+
sb.AppendLine("var commandArgsMemory = context.InternalCommandArgs;"); // already prepared and craeted ConsoleAppContext
7979
}
8080
else
8181
{
82-
sb.AppendLine("var escapeIndex = args.Span.IndexOf(\"--\");");
82+
sb.AppendLine("var escapeIndex = args.AsSpan().IndexOf(\"--\");");
8383
if (!emitForBuilder)
8484
{
8585
sb.AppendLine("var commandDepth = 0;");
8686
}
8787

88-
sb.AppendLine("var commandArgsMemory = (escapeIndex == -1) ? args.Slice(commandDepth) : args.Slice(commandDepth, escapeIndex - commandDepth);");
89-
sb.AppendLine("var commandArgs = commandArgsMemory.Span;");
88+
sb.AppendLine("ReadOnlyMemory<string> commandArgsMemory = (escapeIndex == -1) ? args.AsMemory(commandDepth) : args.AsMemory(commandDepth, escapeIndex - commandDepth);");
9089
}
9190

92-
sb.AppendLine($"if (TryShowHelpOrVersion(commandArgs, {requiredParsableParameterCount}, {commandWithId.Id})) return;");
91+
sb.AppendLine($"if (TryShowHelpOrVersion(commandArgsMemory.Span, {requiredParsableParameterCount}, {commandWithId.Id})) return;");
9392
sb.AppendLine();
9493

9594
// setup-timer
@@ -114,7 +113,7 @@ public void EmitRun(SourceBuilder sb, CommandWithId commandWithId, bool isRunAsy
114113
sb.AppendLine("var builder = new GlobalOptionsBuilder(commandArgsMemory);");
115114
sb.AppendLine("var globalOptions = configureGlobalOptions(ref builder);");
116115
sb.AppendLine($"context = new ConsoleAppContext(\"{command.Name}\", args, builder.RemainingArgs, null, globalOptions, commandDepth, escapeIndex);");
117-
sb.AppendLine("commandArgs = builder.RemainingArgs.Span;");
116+
sb.AppendLine("commandArgsMemory = builder.RemainingArgs;");
118117
}
119118
sb.AppendLine("BuildAndSetServiceProvider(context);");
120119

@@ -189,6 +188,7 @@ public void EmitRun(SourceBuilder sb, CommandWithId commandWithId, bool isRunAsy
189188
sb.AppendLine("var argumentPosition = 0;");
190189
}
191190

191+
sb.AppendLine("var commandArgs = commandArgsMemory.Span;");
192192
using (sb.BeginBlock("for (int i = 0; i < commandArgs.Length; i++)"))
193193
{
194194
sb.AppendLine("var name = commandArgs[i];");
@@ -483,11 +483,11 @@ public void EmitBuilder(SourceBuilder sb, CommandWithId[] commandIds, bool emitS
483483
if (emitSync)
484484
{
485485
sb.AppendLine();
486-
using (sb.BeginBlock("partial void RunCore(ReadOnlyMemory<string> args, CancellationToken cancellationToken)"))
486+
using (sb.BeginBlock("partial void RunCore(string[] args, CancellationToken cancellationToken)"))
487487
{
488488
if (hasRootCommand)
489489
{
490-
using (sb.BeginBlock("if (args.Length == 1 && args.Span[0] is \"--help\" or \"-h\")"))
490+
using (sb.BeginBlock("if (args.Length == 1 && args[0] is \"--help\" or \"-h\")"))
491491
{
492492
sb.AppendLine("ShowHelp(-1);");
493493
sb.AppendLine("return;");
@@ -502,11 +502,11 @@ public void EmitBuilder(SourceBuilder sb, CommandWithId[] commandIds, bool emitS
502502
if (emitAsync)
503503
{
504504
sb.AppendLine();
505-
using (sb.BeginBlock("partial void RunAsyncCore(ReadOnlyMemory<string> args, CancellationToken cancellationToken, ref Task result)"))
505+
using (sb.BeginBlock("partial void RunAsyncCore(string[] args, CancellationToken cancellationToken, ref Task result)"))
506506
{
507507
if (hasRootCommand)
508508
{
509-
using (sb.BeginBlock("if (args.Length == 1 && args.Span[0] is \"--help\" or \"-h\")"))
509+
using (sb.BeginBlock("if (args.Length == 1 && args[0] is \"--help\" or \"-h\")"))
510510
{
511511
sb.AppendLine("ShowHelp(-1);");
512512
sb.AppendLine("return;");
@@ -578,7 +578,7 @@ void EmitRunBody(ILookup<string, CommandWithId> groupedCommands, int depth, bool
578578
return;
579579
}
580580

581-
using (sb.BeginBlock($"switch (args.Span[{depth}])"))
581+
using (sb.BeginBlock($"switch (args[{depth}])"))
582582
{
583583
foreach (var commands in groupedCommands.Where(x => x.Key != ""))
584584
{
@@ -616,7 +616,7 @@ void EmitLeafCommand(CommandWithId? command)
616616
{
617617
if (command == null)
618618
{
619-
sb.AppendLine($"if (!TryShowHelpOrVersion(args.Span.Slice({depth}), -1, -1)) ShowHelp(-1);");
619+
sb.AppendLine($"if (!TryShowHelpOrVersion(args.AsSpan({depth}), -1, -1)) ShowHelp(-1);");
620620
}
621621
else
622622
{

0 commit comments

Comments
 (0)