diff --git a/lib/codegen/rust/reqwest.dart b/lib/codegen/rust/reqwest.dart index 6406fba8..9c93f697 100644 --- a/lib/codegen/rust/reqwest.dart +++ b/lib/codegen/rust/reqwest.dart @@ -3,91 +3,80 @@ import 'dart:convert'; import 'package:jinja/jinja.dart' as jj; import 'package:apidash/consts.dart'; import 'package:apidash/utils/utils.dart' - show getNewUuid, getValidRequestUri, padMultilineString, stripUriParams; + show getValidRequestUri, stripUriParams; import 'package:apidash/models/models.dart' show RequestModel; class RustReqwestCodeGen { final String kTemplateStart = """fn main() -> Result<(), Box> { - let client = reqwest::blocking::Client::new(); - let url = "{{url}}"; + let client = reqwest::blocking::Client::new(); + let url = "{{url}}"; """; - String kTemplateParams = """ - - let params = {{params}}; - -"""; - int kParamsPadding = 9; + String kTemplateParams = """\n .query(&{{params}})"""; String kTemplateBody = """ - let payload = b"{{body}}"; + let payload = b"{{body}}"; """; String kTemplateJson = """ - let payload = serde_json::json!({{body}}); + let payload = serde_json::json!({{body}}); """; - String kTemplateHeaders = """ - - let header_str = r#"{{headers}}"#; - let headers_map: std::collections::HashMap<&str, &str> = serde_json::from_str(header_str)?; // Deserialize as &str - let mut headers = reqwest::header::HeaderMap::new(); - for (key, val) in headers_map { - headers.insert(key, reqwest::header::HeaderValue::from_str(val)?); - } - -"""; - - int kHeadersPadding = 10; + String kTemplateHeaders = + """\n {% for key, val in headers -%}.header("{{key}}", "{{val}}"){% if not loop.last %}{{ '\n ' }}{% endif %}{%- endfor -%}"""; String kTemplateRequest = """ - let response = client.{{method}}(url) + let response = client\n .{{method}}(url) """; final String kStringFormDataBody = r''' - #[derive(serde::Deserialize)] - struct FormDataItem { - name: String, - value: String, - field_type: String, - } - let data_str = r#"{{fields_list}}"#; - let form_data_items: Vec = serde_json::from_str(data_str).unwrap(); + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + {%- for formitem in fields_list %} + FormDataItem { + {%- for key, val in formitem %} + {% if key == "type" %}field_type: "{{ val }}".to_string(),{% else %}{{ key }}: "{{ val }}".to_string(),{% endif %} + {%- endfor %} + }, + {%- endfor %} + ]; - let mut form = reqwest::blocking::multipart::Form::new(); - - for item in form_data_items { - if item.field_type == "text" { - form = form.text(item.name, item.value); - } else if item.field_type == "file" { - form = form.file(item.name, &item.value)?; - } - } + let mut form = reqwest::blocking::multipart::Form::new(); + + for item in form_data_items { + if item.field_type == "text" { + form = form.text(item.name, item.value); + } else if item.field_type == "file" { + form = form.file(item.name, &item.value)?; + } + } '''; - String kStringRequestParams = """\n .query(¶ms)"""; + String kStringRequestBody = """\n .body(payload.to_vec())"""; - String kStringRequestBody = """\n .body(payload.to_vec())"""; + String kStringRequestJson = """\n .json(&payload)"""; - String kStringRequestJson = """\n .json(&payload)"""; + String kStringRequestForm = """\n .multipart(form)"""; - String kStringRequestForm = """\n .multipart(form)"""; + final String kStringRequestEnd = """\n .send()?; - String kStringRequestHeaders = """\n .headers(headers)"""; + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); - final String kStringRequestEnd = """\n .send()?; - - println!("Status Code: {}", response.status()); - println!("Response Body: {}", response.text()?); - - Ok(()) + Ok(()) } """; @@ -97,11 +86,8 @@ class RustReqwestCodeGen { ) { try { String result = ""; - bool hasQuery = false; - bool hasHeaders = false; bool hasBody = false; bool hasJsonBody = false; - String uuid = getNewUuid(); String url = requestModel.url; if (!url.contains("://") && url.isNotEmpty) { @@ -121,20 +107,6 @@ class RustReqwestCodeGen { 'isJson': requestModel.requestBodyContentType == ContentType.json }); - if (uri.hasQuery) { - var params = uri.queryParameters; - if (params.isNotEmpty) { - hasQuery = true; - var tupleStrings = params.entries - .map((entry) => '("${entry.key}", "${entry.value}")') - .toList(); - var paramsString = "[${tupleStrings.join(', ')}]"; - var templateParams = jj.Template(kTemplateParams); - paramsString = padMultilineString(paramsString, kParamsPadding); - result += templateParams.render({"params": paramsString}); - } - } - var method = requestModel.method; var requestBody = requestModel.requestBody; if (kMethodsWithBody.contains(method) && requestBody != null) { @@ -152,26 +124,11 @@ class RustReqwestCodeGen { } } - var headersList = requestModel.enabledRequestHeaders; - if (headersList != null || hasBody) { - var headers = requestModel.enabledHeadersMap; - if (headers.isNotEmpty || hasBody) { - hasHeaders = true; - if (hasBody) { - headers[HttpHeaders.contentTypeHeader] = - requestModel.requestBodyContentType.header; - } - var headersString = kEncoder.convert(headers); - headersString = padMultilineString(headersString, kHeadersPadding); - var templateHeaders = jj.Template(kTemplateHeaders); - result += templateHeaders.render({"headers": headersString}); - } - } if (requestModel.isFormDataRequest) { var formDataBodyData = jj.Template(kStringFormDataBody); result += formDataBodyData.render( { - "fields_list": json.encode(requestModel.formDataMapList), + "fields_list": requestModel.formDataMapList, }, ); } @@ -180,8 +137,30 @@ class RustReqwestCodeGen { "method": method.name.toLowerCase(), }); - if (hasQuery) { - result += kStringRequestParams; + if (uri.hasQuery) { + var params = uri.queryParameters; + if (params.isNotEmpty) { + var tupleStrings = params.entries + .map((entry) => '("${entry.key}", "${entry.value}")') + .toList(); + var paramsString = "[${tupleStrings.join(', ')}]"; + var templateParams = jj.Template(kTemplateParams); + result += templateParams.render({"params": paramsString}); + } + } + + var headersList = requestModel.enabledRequestHeaders; + if (headersList != null) { + var headers = requestModel.enabledHeadersMap; + if (headers.isNotEmpty) { + if (hasBody) { + headers[HttpHeaders.contentTypeHeader] = + requestModel.requestBodyContentType.header; + } + + var templateHeaders = jj.Template(kTemplateHeaders); + result += templateHeaders.render({"headers": headers}); + } } if (hasBody && !requestModel.isFormDataRequest) { @@ -196,10 +175,6 @@ class RustReqwestCodeGen { result += kStringRequestForm; } - if (hasHeaders) { - result += kStringRequestHeaders; - } - result += kStringRequestEnd; } return result;