#!/usr/bin/env node
import { RestParser, RestRequest } from "rest-cli";
const usage = (errorNumber = 0) => {
console.error("Usage: ./bin/generate-test.mjs <instance> [requestName|requestNumber]");
process.exit(errorNumber);
}
/** @param {string} s */
const isInteger = (s) => Number.isInteger(Number(s));
/**
* Converts a REST client request object into a Hurl request.
*
* @param {RestRequest} request - The REST client request object to be converted.
* @return {Promise<string>} The converted Hurl request.
*/
const restCliRequest2Hurl = async (request) => {
let requestString = `${request.method} ${request.url}\n`;
request.headers.forEach((value, key) => requestString += `${key}: ${value}\n`);
requestString += request.body + '\n';
try {
const { response } = await request.request();
const responseString = "HTTP 200\n" + response.getBody();
return requestString + "\n" + responseString;
} catch (error) {
console.error(error);
return requestString + "\n";
}
}
/**
* Converts the entire file by iterating through the RestParser object and
* converting each request into an Hurl string using the restCliRequest2Hurl
* function.
*
* @param {RestParser} parser - The RestParser object that contains the requests to be converted.
* @return {Promise<string>} A promise that resolves to the Hurl string representation of all the requests.
*/
const convertWholeFile = async (parser) => {
const nb = parser.count;
let hurlString = "";
for (let i = 0; i < nb; i++) {
const request = await parser.get(i);
if (!request) { // Should not happen
console.error(`Request "${i}" not found.\nMaybe the examples.http file is wrong?`);
continue;
}
hurlString += await restCliRequest2Hurl(request) +
'\n\n';
}
return hurlString.trim();
}
///////////////////////////////////////////////////////////:
const [, , instanceName, requestName] = process.argv;
if (!instanceName) {
console.error("Instance name needed as a first paramater!");
usage(1);
}
if (process.argv.length > 4) {
console.error("Wrong number of parameters!");
usage(2);
}
// Get Response from examples.http file
const parser = new RestParser();
await parser.readFile(`./${instanceName}/examples.http`);
// Convert all requests
if (process.argv.length === 3) {
const hurlString = await convertWholeFile(parser);
console.log(hurlString);
process.exit(0);
}
const requestId = isInteger(requestName) ? Number(requestName) : requestName;
if (requestId === undefined) {
console.error("requestName needed as a second parameter (could be a string or an integer).");
usage(3);
}
const request = await parser.get(requestId);
if (request) {
console.log(await restCliRequest2Hurl(request));
} else {
console.error(`Request "${requestId}" not found.`);
usage(4);
}