| export function parseCommand(cmd) { | |
| 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 = { | |
| 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('|'), | |
| variadic, | |
| }); | |
| } | |
| else { | |
| parsedCommand.demanded.push({ | |
| cmd: cmd.replace(bregex, '').split('|'), | |
| variadic, | |
| }); | |
| } | |
| }); | |
| return parsedCommand; | |
| } | |