@hoppscotch/httpsnippet
Version:
HTTP Request snippet generator for *most* languages
278 lines • 11.4 kB
JavaScript
;
/**
* @description
* HTTP code snippet generator for Rust using reqwest
*
* @author
* @Benjscho
*
* for any questions or issues regarding the generated code snippet, please open an issue mentioning the author.
*/
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
exports.__esModule = true;
exports.reqwest = void 0;
var code_builder_1 = require("../../../helpers/code-builder");
var helpers_1 = require("../helpers");
exports.reqwest = {
info: {
key: 'reqwest',
title: 'reqwest',
link: 'https://docs.rs/reqwest/latest/reqwest/',
description: 'reqwest HTTP library'
},
convert: function (_a, options) {
var e_1, _b, e_2, _c, e_3, _d, e_4, _e, e_5, _f;
var queryObj = _a.queryObj, url = _a.url, postData = _a.postData, allHeaders = _a.allHeaders, method = _a.method;
var opts = __assign({ indent: ' ', pretty: true }, options);
var indentLevel = 0;
// start snippet
var _g = new code_builder_1.CodeBuilder({ indent: opts.indent }), push = _g.push, blank = _g.blank, join = _g.join, pushToLast = _g.pushToLast, unshift = _g.unshift;
// import reqwest
push('use reqwest;', indentLevel);
blank();
// start async main for tokio
push('#[tokio::main]', indentLevel);
push('pub async fn main() {', indentLevel);
indentLevel += 1;
// add url
push("let url = \"".concat(url, "\";"), indentLevel);
blank();
var hasQuery = false;
// construct query string
if (Object.keys(queryObj).length) {
hasQuery = true;
push('let querystring = [', indentLevel);
indentLevel += 1;
try {
for (var _h = __values(Object.entries(queryObj)), _j = _h.next(); !_j.done; _j = _h.next()) {
var _k = __read(_j.value, 2), key = _k[0], value = _k[1];
push("(\"".concat(key, "\", \"").concat(value, "\"),"), indentLevel);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_j && !_j.done && (_b = _h["return"])) _b.call(_h);
}
finally { if (e_1) throw e_1.error; }
}
indentLevel -= 1;
push('];', indentLevel);
blank();
}
// construct payload
var payload = {};
var files = {};
var hasFiles = false;
var hasForm = false;
var hasBody = false;
var jsonPayload = false;
var isMultipart = false;
switch (postData.mimeType) {
case 'application/json':
if (postData.jsonObj) {
push("let payload = ".concat((0, helpers_1.literalRepresentation)(postData.jsonObj, opts, indentLevel), ";"), indentLevel);
}
jsonPayload = true;
break;
case 'multipart/form-data':
isMultipart = true;
if (!postData.params) {
push("let form = reqwest::multipart::Form::new()", indentLevel);
push(".text(\"\", \"\");", indentLevel + 1);
break;
}
payload = {};
postData.params.forEach(function (p) {
if (p.fileName) {
files[p.name] = p.fileName;
hasFiles = true;
}
else {
payload[p.name] = p.value;
}
});
if (hasFiles) {
try {
for (var fileToPartString_1 = __values(fileToPartString), fileToPartString_1_1 = fileToPartString_1.next(); !fileToPartString_1_1.done; fileToPartString_1_1 = fileToPartString_1.next()) {
var line = fileToPartString_1_1.value;
push(line, indentLevel);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (fileToPartString_1_1 && !fileToPartString_1_1.done && (_c = fileToPartString_1["return"])) _c.call(fileToPartString_1);
}
finally { if (e_2) throw e_2.error; }
}
blank();
}
push("let form = reqwest::multipart::Form::new()", indentLevel);
try {
for (var _l = __values(Object.entries(files)), _m = _l.next(); !_m.done; _m = _l.next()) {
var _o = __read(_m.value, 2), name = _o[0], fileName = _o[1];
push(".part(\"".concat(name, "\", file_to_part(\"").concat(fileName, "\").await)"), indentLevel + 1);
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_m && !_m.done && (_d = _l["return"])) _d.call(_l);
}
finally { if (e_3) throw e_3.error; }
}
try {
for (var _p = __values(Object.entries(payload)), _q = _p.next(); !_q.done; _q = _p.next()) {
var _r = __read(_q.value, 2), name = _r[0], value = _r[1];
push(".text(\"".concat(name, "\", \"").concat(value, "\")"), indentLevel + 1);
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (_q && !_q.done && (_e = _p["return"])) _e.call(_p);
}
finally { if (e_4) throw e_4.error; }
}
pushToLast(';');
break;
default: {
if (postData.mimeType === 'application/x-www-form-urlencoded' && postData.paramsObj) {
push("let payload = ".concat((0, helpers_1.literalRepresentation)(postData.paramsObj, opts, indentLevel), ";"), indentLevel);
hasForm = true;
break;
}
if (postData.text) {
push("let payload = ".concat((0, helpers_1.literalRepresentation)(postData.text, opts, indentLevel), ";"), indentLevel);
hasBody = true;
break;
}
}
}
if (hasForm || jsonPayload || hasBody) {
unshift("use serde_json::json;");
blank();
}
var hasHeaders = false;
// construct headers
if (Object.keys(allHeaders).length) {
hasHeaders = true;
push('let mut headers = reqwest::header::HeaderMap::new();', indentLevel);
try {
for (var _s = __values(Object.entries(allHeaders)), _t = _s.next(); !_t.done; _t = _s.next()) {
var _u = __read(_t.value, 2), key = _u[0], value = _u[1];
// Skip setting content-type if there is a file, as this header will
// cause the request to hang, and reqwest will set it for us.
if (key.toLowerCase() === 'content-type' && isMultipart) {
continue;
}
push("headers.insert(\"".concat(key, "\", ").concat((0, helpers_1.literalRepresentation)(value, opts), ".parse().unwrap());"), indentLevel);
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (_t && !_t.done && (_f = _s["return"])) _f.call(_s);
}
finally { if (e_5) throw e_5.error; }
}
blank();
}
// construct client
push('let client = reqwest::Client::new();', indentLevel);
// construct query
switch (method) {
case 'POST':
push("let response = client.post(url)", indentLevel);
break;
case 'GET':
push("let response = client.get(url)", indentLevel);
break;
default: {
push("let response = client.request(reqwest::Method::from_str(\"".concat(method, "\").unwrap(), url)"), indentLevel);
unshift("use std::str::FromStr;");
break;
}
}
if (hasQuery) {
push(".query(&querystring)", indentLevel + 1);
}
if (isMultipart) {
push(".multipart(form)", indentLevel + 1);
}
if (hasHeaders) {
push(".headers(headers)", indentLevel + 1);
}
if (jsonPayload) {
push(".json(&payload)", indentLevel + 1);
}
if (hasForm) {
push(".form(&payload)", indentLevel + 1);
}
if (hasBody) {
push(".body(payload)", indentLevel + 1);
}
// send query
push('.send()', indentLevel + 1);
push('.await;', indentLevel + 1);
blank();
// Print response
push('let results = response.unwrap()', indentLevel);
push('.json::<serde_json::Value>()', indentLevel + 1);
push('.await', indentLevel + 1);
push('.unwrap();', indentLevel + 1);
blank();
push('dbg!(results);', indentLevel);
push('}\n');
return join();
}
};
var fileToPartString = [
"async fn file_to_part(file_name: &'static str) -> reqwest::multipart::Part {",
" let file = tokio::fs::File::open(file_name).await.unwrap();",
" let stream = tokio_util::codec::FramedRead::new(file, tokio_util::codec::BytesCodec::new());",
" let body = reqwest::Body::wrap_stream(stream);",
" reqwest::multipart::Part::stream(body)",
" .file_name(file_name)",
" .mime_str(\"text/plain\").unwrap()",
"}",
];
//# sourceMappingURL=client.js.map