This commit is contained in:
Ashita Prasad
2024-10-02 13:07:53 +05:30
parent 3eff5ca64a
commit 5b1f8fdbea
2 changed files with 590 additions and 710 deletions

View File

@ -1,45 +1,38 @@
import 'dart:core'; import 'dart:core';
import 'package:jinja/jinja.dart' as jj; import 'package:jinja/jinja.dart' as jj;
import 'package:apidash/consts.dart'; import 'package:apidash/consts.dart';
import 'package:apidash/utils/utils.dart' import 'package:apidash/utils/utils.dart' show getValidRequestUri;
show getValidRequestUri;
import 'package:apidash/models/models.dart'; import 'package:apidash/models/models.dart';
class RustHyperCodeGen { class RustHyperCodeGen {
final String kTemplateStart = """ final String kTemplateStart = """
{% if hasForm %}extern crate hyper_multipart_rfc7578 as hyper_multipart;{% endif %} {% if hasForm %}extern crate hyper_multipart_rfc7578 as hyper_multipart;
use hyper::{Body, Client, Request, Uri}; {% endif %}use hyper::{Body, Client, Request, Uri};
use hyper::client::HttpConnector; {% if isHttps %}use hyper_tls::HttpsConnector;
use hyper_tls::HttpsConnector; {% else %}use hyper::client::HttpConnector;
{% if hasForm %}use hyper_multipart::client::multipart;{% endif %} {% endif %}{% if hasForm %}use hyper_multipart::client::multipart;
{% if hasJsonBody %}use serde_json::json;{% endif %} {% endif %}{% if hasJsonBody %}use serde_json::json;
use tokio; {% endif %}use tokio;
#[tokio::main] #[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> { async fn main() -> Result<(), Box<dyn std::error::Error>> {
let https = HttpsConnector::new(); let http{% if isHttps %}s{% endif %} = Http{% if isHttps %}s{% endif %}Connector::new();
let client = Client::builder().build::<_, hyper::Body>(https); let client = Client::builder().build::<_, hyper::Body>(http{% if isHttps %}s{% endif %});
let url = "{{ url }}".parse::<Uri>().unwrap(); let url = "{{ url }}".parse::<Uri>().unwrap();
"""; """;
final String kTemplateMethod = """ final String kTemplateMethod = """
let reqBuilder = Request::builder() let req_builder = Request::builder()
.method("{{ method }}") .method("{{ method }}")
.uri(url) .uri(url)
"""; """;
final String kTemplateMethodNoHeadersButForm = """ final String kTemplateMethodNoHeadersButForm = """
let reqBuilder = Request::builder() let req_builder = Request::builder()
.method("{{ method }}") .method("{{ method }}")
.uri(url); .uri(url);
"""; """;
final String kTemplateHeaders = """ final String kTemplateHeaders = """
{% for key, val in headers %} {% for key, val in headers %}
.header("{{ key }}", "{{ val }}") .header("{{ key }}", "{{ val }}")
@ -51,7 +44,6 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
{% endfor %} {% endfor %}
"""; """;
final String kTemplateBody = """ final String kTemplateBody = """
.body(Body::from(r#"{{ body }}"#))?;\n .body(Body::from(r#"{{ body }}"#))?;\n
@ -67,11 +59,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
.body(Body::empty())?;\n .body(Body::empty())?;\n
"""; """;
final String kTemplateFormData = """
final String kTemplateFormData = """
let mut form = multipart::Form::default(); let mut form = multipart::Form::default();
{%- for field in fields_list %} {%- for field in fields_list %}
@ -82,12 +70,11 @@ final String kTemplateFormData = """
{%- endif %} {%- endif %}
{%- endfor %} {%- endfor %}
let req = form.set_body_convert::<Body, multipart::Body>(reqBuilder).unwrap(); let req = form.set_body_convert::<Body, multipart::Body>(req_builder).unwrap();
"""; """;
final String kTemplateEndForm = """
final String kTemplateEndForm = """
let res = client.request(req).await?; let res = client.request(req).await?;
let status = res.status(); let status = res.status();
let body_bytes = hyper::body::to_bytes(res).await?; let body_bytes = hyper::body::to_bytes(res).await?;
@ -100,7 +87,7 @@ final String kTemplateFormData = """
"""; """;
final String kTemplateRequestEnd = """ final String kTemplateRequestEnd = """
let res = client.request(reqBuilder).await?; let res = client.request(req_builder).await?;
let status = res.status(); let status = res.status();
let body_bytes = hyper::body::to_bytes(res).await?; let body_bytes = hyper::body::to_bytes(res).await?;
let body = String::from_utf8(body_bytes.to_vec())?; let body = String::from_utf8(body_bytes.to_vec())?;
@ -110,83 +97,76 @@ final String kTemplateFormData = """
"""; """;
final String kTemplateEnd = """
final String kTemplateEnd = """
Ok(()) Ok(())
} }
"""; """;
String? getCode(HttpRequestModel requestModel) { String? getCode(HttpRequestModel requestModel) {
try { try {
String result = ""; String result = "";
String url = requestModel.url; String url = requestModel.url;
var rec = getValidRequestUri(url, requestModel.enabledParams); var rec = getValidRequestUri(url, requestModel.enabledParams);
Uri? uri = rec.$1; Uri? uri = rec.$1;
if (uri != null) { if (uri != null) {
var headers = requestModel.enabledHeadersMap; var headers = requestModel.enabledHeadersMap;
result += jj.Template(kTemplateStart).render({ result += jj.Template(kTemplateStart).render({
"url": uri, "url": uri,
'hasJsonBody': requestModel.bodyContentType == ContentType.json, "isHttps": uri.scheme == "https" ? true : false,
'hasJsonBody': requestModel.hasJsonData,
'hasForm': requestModel.hasFormData, 'hasForm': requestModel.hasFormData,
}); });
if(requestModel.hasFormData && headers.isEmpty){
result += jj.Template(kTemplateMethodNoHeadersButForm).render({
"method": requestModel.method.name.toUpperCase(),
});
}else{
result += jj.Template(kTemplateMethod).render({
"method": requestModel.method.name.toUpperCase(),
});
if (requestModel.hasFormData && headers.isEmpty) {
result += jj.Template(kTemplateMethodNoHeadersButForm).render({
"method": requestModel.method.name.toUpperCase(),
});
} else {
result += jj.Template(kTemplateMethod).render({
"method": requestModel.method.name.toUpperCase(),
});
} }
// Add headers if available // Add headers if available
if (headers.isNotEmpty) { if (headers.isNotEmpty) {
if(requestModel.hasFormData){ if (requestModel.hasFormData) {
result += jj.Template(kTemplateHeadersFormData).render({"headers": headers}); result += jj.Template(kTemplateHeadersFormData)
}else{ .render({"headers": headers});
result += jj.Template(kTemplateHeaders).render({"headers": headers}); } else {
result +=
jj.Template(kTemplateHeaders).render({"headers": headers});
} }
} }
// Handle body (JSON or raw) // Handle body (JSON or raw)
var requestBody = requestModel.body; var requestBody = requestModel.body;
if (requestModel.hasFormData) { if (requestModel.hasFormData) {
result += jj.Template(kTemplateFormData).render({ result += jj.Template(kTemplateFormData).render({
"fields_list": requestModel.formDataMapList, "fields_list": requestModel.formDataMapList,
}); });
}else if (requestBody == "" || requestBody == null|| requestModel.method ==HTTPVerb.get || requestModel.method == HTTPVerb.head) { } else if (requestBody == "" ||
requestBody == null ||
requestModel.method == HTTPVerb.get ||
requestModel.method == HTTPVerb.head) {
result += kTemplateEmptyBody; result += kTemplateEmptyBody;
}else if(requestModel.hasJsonData){ } else if (requestModel.hasJsonData) {
result += jj.Template(kTemplateJsonBody).render({"body": requestBody}); result +=
jj.Template(kTemplateJsonBody).render({"body": requestBody});
}else if(requestModel.hasTextData){ } else if (requestModel.hasTextData) {
result += jj.Template(kTemplateBody).render({"body": requestBody}); result += jj.Template(kTemplateBody).render({"body": requestBody});
} }
// End request // End request
if(requestModel.hasFormData && requestModel.method!=HTTPVerb.get){
result+=kTemplateEndForm;
}else{
result+=kTemplateRequestEnd;
if (requestModel.hasFormData && requestModel.method != HTTPVerb.get) {
result += kTemplateEndForm;
} else {
result += kTemplateRequestEnd;
} }
result+=kTemplateEnd; result += kTemplateEnd;
} }
return result; return result;

File diff suppressed because it is too large Load Diff