You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
1.0 KiB
32 lines
1.0 KiB
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; |
|
}
|
|
|