4
4
using System . CommandLine . Directives ;
5
5
using System . CommandLine . Parsing ;
6
6
using System . CommandLine . Subsystems ;
7
+ using System . Reflection . PortableExecutable ;
7
8
8
9
namespace System . CommandLine ;
9
10
10
11
public class Pipeline
11
12
{
13
+ //TODO: When we allow adding subsystems, this code will change
14
+ private IEnumerable < CliSubsystem ? > Subsystems
15
+ => [ Help , Version , Completion , Diagram , Value , ErrorReporting ] ;
16
+
12
17
public static Pipeline Create ( HelpSubsystem ? help = null ,
13
18
VersionSubsystem ? version = null ,
14
19
CompletionSubsystem ? completion = null ,
@@ -63,61 +68,6 @@ public CliExit Execute(ParseResult parseResult, string rawInput, ConsoleHack? co
63
68
return new CliExit ( pipelineContext ) ;
64
69
}
65
70
66
- protected virtual void InitializeHelp ( InitializationContext context )
67
- => Help ? . Initialize ( context ) ;
68
-
69
- protected virtual void InitializeVersion ( InitializationContext context )
70
- => Version ? . Initialize ( context ) ;
71
-
72
- protected virtual void InitializeCompletion ( InitializationContext context )
73
- => Completion ? . Initialize ( context ) ;
74
-
75
- protected virtual void InitializeDiagram ( InitializationContext context )
76
- => Diagram ? . Initialize ( context ) ;
77
-
78
- protected virtual void InitializeErrorReporting ( InitializationContext context )
79
- => ErrorReporting ? . Initialize ( context ) ;
80
-
81
- protected virtual CliExit TearDownHelp ( CliExit cliExit )
82
- => Help is null
83
- ? cliExit
84
- : Help . TearDown ( cliExit ) ;
85
-
86
- protected virtual CliExit ? TearDownVersion ( CliExit cliExit )
87
- => Version is null
88
- ? cliExit
89
- : Version . TearDown ( cliExit ) ;
90
-
91
- protected virtual CliExit TearDownCompletion ( CliExit cliExit )
92
- => Completion is null
93
- ? cliExit
94
- : Completion . TearDown ( cliExit ) ;
95
-
96
- protected virtual CliExit TearDownDiagram ( CliExit cliExit )
97
- => Diagram is null
98
- ? cliExit
99
- : Diagram . TearDown ( cliExit ) ;
100
-
101
- protected virtual CliExit TearDownErrorReporting ( CliExit cliExit )
102
- => ErrorReporting is null
103
- ? cliExit
104
- : ErrorReporting . TearDown ( cliExit ) ;
105
-
106
- protected virtual void ExecuteHelp ( PipelineContext context )
107
- => ExecuteIfNeeded ( Help , context ) ;
108
-
109
- protected virtual void ExecuteVersion ( PipelineContext context )
110
- => ExecuteIfNeeded ( Version , context ) ;
111
-
112
- protected virtual void ExecuteCompletion ( PipelineContext context )
113
- => ExecuteIfNeeded ( Completion , context ) ;
114
-
115
- protected virtual void ExecuteDiagram ( PipelineContext context )
116
- => ExecuteIfNeeded ( Diagram , context ) ;
117
-
118
- protected virtual void ExecuteErrorReporting ( PipelineContext context )
119
- => ExecuteIfNeeded ( ErrorReporting , context ) ;
120
-
121
71
// TODO: Consider whether this should be public. It would simplify testing, but would it do anything else
122
72
// TODO: Confirm that it is OK for ConsoleHack to be unavailable in Initialize
123
73
/// <summary>
@@ -131,11 +81,13 @@ protected virtual void ExecuteErrorReporting(PipelineContext context)
131
81
/// </remarks>
132
82
protected virtual void InitializeSubsystems ( InitializationContext context )
133
83
{
134
- InitializeHelp ( context ) ;
135
- InitializeVersion ( context ) ;
136
- InitializeCompletion ( context ) ;
137
- InitializeDiagram ( context ) ;
138
- InitializeErrorReporting ( context ) ;
84
+ foreach ( var subsystem in Subsystems )
85
+ {
86
+ if ( subsystem is not null )
87
+ {
88
+ subsystem . Initialize ( context ) ;
89
+ }
90
+ }
139
91
}
140
92
141
93
// TODO: Consider whether this should be public
@@ -144,26 +96,31 @@ protected virtual void InitializeSubsystems(InitializationContext context)
144
96
/// Perform any cleanup operations
145
97
/// </summary>
146
98
/// <param name="pipelineContext">The context of the current execution</param>
147
- /// <remarks>
148
- /// Note to inheritors: The ordering of tear down should normally be in the reverse order than initializing
149
- /// </remarks>
150
99
protected virtual CliExit TearDownSubsystems ( CliExit cliExit )
151
100
{
152
- TearDownErrorReporting ( cliExit ) ;
153
- TearDownDiagram ( cliExit ) ;
154
- TearDownCompletion ( cliExit ) ;
155
- TearDownVersion ( cliExit ) ;
156
- TearDownHelp ( cliExit ) ;
101
+ // TODO: Work on this design as the last cliExit wins and they may not all be well behaved
102
+ var subsystems = Subsystems . Reverse ( ) ;
103
+ foreach ( var subsystem in subsystems )
104
+ {
105
+ if ( subsystem is not null )
106
+ {
107
+ cliExit = subsystem . TearDown ( cliExit ) ;
108
+ }
109
+ }
157
110
return cliExit ;
158
111
}
159
112
160
113
protected virtual void ExecuteSubsystems ( PipelineContext pipelineContext )
161
114
{
162
- ExecuteHelp ( pipelineContext ) ;
163
- ExecuteVersion ( pipelineContext ) ;
164
- ExecuteCompletion ( pipelineContext ) ;
165
- ExecuteDiagram ( pipelineContext ) ;
166
- ExecuteErrorReporting ( pipelineContext ) ;
115
+ // TODO: Consider redesign where pipelineContext is not modifiable.
116
+ //
117
+ foreach ( var subsystem in Subsystems )
118
+ {
119
+ if ( subsystem is not null )
120
+ {
121
+ pipelineContext = subsystem . ExecuteIfNeeded ( pipelineContext ) ;
122
+ }
123
+ }
167
124
}
168
125
169
126
protected static void ExecuteIfNeeded ( CliSubsystem ? subsystem , PipelineContext pipelineContext )
0 commit comments