Skip to content

Commit 48d4bef

Browse files
committed
Added curl rust code generator
1 parent e20ffbb commit 48d4bef

File tree

4 files changed

+1142
-114
lines changed

4 files changed

+1142
-114
lines changed

lib/codegen/codegen.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import 'package:apidash/codegen/rust/curl-rust.dart';
1+
import 'package:apidash/codegen/rust/curl_rust.dart';
22
import 'package:apidash/models/models.dart' show RequestModel;
33
import 'package:apidash/consts.dart';
44
import 'package:apidash/utils/utils.dart' show getNewUuid;

lib/codegen/rust/curl-rust.dart

Lines changed: 0 additions & 113 deletions
This file was deleted.

lib/codegen/rust/curl_rust.dart

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
import 'package:jinja/jinja.dart' as jj;
2+
import 'package:apidash/utils/utils.dart' show getValidRequestUri, requestModelToHARJsonRequest;
3+
import 'package:apidash/models/models.dart' show RequestModel;
4+
import 'package:apidash/consts.dart';
5+
6+
class RustCurlCodeGen {
7+
final String kTemplateStart = """use curl::easy::Easy;
8+
{% if hasJsonBody %}use serde_json::json;
9+
{% endif %}{% if hasHeaders %}use curl::easy::List;
10+
{% endif %}
11+
fn main() {
12+
let mut easy = Easy::new();
13+
let mut data = Vec::new();
14+
15+
""";
16+
17+
String kTemplateUrl = """
18+
easy.url("{{url}}").unwrap();
19+
""";
20+
21+
String kTemplateMethod = """
22+
{% if method == 'get' or method == 'post' or method == 'put' %}
23+
easy.{{ method }}(true).unwrap();
24+
{% elif method == 'delete' %}
25+
easy.custom_request("DELETE").unwrap();
26+
{% elif method == 'patch' %}
27+
easy.custom_request("PATCH").unwrap();
28+
{% elif method == 'head' %}
29+
easy.nobody(true).unwrap();
30+
{% endif %}
31+
32+
""";
33+
34+
String kTemplateRawBody ="""
35+
easy.post_fields_copy(r#"{{body}}"#.as_bytes()).unwrap();
36+
37+
38+
""";
39+
40+
String kTemplateJsonBody ="""
41+
easy.post_fields_copy(json!({{body}}).to_string().as_bytes()).unwrap();
42+
43+
44+
""";
45+
46+
String kTemplateFormData = """
47+
let mut form = curl::easy::Form::new();
48+
{% for field in fields %}
49+
form.part("{{field.name}}")
50+
{% if field.type == "file" %}.file("{{field.value}}"){% else %}.contents(b"{{field.value}}"){% endif %}
51+
.add();
52+
{% endfor %}
53+
easy.httppost(form);
54+
""";
55+
56+
String kTemplateHeader = """
57+
{% if headers %}let mut list = List::new();{% for header, value in headers %}
58+
list.append("{{header}}: {{value}}");{% endfor %}
59+
easy.http_headers(list).unwrap();
60+
{% endif %}
61+
62+
""";
63+
64+
final String kTemplateEnd = """
65+
{
66+
let mut transfer = easy.transfer();
67+
transfer.write_function(|new_data| {
68+
data.extend_from_slice(new_data);
69+
Ok(new_data.len())
70+
}).unwrap();
71+
transfer.perform().unwrap();
72+
}
73+
74+
let response_body = String::from_utf8_lossy(&data);
75+
76+
println!("Response body:{}", response_body);
77+
println!("Response code: {}", easy.response_code().unwrap());
78+
}""";
79+
80+
String? getCode(RequestModel requestModel) {
81+
try {
82+
String result = "";
83+
var requestBody = requestModel.requestBody;
84+
85+
String url = requestModel.url;
86+
87+
result += jj.Template(kTemplateStart).render({
88+
"hasJsonBody": requestModel.hasJsonData,
89+
"hasHeaders": requestModel.enabledRequestHeaders != null || requestModel.hasBody
90+
});
91+
92+
var rec = getValidRequestUri(
93+
url,
94+
requestModel.enabledRequestParams,
95+
);
96+
97+
Uri? uri = rec.$1;
98+
var harJson =
99+
requestModelToHARJsonRequest(requestModel, useEnabled: true);
100+
101+
var templateUrl = jj.Template(kTemplateUrl);
102+
result += templateUrl.render({"url": harJson["url"]});
103+
104+
var methodTemplate = jj.Template(kTemplateMethod);
105+
result += methodTemplate.render({"method": requestModel.method.name});
106+
107+
if (uri != null) {
108+
if (requestModel.hasTextData) {
109+
var templateBody = jj.Template(kTemplateRawBody);
110+
result += templateBody.render({"body": requestBody});
111+
} else if (requestModel.hasJsonData) {
112+
var templateBody = jj.Template(kTemplateJsonBody);
113+
result += templateBody.render({"body": requestBody});
114+
} else if (requestModel.hasFormData) {
115+
var templateFormData = jj.Template(kTemplateFormData);
116+
result += templateFormData.render({
117+
"fields": requestModel.formDataMapList,
118+
});
119+
}
120+
121+
var headersList = requestModel.enabledRequestHeaders;
122+
if (headersList != null || requestModel.hasBody) {
123+
var headers = requestModel.enabledHeadersMap;
124+
if (requestModel.hasJsonData || requestModel.hasTextData) {
125+
headers.putIfAbsent(kHeaderContentType,
126+
() => requestModel.requestBodyContentType.header);
127+
}
128+
if (headers.isNotEmpty) {
129+
var templateHeader = jj.Template(kTemplateHeader);
130+
result += templateHeader.render({
131+
"headers": headers,
132+
});
133+
}
134+
}
135+
136+
result += kTemplateEnd;
137+
}
138+
139+
return result;
140+
} catch (e) {
141+
return null;
142+
}
143+
}
144+
}

0 commit comments

Comments
 (0)