summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas <andreas@tabaro.de>2020-04-06 15:27:10 +0200
committerGitHub <noreply@github.com>2020-04-06 09:27:10 -0400
commit703c0b7c172c57353ed61b16966c4ff7072d47f3 (patch)
treea26f222e2053703771a49d98cc9f43d8a91aebad
parent0ea9562933874526e84e39eaff675854cbe8690b (diff)
feat(std/flags): pass key and value to unknown (#4637)
-rw-r--r--std/flags/mod.ts8
-rwxr-xr-xstd/flags/unknown_test.ts40
2 files changed, 29 insertions, 19 deletions
diff --git a/std/flags/mod.ts b/std/flags/mod.ts
index b334cb5b8..3afaf111f 100644
--- a/std/flags/mod.ts
+++ b/std/flags/mod.ts
@@ -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;
diff --git a/std/flags/unknown_test.ts b/std/flags/unknown_test.ts
index 90c638b67..0d822144d 100755
--- a/std/flags/unknown_test.ts
+++ b/std/flags/unknown_test.ts
@@ -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"],
_: [],