Skip to content

Commit 5946576

Browse files
committed
fix: revert to local functions for scanner parse/assert
Signed-off-by: Michael Molisani <[email protected]>
1 parent 67f642a commit 5946576

File tree

1 file changed

+49
-77
lines changed

1 file changed

+49
-77
lines changed

packages/core/src/parameter/scanner.ts

+49-77
Original file line numberDiff line numberDiff line change
@@ -176,23 +176,6 @@ function redactInputFromProperties(obj: Record<string, unknown>, input: string,
176176
* Thrown when underlying parameter parser throws an exception parsing some input.
177177
*/
178178
export class ArgumentParseError extends ArgumentScannerError {
179-
static parseInput<T, P extends InputParser<T, CONTEXT>, CONTEXT extends CommandContext>(
180-
externalFlagNameOrPlaceholder: ExternalFlagName | Placeholder,
181-
parser: P,
182-
input: string,
183-
displayValue: string,
184-
source: ArgumentInputSource,
185-
context: CONTEXT,
186-
): ReturnType<P> {
187-
try {
188-
return parser.call(context, input) as ReturnType<P>;
189-
} catch (exc) {
190-
if (typeof exc === "object" && exc) {
191-
redactInputFromProperties(exc as Record<string, unknown>, input, displayValue);
192-
}
193-
throw new ArgumentParseError(externalFlagNameOrPlaceholder, displayValue, source, exc);
194-
}
195-
}
196179
/**
197180
* External name of flag or placeholder for positional argument that was parsing this input.
198181
*/
@@ -235,27 +218,28 @@ export class ArgumentParseError extends ArgumentScannerError {
235218
}
236219
}
237220

221+
function parseInput<T, P extends InputParser<T, CONTEXT>, CONTEXT extends CommandContext>(
222+
externalFlagNameOrPlaceholder: ExternalFlagName | Placeholder,
223+
parser: P,
224+
input: string,
225+
displayValue: string,
226+
source: ArgumentInputSource,
227+
context: CONTEXT,
228+
): ReturnType<P> {
229+
try {
230+
return parser.call(context, input) as ReturnType<P>;
231+
} catch (exc) {
232+
if (typeof exc === "object" && exc) {
233+
redactInputFromProperties(exc as Record<string, unknown>, input, displayValue);
234+
}
235+
throw new ArgumentParseError(externalFlagNameOrPlaceholder, displayValue, source, exc);
236+
}
237+
}
238+
238239
/**
239240
* Thrown when input fails to match the given values for an enum flag.
240241
*/
241242
export class EnumValidationError extends ArgumentScannerError {
242-
static assertInputIsEnumValue<T extends string>(
243-
flag: BaseEnumFlagParameter<T>,
244-
input: string,
245-
displayValue: string,
246-
source: ArgumentInputSource,
247-
config: ScannerConfiguration,
248-
externalFlagName: ExternalFlagName,
249-
): asserts input is T {
250-
if (!flag.values.includes(input as T)) {
251-
if (input === displayValue) {
252-
const corrections = filterClosestAlternatives(input, flag.values, config.distanceOptions);
253-
throw new EnumValidationError(externalFlagName, input, source, flag.values, corrections);
254-
} else {
255-
throw new EnumValidationError(externalFlagName, displayValue, source, flag.values, []);
256-
}
257-
}
258-
}
259243
/**
260244
* External name of flag that was parsing this input.
261245
*/
@@ -308,6 +292,24 @@ export class EnumValidationError extends ArgumentScannerError {
308292
}
309293
}
310294

295+
function assertInputIsEnumValue<T extends string>(
296+
flag: BaseEnumFlagParameter<T>,
297+
input: string,
298+
displayValue: string,
299+
source: ArgumentInputSource,
300+
config: ScannerConfiguration,
301+
externalFlagName: ExternalFlagName,
302+
): asserts input is T {
303+
if (!flag.values.includes(input as T)) {
304+
if (input === displayValue) {
305+
const corrections = filterClosestAlternatives(input, flag.values, config.distanceOptions);
306+
throw new EnumValidationError(externalFlagName, input, source, flag.values, corrections);
307+
} else {
308+
throw new EnumValidationError(externalFlagName, displayValue, source, flag.values, []);
309+
}
310+
}
311+
}
312+
311313
/**
312314
* Thrown when flag was expecting input that was not provided.
313315
*/
@@ -583,7 +585,7 @@ async function parseInputsForFlag<CONTEXT extends CommandContext>(
583585
}
584586
const displayValue = flag.default.redact ? "*".repeat(defaultValue.length) : defaultValue;
585587
if (flag.kind === "boolean") {
586-
return ArgumentParseError.parseInput(
588+
return parseInput(
587589
externalFlagName,
588590
looseBooleanParser,
589591
defaultValue,
@@ -593,39 +595,18 @@ async function parseInputsForFlag<CONTEXT extends CommandContext>(
593595
);
594596
}
595597
if (flag.kind === "enum") {
596-
EnumValidationError.assertInputIsEnumValue(
597-
flag,
598-
defaultValue,
599-
displayValue,
600-
source,
601-
config,
602-
externalFlagName,
603-
);
598+
assertInputIsEnumValue(flag, defaultValue, displayValue, source, config, externalFlagName);
604599
return defaultValue;
605600
}
606-
return ArgumentParseError.parseInput(
607-
externalFlagName,
608-
flag.parse,
609-
defaultValue,
610-
displayValue,
611-
source,
612-
context,
613-
);
601+
return parseInput(externalFlagName, flag.parse, defaultValue, displayValue, source, context);
614602
}
615603
if (flag.kind === "boolean") {
616604
return flag.default;
617605
}
618606
if (flag.kind === "enum") {
619607
return flag.default;
620608
}
621-
return ArgumentParseError.parseInput(
622-
externalFlagName,
623-
flag.parse,
624-
flag.default,
625-
flag.default,
626-
"default",
627-
context,
628-
);
609+
return parseInput(externalFlagName, flag.parse, flag.default, flag.default, "default", context);
629610
}
630611
if (flag.optional) {
631612
return;
@@ -639,32 +620,30 @@ async function parseInputsForFlag<CONTEXT extends CommandContext>(
639620
}
640621
if (flag.kind === "counter") {
641622
return inputs.reduce((total, input) => {
642-
const value = ArgumentParseError.parseInput(externalFlagName, numberParser, input, input, "argv", context);
623+
const value = parseInput(externalFlagName, numberParser, input, input, "argv", context);
643624
return total + value;
644625
}, 0);
645626
}
646627
if ("variadic" in flag && flag.variadic) {
647628
if (flag.kind === "enum") {
648629
for (const input of inputs) {
649-
EnumValidationError.assertInputIsEnumValue(flag, input, input, "argv", config, externalFlagName);
630+
assertInputIsEnumValue(flag, input, input, "argv", config, externalFlagName);
650631
}
651632
return inputs;
652633
}
653634
return Promise.all(
654-
inputs.map((input) =>
655-
ArgumentParseError.parseInput(externalFlagName, flag.parse, input, input, "argv", context),
656-
),
635+
inputs.map((input) => parseInput(externalFlagName, flag.parse, input, input, "argv", context)),
657636
);
658637
}
659638
const input = inputs[0];
660639
if (flag.kind === "boolean") {
661-
return ArgumentParseError.parseInput(externalFlagName, looseBooleanParser, input, input, "argv", context);
640+
return parseInput(externalFlagName, looseBooleanParser, input, input, "argv", context);
662641
}
663642
if (flag.kind === "enum") {
664-
EnumValidationError.assertInputIsEnumValue(flag, input, input, "argv", config, externalFlagName);
643+
assertInputIsEnumValue(flag, input, input, "argv", config, externalFlagName);
665644
return input;
666645
}
667-
return ArgumentParseError.parseInput(externalFlagName, flag.parse, input, input, "argv", context);
646+
return parseInput(externalFlagName, flag.parse, input, input, "argv", context);
668647
}
669648

670649
/**
@@ -895,14 +874,7 @@ export function buildArgumentScanner<FLAGS extends BaseFlags, ARGS extends BaseA
895874
positionalValues_p = allSettledOrElse(
896875
positionalInputs.map(async (input, i) => {
897876
const placeholder = getPlaceholder(positional.parameter, i + 1);
898-
return ArgumentParseError.parseInput(
899-
placeholder,
900-
positional.parameter.parse,
901-
input,
902-
input,
903-
"argv",
904-
context,
905-
);
877+
return parseInput(placeholder, positional.parameter.parse, input, input, "argv", context);
906878
}),
907879
) as Promise<PromiseSettledOrElseResult<ARGS>>;
908880
} else {
@@ -912,7 +884,7 @@ export function buildArgumentScanner<FLAGS extends BaseFlags, ARGS extends BaseA
912884
const input = positionalInputs[i];
913885
if (typeof input !== "string") {
914886
if (typeof param.default === "string") {
915-
return ArgumentParseError.parseInput(
887+
return parseInput(
916888
placeholder,
917889
param.parse,
918890
param.default,
@@ -926,7 +898,7 @@ export function buildArgumentScanner<FLAGS extends BaseFlags, ARGS extends BaseA
926898
}
927899
throw new UnsatisfiedPositionalError(placeholder);
928900
}
929-
return ArgumentParseError.parseInput(placeholder, param.parse, input, input, "argv", context);
901+
return parseInput(placeholder, param.parse, input, input, "argv", context);
930902
}),
931903
) as Promise<PromiseSettledOrElseResult<ARGS>>;
932904
}

0 commit comments

Comments
 (0)