Skip to content

Commit 0b1da2e

Browse files
committed
Add a sanity check to ensure that CommandLineAction is initialized in the expected order. (In the future the order will be relaxed.)
1 parent 82817f3 commit 0b1da2e

File tree

4 files changed

+38
-9
lines changed

4 files changed

+38
-9
lines changed

common/reviews/api/ts-command-line.api.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ class CommandLineAction extends CommandLineParameterProvider {
1414
// @internal
1515
_execute(): Promise<void>;
1616
// @internal
17+
protected _getArgumentParser(): argparse.ArgumentParser;
18+
// @internal
1719
_processParsedData(data: ICommandLineParserData): void;
1820
protected abstract onDefineParameters(): void;
1921
protected abstract onExecute(): Promise<void>;
@@ -72,7 +74,7 @@ class CommandLineParameterProvider {
7274
// @internal
7375
constructor();
7476
// @internal
75-
protected _argumentParser: argparse.ArgumentParser;
77+
protected abstract _getArgumentParser(): argparse.ArgumentParser;
7678
// @internal (undocumented)
7779
protected _processParsedData(data: ICommandLineParserData): void;
7880
defineChoiceParameter(definition: ICommandLineChoiceDefinition): CommandLineChoiceParameter;
@@ -92,6 +94,8 @@ class CommandLineParameterProvider {
9294
// @public
9395
class CommandLineParser extends CommandLineParameterProvider {
9496
constructor(options: ICommandLineParserOptions);
97+
// @internal
98+
protected _getArgumentParser(): argparse.ArgumentParser;
9599
addAction(action: CommandLineAction): void;
96100
execute(args?: string[]): Promise<boolean>;
97101
executeWithoutErrorHandling(args?: string[]): Promise<void>;

libraries/ts-command-line/src/CommandLineAction.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,12 @@ export abstract class CommandLineAction extends CommandLineParameterProvider {
4141
*/
4242
public options: ICommandLineActionOptions;
4343

44+
private _argumentParser: argparse.ArgumentParser | undefined;
45+
4446
constructor(options: ICommandLineActionOptions) {
4547
super();
4648
this.options = options;
49+
this._argumentParser = undefined;
4750
}
4851

4952
/**
@@ -75,6 +78,19 @@ export abstract class CommandLineAction extends CommandLineParameterProvider {
7578
return this.onExecute();
7679
}
7780

81+
/**
82+
* {@inheritdoc CommandLineParameterProvider._getArgumentParser}
83+
* @internal
84+
*/
85+
protected _getArgumentParser(): argparse.ArgumentParser { // override
86+
if (!this._argumentParser) {
87+
// We will improve this in the future
88+
throw new Error('The CommandLineAction must be added to a CommandLineParser before it can be used');
89+
}
90+
91+
return this._argumentParser;
92+
}
93+
7894
/**
7995
* {@inheritdoc CommandLineParameterProvider.onDefineParameters}
8096
*/

libraries/ts-command-line/src/CommandLineParameterProvider.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,6 @@ export interface ICommandLineParserData {
4242
export abstract class CommandLineParameterProvider {
4343
private static _keyCounter: number = 0;
4444

45-
/**
46-
* NOTE: THIS IS INTERNAL. IN THE FUTURE, WE MAY REPLACE "argparse" WITH A DIFFERENT ENGINE.
47-
* @internal
48-
*/
49-
protected _argumentParser: argparse.ArgumentParser;
50-
5145
private _parameters: CommandLineParameter<any>[];
5246
private _parametersByLongName: Map<string, CommandLineParameter<any>>;
5347

@@ -169,7 +163,7 @@ export abstract class CommandLineParameterProvider {
169163
* Generates the command-line help text.
170164
*/
171165
public renderHelpText(): string {
172-
return this._argumentParser.formatHelp();
166+
return this._getArgumentParser().formatHelp();
173167
}
174168

175169
/**
@@ -178,6 +172,12 @@ export abstract class CommandLineParameterProvider {
178172
*/
179173
protected abstract onDefineParameters(): void;
180174

175+
/**
176+
* Retrieves the argparse object.
177+
* @internal
178+
*/
179+
protected abstract _getArgumentParser(): argparse.ArgumentParser;
180+
181181
/** @internal */
182182
protected _processParsedData(data: ICommandLineParserData): void {
183183
// Fill in the values for the parameters
@@ -237,7 +237,7 @@ export abstract class CommandLineParameterProvider {
237237
break;
238238
}
239239

240-
this._argumentParser.addArgument(names, argparseOptions);
240+
this._getArgumentParser().addArgument(names, argparseOptions);
241241

242242
this._parameters.push(parameter);
243243
this._parametersByLongName.set(parameter.longName, parameter);

libraries/ts-command-line/src/CommandLineParser.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export abstract class CommandLineParser extends CommandLineParameterProvider {
4747
*/
4848
public selectedAction: CommandLineAction;
4949

50+
private _argumentParser: argparse.ArgumentParser;
5051
private _actionsSubParser: argparse.SubParser;
5152
private _options: ICommandLineParserOptions;
5253
private _actions: CommandLineAction[];
@@ -144,6 +145,14 @@ export abstract class CommandLineParser extends CommandLineParameterProvider {
144145
}
145146
}
146147

148+
/**
149+
* {@inheritdoc CommandLineParameterProvider._getArgumentParser}
150+
* @internal
151+
*/
152+
protected _getArgumentParser(): argparse.ArgumentParser { // override
153+
return this._argumentParser;
154+
}
155+
147156
/**
148157
* This hook allows the subclass to perform additional operations before or after
149158
* the chosen action is executed.

0 commit comments

Comments
 (0)