-
Notifications
You must be signed in to change notification settings - Fork 995
/
parse-command.ts
44 lines (39 loc) · 1.21 KB
/
parse-command.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
import {NotEmptyArray} from './typings/common-types.js';
export function parseCommand(cmd: string) {
const extraSpacesStrippedCommand = cmd.replace(/\s{2,}/g, ' ');
const splitCommand = extraSpacesStrippedCommand.split(/\s+(?![^[]*]|[^<]*>)/);
const bregex = /\.*[\][<>]/g;
const firstCommand = splitCommand.shift();
if (!firstCommand) throw new Error(`No command found in: ${cmd}`);
const parsedCommand: ParsedCommand = {
cmd: firstCommand.replace(bregex, ''),
demanded: [],
optional: [],
};
splitCommand.forEach((cmd, i) => {
let variadic = false;
cmd = cmd.replace(/\s/g, '');
if (/\.+[\]>]/.test(cmd) && i === splitCommand.length - 1) variadic = true;
if (/^\[/.test(cmd)) {
parsedCommand.optional.push({
cmd: cmd.replace(bregex, '').split('|') as NotEmptyArray<string>,
variadic,
});
} else {
parsedCommand.demanded.push({
cmd: cmd.replace(bregex, '').split('|') as NotEmptyArray<string>,
variadic,
});
}
});
return parsedCommand;
}
export interface ParsedCommand {
cmd: string;
demanded: Positional[];
optional: Positional[];
}
export interface Positional {
cmd: NotEmptyArray<string>;
variadic: boolean;
}