From df8f20de86070e8f4a0a0f55bf9c87fbede42c9c Mon Sep 17 00:00:00 2001 From: Clasherzz Date: Fri, 20 Sep 2024 20:17:02 +0530 Subject: [PATCH] adding hyper rust library support --- lib/codegen/rust/hyper.dart | 173 ++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 lib/codegen/rust/hyper.dart diff --git a/lib/codegen/rust/hyper.dart b/lib/codegen/rust/hyper.dart new file mode 100644 index 00000000..d24caee8 --- /dev/null +++ b/lib/codegen/rust/hyper.dart @@ -0,0 +1,173 @@ +import 'dart:core'; +import 'package:jinja/jinja.dart' as jj; +import 'package:apidash/consts.dart'; +import 'package:apidash/utils/utils.dart' + show getValidRequestUri; +import 'package:apidash/models/models.dart'; + + +class RustHyperCodeGen { + final String kTemplateStart = """ +use hyper::{Body, Client, Request, Uri}; +use hyper::client::HttpConnector; +use hyper_tls::HttpsConnector; +use std::convert::TryInto; +{% if hasForm %}use reqwest::multipart;{% endif %} +{% if hasJsonBody %}use serde_json::json;{% endif %} +use tokio; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let https = HttpsConnector::new(); + let client = Client::builder().build::<_, hyper::Body>(https); + let url = "{{ url }}".parse::().unwrap(); + +"""; + + + final String kTemplateMethod = """ + let req = Request::builder() + .method("{{ method }}") + .uri(url) +"""; + + + + final String kTemplateHeaders = """ + {% for key, val in headers %} + .header("{{ key }}", "{{ val }}") + {% endfor %} +"""; + + + final String kTemplateBody = """ + + .body(Body::from(r#"{{ body }}"#))?;\n +"""; + + final String kTemplateJsonBody = """ + + .body(Body::from(json!({{ body }}).to_string()))?;\n +"""; + + final String kTemplateEmptyBody = """ + + .body(Body::empty())?;\n +"""; + + + + + +final String kTemplateFormData = """ + + let form = reqwest::multipart::Form::new() + {%- for field in fields_list %} + {%- if field.type == "file" %} + .part("{{ field.name }}", reqwest::multipart::Part::file(r"{{ field.value }}")?) + {%- else %} + .text("{{ field.name }}", "{{ field.value }}") + {%- endif %} + {%- if not loop.last %}.and({%- endif %} + {%- endfor %}; + + """; + + final String kTemplateEndReqwest = """ + let clientReqwest = reqwest::Client::new(); + let responseReqwest = clientReqwest + .post("{{url}}") + .multipart(form) + .send() + .await?; + + println!("Reqwest Status: {}", responseReqwest.status()); + let bodyReqwest = responseReqwest.text().await?; + println!("Reqwest Body: {}", bodyReqwest); + + +"""; + + final String kTemplateRequestEnd = """ + let res = client.request(req).await?; + let status = res.status(); + let body_bytes = hyper::body::to_bytes(res).await?; + let body = String::from_utf8(body_bytes.to_vec())?; + + println!("Response Status: {}", status); + println!("Response: {:?}", body); + +"""; + + + final String kTemplateEnd = """ + Ok(()) +} + +"""; + + + + + + + String? getCode(HttpRequestModel requestModel) { + try { + + String result = ""; + + String url = requestModel.url; + var rec = getValidRequestUri(url, requestModel.enabledParams); + Uri? uri = rec.$1; + + if (uri != null) { + + + result += jj.Template(kTemplateStart).render({ + "url": uri, + 'hasJsonBody': requestModel.bodyContentType == ContentType.json, + 'hasForm': requestModel.hasFormData, + }); + + + result += jj.Template(kTemplateMethod).render({ + "method": requestModel.method.name.toUpperCase(), + }); + + // Add headers if available + var headers = requestModel.enabledHeadersMap; + if (headers.isNotEmpty) { + result += jj.Template(kTemplateHeaders).render({"headers": headers}); + } + + // Handle body (JSON or raw) + var requestBody = requestModel.body; + if (requestModel.hasFormData) { + result += kTemplateEmptyBody; + result += jj.Template(kTemplateFormData).render({ + "fields_list": requestModel.formDataMapList, + }); + }else if (requestBody == "" || requestBody == null|| requestModel.method ==HTTPVerb.get) { + result += kTemplateEmptyBody; + }else if(requestModel.hasJsonData){ + result += jj.Template(kTemplateJsonBody).render({"body": requestBody}); + + }else if(requestModel.hasTextData){ + result += jj.Template(kTemplateBody).render({"body": requestBody}); + } + // End request + result += kTemplateRequestEnd; + if(requestModel.hasFormData && requestModel.method!=HTTPVerb.get){ + result+=jj.Template(kTemplateEndReqwest).render({ + "url": uri, + });; + } + result+=kTemplateEnd; + } + + return result; + } catch (e) { + return null; + } + } +}