2020-07-23 22:29:36 +00:00
|
|
|
export interface ParsedCommand {
|
|
|
|
command?: string;
|
|
|
|
|
|
|
|
payload: {[key: string]: string}[]
|
|
|
|
switches: string[]
|
|
|
|
}
|
|
|
|
|
|
|
|
function unescapeCommandValue(value: string) : string {
|
|
|
|
let result = "", index = 0, lastIndex = 0;
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
index = value.indexOf('\\', lastIndex);
|
|
|
|
if(index === -1 || index >= value.length + 1)
|
|
|
|
break;
|
|
|
|
|
|
|
|
let replace;
|
|
|
|
switch (value.charAt(index + 1)) {
|
|
|
|
case 's': replace = ' '; break;
|
|
|
|
case '/': replace = '/'; break;
|
|
|
|
case 'p': replace = '|'; break;
|
|
|
|
case 'b': replace = '\b'; break;
|
|
|
|
case 'f': replace = '\f'; break;
|
|
|
|
case 'n': replace = '\n'; break;
|
|
|
|
case 'r': replace = '\r'; break;
|
|
|
|
case 't': replace = '\t'; break;
|
|
|
|
case 'a': replace = '\x07'; break;
|
|
|
|
case 'v': replace = '\x0B'; break;
|
|
|
|
case '\\': replace = '\\'; break;
|
|
|
|
default:
|
|
|
|
lastIndex = index + 1;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
result += value.substring(lastIndex, index) + replace;
|
|
|
|
lastIndex = index + 2;
|
2020-01-30 23:54:00 +00:00
|
|
|
}
|
2020-07-23 22:29:36 +00:00
|
|
|
|
|
|
|
return result + value.substring(lastIndex);
|
|
|
|
}
|
|
|
|
|
|
|
|
const escapeCharacterMap = {
|
|
|
|
"\\": "\\",
|
|
|
|
" ": "s",
|
|
|
|
"/": "/",
|
|
|
|
"|": "p",
|
|
|
|
"\b": "b",
|
|
|
|
"\f": "f",
|
|
|
|
"\n": "n",
|
|
|
|
"\r": "r",
|
|
|
|
"\t": "t",
|
|
|
|
"\x07": "a",
|
|
|
|
"\x0B": "b"
|
|
|
|
};
|
|
|
|
|
2020-08-10 12:41:34 +00:00
|
|
|
const escapeCommandValue = (value: string) => value.replace(/[\\ \/|\b\f\n\r\t\x07]/g, value => "\\" + escapeCharacterMap[value]);
|
2020-07-23 22:29:36 +00:00
|
|
|
|
|
|
|
export function parseCommand(command: string): ParsedCommand {
|
|
|
|
const parts = command.split("|").map(element => element.split(" ").map(e => e.trim()).filter(e => !!e));
|
|
|
|
|
|
|
|
let cmd;
|
|
|
|
if(parts[0][0].indexOf("=") === -1)
|
|
|
|
cmd = parts[0].pop_front();
|
|
|
|
|
|
|
|
let switches = [];
|
|
|
|
let payloads = [];
|
|
|
|
parts.forEach(element => {
|
|
|
|
const payload = {};
|
|
|
|
for(const keyValue of element) {
|
|
|
|
if(keyValue[0] === '-') {
|
|
|
|
switches.push(keyValue.substring(1));
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
const separator = keyValue.indexOf('=');
|
|
|
|
if(separator === -1)
|
|
|
|
payload[keyValue] = undefined;
|
|
|
|
else
|
|
|
|
payload[keyValue.substring(0, separator)] = unescapeCommandValue(keyValue.substring(separator + 1));
|
|
|
|
}
|
|
|
|
|
|
|
|
payloads.push(payload)
|
|
|
|
});
|
|
|
|
|
|
|
|
return {
|
|
|
|
command: cmd,
|
|
|
|
payload: payloads,
|
|
|
|
switches: switches
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export function buildCommand(data: any | any[], switches?: string[], command?: string) {
|
|
|
|
let result = "";
|
|
|
|
|
|
|
|
for(const payload of Array.isArray(data) ? data : [data]) {
|
|
|
|
result += " |";
|
|
|
|
for(const key of Object.keys(payload)) {
|
|
|
|
result += " " + key;
|
|
|
|
if(payload[key] !== undefined && payload[key] !== null)
|
|
|
|
result += " " + key + "=" + escapeCommandValue(payload[key].toString());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(switches?.length)
|
|
|
|
result += " " + switches.map(e => "-" + e).join(" ");
|
|
|
|
|
|
|
|
return command ? command + result.substring(2) : result.substring(3);
|
2020-01-30 23:54:00 +00:00
|
|
|
}
|