Merge pull request #788 from badnikhil/resolve-issue-697

updated rust codegen
This commit is contained in:
Ankit Mahato
2025-04-10 04:46:54 +05:30
committed by GitHub
2 changed files with 87 additions and 66 deletions

View File

@ -5,6 +5,9 @@ import 'package:jinja/jinja.dart' as jj;
import '../../utils/utils.dart'; import '../../utils/utils.dart';
class RustUreqCodeGen { class RustUreqCodeGen {
final String kJsonImport = """
use serde_json::json;
""";
final String kTemplateStart = """ final String kTemplateStart = """
{%- if isFormDataRequest -%} {%- if isFormDataRequest -%}
use std::io::Read; use std::io::Read;
@ -23,14 +26,13 @@ fn main() -> Result<(), ureq::Error> {
"""; """;
String kTemplateJson = """ String kTemplateJson = """\n
let payload = json!({{body}});
let payload = ureq::json!({{body}});
"""; """;
String kTemplateHeaders = String kTemplateHeaders =
"""\n {% for key, val in headers -%}.set("{{key}}", "{{val}}"){% if not loop.last %}{{ '\n ' }}{% endif %}{%- endfor -%}"""; """\n {% for key, val in headers -%}.header("{{key}}", "{{val}}"){% if not loop.last %}{{ '\n ' }}{% endif %}{%- endfor -%}""";
String kTemplateFormHeaderContentType = ''' String kTemplateFormHeaderContentType = '''
multipart/form-data; boundary={{boundary}}'''; multipart/form-data; boundary={{boundary}}''';
@ -90,7 +92,7 @@ multipart/form-data; boundary={{boundary}}''';
let payload = build_data_list(form_data_items); let payload = build_data_list(form_data_items);
"""; """;
String kStringRequestBody = """\n .send_string(payload)?;"""; String kStringRequestBody = """\n .send(payload)?;""";
String kStringRequestForm = """\n .send_bytes(&payload)?;"""; String kStringRequestForm = """\n .send_bytes(&payload)?;""";
@ -100,7 +102,7 @@ multipart/form-data; boundary={{boundary}}''';
final String kStringRequestEnd = """\n final String kStringRequestEnd = """\n
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -117,12 +119,16 @@ multipart/form-data; boundary={{boundary}}''';
String uuid = getNewUuid(); String uuid = getNewUuid();
String url = requestModel.url; String url = requestModel.url;
var rec = getValidRequestUri( var rec = getValidRequestUri(
url, url,
requestModel.enabledParams, requestModel.enabledParams,
); );
Uri? uri = rec.$1; Uri? uri = rec.$1;
var method = requestModel.method;
var requestBody = requestModel.body;
if (requestModel.bodyContentType == ContentType.json && requestBody?.isNotEmpty == true){
result += kJsonImport;
}
if (uri != null) { if (uri != null) {
var templateStartUrl = jj.Template(kTemplateStart); var templateStartUrl = jj.Template(kTemplateStart);
result += templateStartUrl.render({ result += templateStartUrl.render({
@ -130,9 +136,8 @@ multipart/form-data; boundary={{boundary}}''';
'isFormDataRequest': requestModel.hasFormData, 'isFormDataRequest': requestModel.hasFormData,
"method": requestModel.method.name.toLowerCase() "method": requestModel.method.name.toLowerCase()
}); });
var method = requestModel.method;
var requestBody = requestModel.body;
if (kMethodsWithBody.contains(method) && requestBody != null) { if (kMethodsWithBody.contains(method) && requestBody != null) {
var contentLength = utf8.encode(requestBody).length; var contentLength = utf8.encode(requestBody).length;
if (contentLength > 0) { if (contentLength > 0) {

View File

@ -9,13 +9,14 @@ void main() {
group('GET Request', () { group('GET Request', () {
test('GET 1', () { test('GET 1', () {
const expectedCode = r"""fn main() -> Result<(), ureq::Error> { const expectedCode = r"""
fn main() -> Result<(), ureq::Error> {
let url = "https://api.apidash.dev"; let url = "https://api.apidash.dev";
let response = ureq::get(url) let response = ureq::get(url)
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -37,7 +38,7 @@ void main() {
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -59,7 +60,7 @@ void main() {
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -85,7 +86,7 @@ void main() {
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -103,11 +104,11 @@ void main() {
const expectedCode = r"""fn main() -> Result<(), ureq::Error> { const expectedCode = r"""fn main() -> Result<(), ureq::Error> {
let url = "https://api.github.com/repos/foss42/apidash"; let url = "https://api.github.com/repos/foss42/apidash";
let response = ureq::get(url) let response = ureq::get(url)
.set("User-Agent", "Test Agent") .header("User-Agent", "Test Agent")
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -126,11 +127,11 @@ void main() {
let url = "https://api.github.com/repos/foss42/apidash"; let url = "https://api.github.com/repos/foss42/apidash";
let response = ureq::get(url) let response = ureq::get(url)
.query("raw", "true") .query("raw", "true")
.set("User-Agent", "Test Agent") .header("User-Agent", "Test Agent")
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -151,7 +152,7 @@ void main() {
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -170,11 +171,11 @@ void main() {
let url = "https://api.github.com/repos/foss42/apidash"; let url = "https://api.github.com/repos/foss42/apidash";
let response = ureq::get(url) let response = ureq::get(url)
.query("raw", "true") .query("raw", "true")
.set("User-Agent", "Test Agent") .header("User-Agent", "Test Agent")
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -197,7 +198,7 @@ void main() {
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -215,11 +216,11 @@ void main() {
const expectedCode = r"""fn main() -> Result<(), ureq::Error> { const expectedCode = r"""fn main() -> Result<(), ureq::Error> {
let url = "https://api.apidash.dev/humanize/social"; let url = "https://api.apidash.dev/humanize/social";
let response = ureq::get(url) let response = ureq::get(url)
.set("User-Agent", "Test Agent") .header("User-Agent", "Test Agent")
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -239,11 +240,11 @@ void main() {
let response = ureq::get(url) let response = ureq::get(url)
.query("num", "8700000") .query("num", "8700000")
.query("digits", "3") .query("digits", "3")
.set("User-Agent", "Test Agent") .header("User-Agent", "Test Agent")
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -264,7 +265,7 @@ void main() {
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -287,7 +288,7 @@ void main() {
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -308,7 +309,7 @@ void main() {
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -332,11 +333,11 @@ void main() {
}"#; }"#;
let response = ureq::post(url) let response = ureq::post(url)
.set("content-type", "text/plain") .header("content-type", "text/plain")
.send_string(payload)?; .send(payload)?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -351,9 +352,12 @@ void main() {
}); });
test('POST 2', () { test('POST 2', () {
const expectedCode = r'''fn main() -> Result<(), ureq::Error> { const expectedCode = r'''
use serde_json::json;
fn main() -> Result<(), ureq::Error> {
let url = "https://api.apidash.dev/case/lower"; let url = "https://api.apidash.dev/case/lower";
let payload = ureq::json!({
let payload = json!({
"text": "I LOVE Flutter", "text": "I LOVE Flutter",
"flag": null, "flag": null,
"male": true, "male": true,
@ -366,7 +370,7 @@ void main() {
.send_json(payload)?; .send_json(payload)?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -381,18 +385,21 @@ void main() {
}); });
test('POST 3', () { test('POST 3', () {
const expectedCode = r'''fn main() -> Result<(), ureq::Error> { const expectedCode = r'''
use serde_json::json;
fn main() -> Result<(), ureq::Error> {
let url = "https://api.apidash.dev/case/lower"; let url = "https://api.apidash.dev/case/lower";
let payload = ureq::json!({
let payload = json!({
"text": "I LOVE Flutter" "text": "I LOVE Flutter"
}); });
let response = ureq::post(url) let response = ureq::post(url)
.set("User-Agent", "Test Agent") .header("User-Agent", "Test Agent")
.send_json(payload)?; .send_json(payload)?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -465,11 +472,11 @@ fn main() -> Result<(), ureq::Error> {
let payload = build_data_list(form_data_items); let payload = build_data_list(form_data_items);
let response = ureq::post(url) let response = ureq::post(url)
.set("content-type", "multipart/form-data; boundary=test") .header("content-type", "multipart/form-data; boundary=test")
.send_bytes(&payload)?; .send_bytes(&payload)?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -542,12 +549,12 @@ fn main() -> Result<(), ureq::Error> {
let payload = build_data_list(form_data_items); let payload = build_data_list(form_data_items);
let response = ureq::post(url) let response = ureq::post(url)
.set("User-Agent", "Test Agent") .header("User-Agent", "Test Agent")
.set("content-type", "multipart/form-data; boundary=test") .header("content-type", "multipart/form-data; boundary=test")
.send_bytes(&payload)?; .send_bytes(&payload)?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -612,11 +619,11 @@ fn main() -> Result<(), ureq::Error> {
let payload = build_data_list(form_data_items); let payload = build_data_list(form_data_items);
let response = ureq::post(url) let response = ureq::post(url)
.set("content-type", "multipart/form-data; boundary=test") .header("content-type", "multipart/form-data; boundary=test")
.send_bytes(&payload)?; .send_bytes(&payload)?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -681,11 +688,11 @@ fn main() -> Result<(), ureq::Error> {
let payload = build_data_list(form_data_items); let payload = build_data_list(form_data_items);
let response = ureq::post(url) let response = ureq::post(url)
.set("content-type", "multipart/form-data; boundary=test") .header("content-type", "multipart/form-data; boundary=test")
.send_bytes(&payload)?; .send_bytes(&payload)?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -757,11 +764,11 @@ fn main() -> Result<(), ureq::Error> {
let response = ureq::post(url) let response = ureq::post(url)
.query("size", "2") .query("size", "2")
.query("len", "3") .query("len", "3")
.set("content-type", "multipart/form-data; boundary=test") .header("content-type", "multipart/form-data; boundary=test")
.send_bytes(&payload)?; .send_bytes(&payload)?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -828,13 +835,13 @@ fn main() -> Result<(), ureq::Error> {
let response = ureq::post(url) let response = ureq::post(url)
.query("size", "2") .query("size", "2")
.query("len", "3") .query("len", "3")
.set("User-Agent", "Test Agent") .header("User-Agent", "Test Agent")
.set("Keep-Alive", "true") .header("Keep-Alive", "true")
.set("content-type", "multipart/form-data; boundary=test") .header("content-type", "multipart/form-data; boundary=test")
.send_bytes(&payload)?; .send_bytes(&payload)?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -849,9 +856,11 @@ fn main() -> Result<(), ureq::Error> {
group('PUT Request', () { group('PUT Request', () {
test('PUT 1', () { test('PUT 1', () {
const expectedCode = r'''fn main() -> Result<(), ureq::Error> { const expectedCode = r'''use serde_json::json;
fn main() -> Result<(), ureq::Error> {
let url = "https://reqres.in/api/users/2"; let url = "https://reqres.in/api/users/2";
let payload = ureq::json!({
let payload = json!({
"name": "morpheus", "name": "morpheus",
"job": "zion resident" "job": "zion resident"
}); });
@ -860,7 +869,7 @@ fn main() -> Result<(), ureq::Error> {
.send_json(payload)?; .send_json(payload)?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -877,9 +886,12 @@ fn main() -> Result<(), ureq::Error> {
group('PATCH Request', () { group('PATCH Request', () {
test('PATCH 1', () { test('PATCH 1', () {
const expectedCode = r'''fn main() -> Result<(), ureq::Error> { const expectedCode = r'''
use serde_json::json;
fn main() -> Result<(), ureq::Error> {
let url = "https://reqres.in/api/users/2"; let url = "https://reqres.in/api/users/2";
let payload = ureq::json!({
let payload = json!({
"name": "marfeus", "name": "marfeus",
"job": "accountant" "job": "accountant"
}); });
@ -888,7 +900,7 @@ fn main() -> Result<(), ureq::Error> {
.send_json(payload)?; .send_json(payload)?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -905,13 +917,14 @@ fn main() -> Result<(), ureq::Error> {
group('DELETE Request', () { group('DELETE Request', () {
test('DELETE 1', () { test('DELETE 1', () {
const expectedCode = r"""fn main() -> Result<(), ureq::Error> { const expectedCode = r"""
fn main() -> Result<(), ureq::Error> {
let url = "https://reqres.in/api/users/2"; let url = "https://reqres.in/api/users/2";
let response = ureq::delete(url) let response = ureq::delete(url)
.call()?; .call()?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }
@ -926,9 +939,12 @@ fn main() -> Result<(), ureq::Error> {
}); });
test('DELETE 2', () { test('DELETE 2', () {
const expectedCode = r'''fn main() -> Result<(), ureq::Error> { const expectedCode = r'''
use serde_json::json;
fn main() -> Result<(), ureq::Error> {
let url = "https://reqres.in/api/users/2"; let url = "https://reqres.in/api/users/2";
let payload = ureq::json!({
let payload = json!({
"name": "marfeus", "name": "marfeus",
"job": "accountant" "job": "accountant"
}); });
@ -937,7 +953,7 @@ fn main() -> Result<(), ureq::Error> {
.send_json(payload)?; .send_json(payload)?;
println!("Response Status: {}", response.status()); println!("Response Status: {}", response.status());
println!("Response: {}", response.into_string()?); println!("Response: {}", response.into_body().read_to_string()?);
Ok(()) Ok(())
} }