Skip to content

Commit 83934e0

Browse files
KathleenDollardmhutch
authored andcommitted
Refactor subsystem initialization
The configuration and args are now wrapped in an InitializationContext
1 parent 032cb10 commit 83934e0

File tree

8 files changed

+54
-44
lines changed

8 files changed

+54
-44
lines changed

src/System.CommandLine.Subsystems.Tests/AlternateSubsystems.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ internal class VersionWithInitializeAndTeardown : VersionSubsystem
4545
internal bool ExecutionWasRun;
4646
internal bool TeardownWasRun;
4747

48-
protected override CliConfiguration Initialize(CliConfiguration configuration)
48+
protected override CliConfiguration Initialize(InitializationContext context)
4949
{
5050
// marker hack needed because ConsoleHack not available in initialization
5151
InitializationWasRun = true;
52-
return base.Initialize(configuration);
52+
return base.Initialize(context);
5353
}
5454

5555
protected override CliExit Execute(PipelineContext pipelineContext)

src/System.CommandLine.Subsystems/ErrorReportingSubsystem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace System.CommandLine;
99
public class ErrorReportingSubsystem : CliSubsystem
1010
{
1111
public ErrorReportingSubsystem(IAnnotationProvider? annotationProvider = null)
12-
: base(ErrorReportingAnnotations.Prefix, annotationProvider, SubsystemKind.ErrorReporting)
12+
: base(ErrorReportingAnnotations.Prefix, SubsystemKind.ErrorReporting, annotationProvider)
1313
{ }
1414

1515
// TODO: Stash option rather than using string

src/System.CommandLine.Subsystems/HelpSubsystem.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace System.CommandLine;
1616
// .With(help.Description, "Greet the user");
1717
//
1818
public class HelpSubsystem(IAnnotationProvider? annotationProvider = null)
19-
: CliSubsystem(HelpAnnotations.Prefix, annotationProvider: annotationProvider, SubsystemKind.Help)
19+
: CliSubsystem(HelpAnnotations.Prefix, SubsystemKind.Help, annotationProvider)
2020
{
2121
public void SetDescription(CliSymbol symbol, string description)
2222
=> SetAnnotation(symbol, HelpAnnotations.Description, description);
@@ -29,15 +29,16 @@ public string GetDescription(CliSymbol symbol)
2929
public AnnotationAccessor<string> Description
3030
=> new(this, HelpAnnotations.Description);
3131

32-
protected internal override CliConfiguration Initialize(CliConfiguration configuration)
32+
protected internal override CliConfiguration Initialize(InitializationContext context)
3333
{
3434
var option = new CliOption<bool>("--help", ["-h"])
3535
{
36+
// TODO: Why don't we accept bool like any other bool option?
3637
Arity = ArgumentArity.Zero
3738
};
38-
configuration.RootCommand.Add(option);
39+
context.Configuration.RootCommand.Add(option);
3940

40-
return configuration;
41+
return context.Configuration;
4142
}
4243

4344
protected internal override bool GetIsActivated(ParseResult? parseResult)

src/System.CommandLine.Subsystems/Pipeline.cs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ public class Pipeline
1616
public ParseResult Parse(CliConfiguration configuration, string rawInput)
1717
=> Parse(configuration, CliParser.SplitCommandLine(rawInput).ToArray());
1818

19-
public ParseResult Parse(CliConfiguration configuration, string[] args)
19+
public ParseResult Parse(CliConfiguration configuration, IReadOnlyList<string> args)
2020
{
21-
InitializeSubsystems(configuration);
21+
InitializeSubsystems(new InitializationContext(configuration, args));
2222
var parseResult = CliParser.Parse(configuration.RootCommand, args, configuration);
2323
return parseResult;
2424
}
@@ -39,17 +39,17 @@ public CliExit Execute(ParseResult parseResult, string rawInput, ConsoleHack? co
3939
return new CliExit(pipelineContext);
4040
}
4141

42-
protected virtual void InitializeHelp(CliConfiguration configuration)
43-
=> Help?.Initialize(configuration);
42+
protected virtual void InitializeHelp(InitializationContext context)
43+
=> Help?.Initialize(context);
4444

45-
protected virtual void InitializeVersion(CliConfiguration configuration)
46-
=> Version?.Initialize(configuration);
45+
protected virtual void InitializeVersion(InitializationContext context)
46+
=> Version?.Initialize(context);
4747

48-
protected virtual void InitializeErrorReporting(CliConfiguration configuration)
49-
=> ErrorReporting?.Initialize(configuration);
48+
protected virtual void InitializeCompletion(InitializationContext context)
49+
=> Completion?.Initialize(context);
5050

51-
protected virtual void InitializeCompletion(CliConfiguration configuration)
52-
=> Completion?.Initialize(configuration);
51+
protected virtual void InitializeErrorReporting(InitializationContext context)
52+
=> ErrorReporting?.Initialize(context);
5353

5454
protected virtual CliExit TearDownHelp(CliExit cliExit)
5555
=> Help is null
@@ -61,28 +61,28 @@ protected virtual CliExit TearDownHelp(CliExit cliExit)
6161
? cliExit
6262
: Version.TearDown(cliExit);
6363

64+
protected virtual CliExit TearDownCompletion(CliExit cliExit)
65+
=> Completion is null
66+
? cliExit
67+
: Completion.TearDown(cliExit);
68+
6469
protected virtual CliExit TearDownErrorReporting(CliExit cliExit)
6570
=> ErrorReporting is null
6671
? cliExit
6772
: ErrorReporting.TearDown(cliExit);
6873

69-
protected virtual CliExit TearDownCompletions(CliExit cliExit)
70-
=> Completion is null
71-
? cliExit
72-
: Completion.TearDown(cliExit);
73-
7474
protected virtual void ExecuteHelp(PipelineContext context)
7575
=> ExecuteIfNeeded(Help, context);
7676

7777
protected virtual void ExecuteVersion(PipelineContext context)
7878
=> ExecuteIfNeeded(Version, context);
7979

80+
protected virtual void ExecuteCompletion(PipelineContext context)
81+
=> ExecuteIfNeeded(Completion, context);
82+
8083
protected virtual void ExecuteErrorReporting(PipelineContext context)
8184
=> ExecuteIfNeeded(ErrorReporting, context);
8285

83-
protected virtual void ExecuteCompletions(PipelineContext context)
84-
=> ExecuteIfNeeded(Completion, context);
85-
8686
// TODO: Consider whether this should be public. It would simplify testing, but would it do anything else
8787
// TODO: Confirm that it is OK for ConsoleHack to be unavailable in Initialize
8888
/// <summary>
@@ -94,12 +94,12 @@ protected virtual void ExecuteCompletions(PipelineContext context)
9494
/// <remarks>
9595
/// Note to inheritors: The ordering of initializing should normally be in the reverse order than tear down
9696
/// </remarks>
97-
protected virtual void InitializeSubsystems(CliConfiguration configuration)
97+
protected virtual void InitializeSubsystems(InitializationContext context)
9898
{
99-
InitializeHelp(configuration);
100-
InitializeVersion(configuration);
101-
InitializeErrorReporting(configuration);
102-
InitializeCompletion(configuration);
99+
InitializeHelp(context);
100+
InitializeVersion(context);
101+
InitializeCompletion(context);
102+
InitializeErrorReporting(context);
103103
}
104104

105105
// TODO: Consider whether this should be public

src/System.CommandLine.Subsystems/Subsystems/CliSubsystem.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright (c) .NET Foundation and contributors. All rights reserved.
22
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
33

4-
using System.CommandLine.Subsystems.Annotations;
54
using System.Diagnostics.CodeAnalysis;
65

76
namespace System.CommandLine.Subsystems;
@@ -12,7 +11,7 @@ namespace System.CommandLine.Subsystems;
1211
/// <param name="annotationProvider"></param>
1312
public abstract class CliSubsystem
1413
{
15-
protected CliSubsystem(string name, IAnnotationProvider? annotationProvider, SubsystemKind subsystemKind)
14+
protected CliSubsystem(string name, SubsystemKind subsystemKind, IAnnotationProvider? annotationProvider)
1615
{
1716
Name = name;
1817
_annotationProvider = annotationProvider;
@@ -115,7 +114,8 @@ internal PipelineContext ExecuteIfNeeded(ParseResult? parseResult, PipelineConte
115114
/// <param name="configuration">The CLI configuration, which contains the RootCommand for customization</param>
116115
/// <returns>True if parsing should continue</returns> // there might be a better design that supports a message
117116
// TODO: Because of this and similar usage, consider combining CLI declaration and config. ArgParse calls this the parser, which I like
118-
protected internal virtual CliConfiguration Initialize(CliConfiguration configuration) => configuration;
117+
protected internal virtual CliConfiguration Initialize(InitializationContext context)
118+
=> context.Configuration;
119119

120120
// TODO: Determine if this is needed.
121121
protected internal virtual CliExit TearDown(CliExit cliExit)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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.Subsystems;
5+
6+
public class InitializationContext(CliConfiguration configuration, IReadOnlyList<string> args)
7+
{
8+
public CliConfiguration Configuration { get; } = configuration;
9+
public IReadOnlyList<string> Args { get; } = args;
10+
}

src/System.CommandLine.Subsystems/Subsystems/Subsystem.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,24 @@ namespace System.CommandLine.Subsystems;
55

66
public class Subsystem
77
{
8-
public static void Initialize(CliSubsystem subsystem, CliConfiguration configuration)
9-
=> subsystem.Initialize(configuration);
8+
public static void Initialize(CliSubsystem subsystem, CliConfiguration configuration, IReadOnlyList<string> args)
9+
=> subsystem.Initialize(new InitializationContext(configuration, args));
1010

1111
public static CliExit Execute(CliSubsystem subsystem, PipelineContext pipelineContext)
1212
=> subsystem.Execute(pipelineContext);
1313

1414
public static bool GetIsActivated(CliSubsystem subsystem, ParseResult parseResult)
1515
=> subsystem.GetIsActivated(parseResult);
1616

17-
public static CliExit ExecuteIfNeeded(CliSubsystem subsystem, ParseResult parseResult, string rawInput, ConsoleHack? consoleHack = null)
18-
=> new(subsystem.ExecuteIfNeeded(new PipelineContext(parseResult, rawInput, null,consoleHack)));
17+
public static CliExit ExecuteIfNeeded(CliSubsystem subsystem, ParseResult parseResult, string rawInput, ConsoleHack? consoleHack = null)
18+
=> new(subsystem.ExecuteIfNeeded(new PipelineContext(parseResult, rawInput, null, consoleHack)));
1919

2020
public static CliExit Execute(CliSubsystem subsystem, ParseResult parseResult, string rawInput, ConsoleHack? consoleHack = null)
2121
=> subsystem.Execute(new PipelineContext(parseResult, rawInput, null, consoleHack));
2222

2323

24-
internal static PipelineContext ExecuteIfNeeded(CliSubsystem subsystem, ParseResult parseResult, string rawInput, ConsoleHack? consoleHack, PipelineContext? pipelineContext = null)
25-
=> subsystem.ExecuteIfNeeded(pipelineContext ?? new PipelineContext(parseResult, rawInput, null,consoleHack));
24+
internal static PipelineContext ExecuteIfNeeded(CliSubsystem subsystem, ParseResult parseResult, string rawInput, ConsoleHack? consoleHack, PipelineContext? pipelineContext = null)
25+
=> subsystem.ExecuteIfNeeded(pipelineContext ?? new PipelineContext(parseResult, rawInput, null, consoleHack));
2626

2727
internal static PipelineContext ExecuteIfNeeded(CliSubsystem subsystem, PipelineContext pipelineContext)
2828
=> subsystem.ExecuteIfNeeded(pipelineContext);

src/System.CommandLine.Subsystems/VersionSubsystem.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class VersionSubsystem : CliSubsystem
1212
private string? specificVersion = null;
1313

1414
public VersionSubsystem(IAnnotationProvider? annotationProvider = null)
15-
: base(VersionAnnotations.Prefix, annotationProvider, SubsystemKind.Version)
15+
: base(VersionAnnotations.Prefix, SubsystemKind.Version, annotationProvider)
1616
{
1717
}
1818

@@ -34,16 +34,15 @@ public string? SpecificVersion
3434
?.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
3535
?.InformationalVersion;
3636

37-
38-
protected internal override CliConfiguration Initialize(CliConfiguration configuration)
37+
protected internal override CliConfiguration Initialize(InitializationContext context)
3938
{
4039
var option = new CliOption<bool>("--version", ["-v"])
4140
{
4241
Arity = ArgumentArity.Zero
4342
};
44-
configuration.RootCommand.Add(option);
43+
context.Configuration.RootCommand.Add(option);
4544

46-
return configuration;
45+
return context.Configuration;
4746
}
4847

4948
// TODO: Stash option rather than using string

0 commit comments

Comments
 (0)