-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcli.parse_flags.ts
60 lines (52 loc) · 1.78 KB
/
cli.parse_flags.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { error } from "./cli.output";
let __REGISTERED_FLAGS = new Map();
// TODO(tl): add advanced command line features.
type FlagOptions = {
standalone?: boolean,
mustBeWith?: string,
}
function registerFlag<T extends "boolean" | "string" | "float" | "integer",
U = T extends "boolean" ? boolean : T extends "string" ? string : number>(flagname: string, type: T, handler: (arg: U) => void, options?: FlagOptions) {
__REGISTERED_FLAGS.set(flagname, { type, handler, options });
}
function parseCommandLineValue(value: string, type: "boolean" | "string" | "float" | "integer" = "string") {
let parsedValue;
switch (type) {
case "boolean":
parsedValue = value === "" ? true : value === "true";
break;
case "integer":
parsedValue = parseInt(value);
break;
case "float":
parsedValue = parseFloat(value);
break;
case "string":
default:
parsedValue = value;
break;
}
return parsedValue;
}
function parseCommandLine(args: string[]) {
const flagParser = /--([\w-]+)=*(.*)/gm;
let files: string[] = [];
args.forEach(arg => {
const matches = flagParser.exec(arg);
if (matches) {
const [, flagname, value] = matches;
const registeredFlag = __REGISTERED_FLAGS.get(flagname);
if (registeredFlag) {
let parsedValue = parseCommandLineValue(value, registeredFlag.type);
registeredFlag.handler(parsedValue);
} else {
error(`Unregistered flag: ${flagname}`);
}
} else {
files.push(arg);
}
flagParser.lastIndex = 0;
});
return files;
}
export { registerFlag, parseCommandLine };