0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-03 09:31:22 -05:00

feat(std/flags): pass key and value to unknown (#4637)

This commit is contained in:
Andreas 2020-04-06 15:27:10 +02:00 committed by GitHub
parent 0ea9562933
commit 703c0b7c17
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 19 deletions

View file

@ -51,13 +51,13 @@ export interface ArgParsingOptions {
/** A function which is invoked with a command line parameter not defined in
* the `options` configuration object. If the function returns `false`, the
* unknown option is not added to `parsedArgs`. */
unknown?: (i: unknown) => unknown;
unknown?: (arg: string, key?: string, value?: unknown) => unknown;
}
interface Flags {
bools: Record<string, boolean>;
strings: Record<string, boolean>;
unknownFn: (i: unknown) => unknown;
unknownFn: (arg: string, key?: string, value?: unknown) => unknown;
allBools: boolean;
}
@ -107,7 +107,7 @@ export function parse(
default: defaults = {},
stopEarly = false,
string = [],
unknown = (i: unknown): unknown => i,
unknown = (i: string): unknown => i,
}: ArgParsingOptions = {}
): Args {
const flags: Flags = {
@ -198,7 +198,7 @@ export function parse(
arg: string | undefined = undefined
): void {
if (arg && flags.unknownFn && !argDefined(key, arg)) {
if (flags.unknownFn(arg) === false) return;
if (flags.unknownFn(arg, key, val) === false) return;
}
const value = !get(flags.strings, key) && isNumber(val) ? Number(val) : val;

View file

@ -4,12 +4,12 @@ import { parse } from "./mod.ts";
Deno.test(function booleanAndAliasIsNotUnknown(): void {
const unknown: unknown[] = [];
function unknownFn(arg: unknown): boolean {
unknown.push(arg);
function unknownFn(arg: string, k?: string, v?: unknown): boolean {
unknown.push({ arg, k, v });
return false;
}
const aliased = ["-h", "true", "--derp", "true"];
const regular = ["--herp", "true", "-d", "true"];
const regular = ["--herp", "true", "-d", "false"];
const opts = {
alias: { h: "herp" },
boolean: "h",
@ -18,20 +18,27 @@ Deno.test(function booleanAndAliasIsNotUnknown(): void {
parse(aliased, opts);
parse(regular, opts);
assertEquals(unknown, ["--derp", "-d"]);
assertEquals(unknown, [
{ arg: "--derp", k: "derp", v: "true" },
{ arg: "-d", k: "d", v: "false" },
]);
});
Deno.test(function flagBooleanTrueAnyDoubleHyphenArgumentIsNotUnknown(): void {
const unknown: unknown[] = [];
function unknownFn(arg: unknown): boolean {
unknown.push(arg);
function unknownFn(arg: string, k?: string, v?: unknown): boolean {
unknown.push({ arg, k, v });
return false;
}
const argv = parse(["--honk", "--tacos=good", "cow", "-p", "55"], {
boolean: true,
unknown: unknownFn,
});
assertEquals(unknown, ["--tacos=good", "cow", "-p"]);
assertEquals(unknown, [
{ arg: "--tacos=good", k: "tacos", v: "good" },
{ arg: "cow", k: undefined, v: undefined },
{ arg: "-p", k: "p", v: "55" },
]);
assertEquals(argv, {
honk: true,
_: [],
@ -40,8 +47,8 @@ Deno.test(function flagBooleanTrueAnyDoubleHyphenArgumentIsNotUnknown(): void {
Deno.test(function stringAndAliasIsNotUnkown(): void {
const unknown: unknown[] = [];
function unknownFn(arg: unknown): boolean {
unknown.push(arg);
function unknownFn(arg: string, k?: string, v?: unknown): boolean {
unknown.push({ arg, k, v });
return false;
}
const aliased = ["-h", "hello", "--derp", "goodbye"];
@ -54,13 +61,16 @@ Deno.test(function stringAndAliasIsNotUnkown(): void {
parse(aliased, opts);
parse(regular, opts);
assertEquals(unknown, ["--derp", "-d"]);
assertEquals(unknown, [
{ arg: "--derp", k: "derp", v: "goodbye" },
{ arg: "-d", k: "d", v: "moon" },
]);
});
Deno.test(function defaultAndAliasIsNotUnknown(): void {
const unknown: unknown[] = [];
function unknownFn(arg: unknown): boolean {
unknown.push(arg);
function unknownFn(arg: string, k?: string, v?: unknown): boolean {
unknown.push({ arg, k, v });
return false;
}
const aliased = ["-h", "hello"];
@ -78,8 +88,8 @@ Deno.test(function defaultAndAliasIsNotUnknown(): void {
Deno.test(function valueFollowingDoubleHyphenIsNotUnknown(): void {
const unknown: unknown[] = [];
function unknownFn(arg: unknown): boolean {
unknown.push(arg);
function unknownFn(arg: string, k?: string, v?: unknown): boolean {
unknown.push({ arg, k, v });
return false;
}
const aliased = ["--bad", "--", "good", "arg"];
@ -89,7 +99,7 @@ Deno.test(function valueFollowingDoubleHyphenIsNotUnknown(): void {
};
const argv = parse(aliased, opts);
assertEquals(unknown, ["--bad"]);
assertEquals(unknown, [{ arg: "--bad", k: "bad", v: true }]);
assertEquals(argv, {
"--": ["good", "arg"],
_: [],