Skip to content

Commit 43c57ad

Browse files
authored
make control of middleware order public (#740)
* make control of middleware order public * unique middleware position per internally defined middleware
1 parent 5ec6c4a commit 43c57ad

File tree

4 files changed

+54
-32
lines changed

4 files changed

+54
-32
lines changed

src/System.CommandLine/Builder/CommandLineBuilder.cs

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace System.CommandLine.Builder
1212
{
1313
public class CommandLineBuilder : CommandBuilder
1414
{
15-
private List<(InvocationMiddleware middleware, int order)> _middlewareList;
15+
private readonly List<(InvocationMiddleware middleware, int order)> _middlewareList = new List<(InvocationMiddleware middleware, int order)>();
1616

1717
public CommandLineBuilder(Command rootCommand = null)
1818
: base(rootCommand ?? new RootCommand())
@@ -43,30 +43,22 @@ public Parser Build()
4343
responseFileHandling: ResponseFileHandling,
4444
middlewarePipeline: _middlewareList?.OrderBy(m => m.order)
4545
.Select(m => m.middleware)
46-
.ToArray(),
46+
.ToArray(),
4747
helpBuilderFactory: HelpBuilderFactory));
4848
}
4949

5050
internal void AddMiddleware(
5151
InvocationMiddleware middleware,
52-
int order)
52+
MiddlewareOrder order)
5353
{
54-
if (_middlewareList == null)
55-
{
56-
_middlewareList = new List<(InvocationMiddleware, int)>();
57-
}
58-
59-
_middlewareList.Add((middleware, order));
54+
_middlewareList.Add((middleware, (int) order));
6055
}
6156

62-
internal static class MiddlewareOrder
57+
internal void AddMiddleware(
58+
InvocationMiddleware middleware,
59+
MiddlewareOrderInternal order)
6360
{
64-
public const int ProcessExit = int.MinValue;
65-
public const int ExceptionHandler = ProcessExit + 100;
66-
public const int Configuration = ExceptionHandler + 100;
67-
public const int Preprocessing = Configuration + 100;
68-
public const int AfterPreprocessing = Preprocessing + 100;
69-
public const int Middle = 0;
61+
_middlewareList.Add((middleware, (int) order));
7062
}
7163
}
7264
}

src/System.CommandLine/Builder/CommandLineBuilderExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public static CommandLineBuilder UseVersionOption(
7979
{
8080
await next(context);
8181
}
82-
}, CommandLineBuilder.MiddlewareOrder.Preprocessing);
82+
}, MiddlewareOrderInternal.VersionOption);
8383

8484
return builder;
8585
}

src/System.CommandLine/Invocation/InvocationExtensions.cs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public static CommandLineBuilder CancelOnProcessTermination(this CommandLineBuil
6666
blockProcessExit.Set();
6767
}
6868
}
69-
}, CommandLineBuilder.MiddlewareOrder.ProcessExit);
69+
}, MiddlewareOrderInternal.Startup);
7070

7171
return builder;
7272
}
@@ -79,31 +79,33 @@ public static CommandLineBuilder ConfigureConsole(
7979
{
8080
context.BindingContext.ConsoleFactory = new AnonymousConsoleFactory(createConsole);
8181
await next(context);
82-
}, CommandLineBuilder.MiddlewareOrder.Middle);
82+
}, MiddlewareOrderInternal.ConfigureConsole);
8383

8484
return builder;
8585
}
8686

8787
public static CommandLineBuilder UseMiddleware(
8888
this CommandLineBuilder builder,
89-
InvocationMiddleware middleware)
89+
InvocationMiddleware middleware,
90+
MiddlewareOrder order = MiddlewareOrder.Default)
9091
{
9192
builder.AddMiddleware(
9293
middleware,
93-
CommandLineBuilder.MiddlewareOrder.Middle);
94+
order);
9495

9596
return builder;
9697
}
9798

9899
public static CommandLineBuilder UseMiddleware(
99100
this CommandLineBuilder builder,
100-
Action<InvocationContext> onInvoke)
101+
Action<InvocationContext> onInvoke,
102+
MiddlewareOrder order = MiddlewareOrder.Default)
101103
{
102104
builder.AddMiddleware(async (context, next) =>
103105
{
104106
onInvoke(context);
105107
await next(context);
106-
}, CommandLineBuilder.MiddlewareOrder.Middle);
108+
}, order);
107109

108110
return builder;
109111
}
@@ -128,7 +130,7 @@ public static CommandLineBuilder UseDebugDirective(
128130
}
129131

130132
await next(context);
131-
}, CommandLineBuilder.MiddlewareOrder.ExceptionHandler - 1);
133+
}, MiddlewareOrderInternal.DebugDirective);
132134

133135
return builder;
134136
}
@@ -147,7 +149,7 @@ public static CommandLineBuilder UseExceptionHandler(
147149
{
148150
(onException ?? Default)(exception, context);
149151
}
150-
}, order: CommandLineBuilder.MiddlewareOrder.ExceptionHandler);
152+
}, MiddlewareOrderInternal.ExceptionHandler);
151153

152154
return builder;
153155

@@ -178,7 +180,7 @@ public static CommandLineBuilder UseParseDirective(
178180
{
179181
await next(context);
180182
}
181-
}, CommandLineBuilder.MiddlewareOrder.Preprocessing);
183+
}, MiddlewareOrderInternal.ParseDirective);
182184

183185
return builder;
184186
}
@@ -207,7 +209,7 @@ public static CommandLineBuilder UseSuggestDirective(
207209
{
208210
await next(context);
209211
}
210-
}, CommandLineBuilder.MiddlewareOrder.Preprocessing);
212+
}, MiddlewareOrderInternal.SuggestDirective);
211213

212214
return builder;
213215
}
@@ -225,7 +227,7 @@ public static CommandLineBuilder UseTypoCorrections(
225227
typoCorrection.ProvideSuggestions(context.ParseResult, context.Console);
226228
}
227229
await next(context);
228-
}, CommandLineBuilder.MiddlewareOrder.Preprocessing);
230+
}, MiddlewareOrderInternal.TypoCorrection);
229231

230232
return builder;
231233
}
@@ -336,7 +338,7 @@ public static CommandLineBuilder UseHelp(this CommandLineBuilder builder)
336338
{
337339
await next(context);
338340
}
339-
}, CommandLineBuilder.MiddlewareOrder.Preprocessing);
341+
}, MiddlewareOrderInternal.HelpOption);
340342

341343
return builder;
342344
}
@@ -351,7 +353,7 @@ public static CommandLineBuilder UseHelp(
351353
{
352354
await next(context);
353355
}
354-
}, CommandLineBuilder.MiddlewareOrder.Preprocessing);
356+
}, MiddlewareOrderInternal.HelpOption);
355357
return builder;
356358
}
357359

@@ -368,7 +370,7 @@ public static CommandLineBuilder UseParseErrorReporting(
368370
{
369371
await next(context);
370372
}
371-
}, CommandLineBuilder.MiddlewareOrder.AfterPreprocessing);
373+
}, MiddlewareOrderInternal.ParseErrorReporting);
372374
return builder;
373375
}
374376

@@ -406,7 +408,7 @@ await feature.EnsureRegistered(async () =>
406408
});
407409

408410
await next(context);
409-
}, CommandLineBuilder.MiddlewareOrder.Configuration);
411+
}, MiddlewareOrderInternal.RegisterWithDotnetSuggest);
410412

411413
return builder;
412414
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright (c) .NET Foundation and contributors. All rights reserved.
2+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
3+
4+
namespace System.CommandLine.Invocation
5+
{
6+
public enum MiddlewareOrder
7+
{
8+
ExceptionHandler = -2000,
9+
Configuration = -1000,
10+
Default = default,
11+
ErrorReporting = 1000,
12+
}
13+
14+
internal enum MiddlewareOrderInternal
15+
{
16+
Startup = -4000,
17+
ExceptionHandler = -3000,
18+
ConfigureConsole = -2500,
19+
RegisterWithDotnetSuggest = -2400,
20+
DebugDirective = -2300,
21+
ParseDirective = -2200,
22+
SuggestDirective = -2000,
23+
TypoCorrection = -1900,
24+
VersionOption = -1200,
25+
HelpOption = -1100,
26+
ParseErrorReporting = 1000,
27+
}
28+
}

0 commit comments

Comments
 (0)