diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index 6b5c5be3..e343b241 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -1,4 +1,4 @@ -import 'package:apidash/codegen/rust/curl-rust.dart'; +import 'package:apidash/codegen/rust/curl_rust.dart'; import 'package:apidash/models/models.dart' show RequestModel; import 'package:apidash/consts.dart'; import 'package:apidash/utils/utils.dart' show getNewUuid; diff --git a/lib/codegen/rust/curl-rust.dart b/lib/codegen/rust/curl-rust.dart deleted file mode 100644 index 9d775b74..00000000 --- a/lib/codegen/rust/curl-rust.dart +++ /dev/null @@ -1,113 +0,0 @@ -import 'dart:convert'; -import 'package:jinja/jinja.dart' as jj; -import 'package:apidash/utils/utils.dart' - show getNewUuid, getValidRequestUri, padMultilineString; -import 'package:apidash/models/models.dart' show RequestModel; -import 'package:apidash/consts.dart'; - -class RustCurlCodeGen { - final String kTemplateStart = """use curl::easy::Easy; -use serde_json::json; - -fn main() { -"""; - - String kTemplateUrl = """ - let mut easy = Easy::new(); - easy.url("{{url}}").unwrap(); - """; - - String kTemplateMethod = """easy.{{method}}(true).unwrap(); - """; - - String kTemplateRawBody = - """easy.post_field_copy({{body}}.as_bytes()).unwrap(); - """; - - String kTemplateJsonBody = - """easy.post_fields_copy(json!({{body}}).to_string().as_bytes()).unwrap(); - """; - - String kTemplateFormData = """ - let mut form = curl::easy::Form::new(); - {% for field in fields %} - form.part("{{field.name}}") - {% if field.type == "file" %}.file("{{field.value}}"){% else %}.contents(b"{{field.value}}"){% endif %} - .add(); - {% endfor %} - easy.httppost(form); - """; - - String kTemplateHeader = """easy.header("{{header}}", "{{value}}"); - """; - - final String kTemplateEnd = """easy.perform().unwrap(); -} -"""; - - String? getCode( - RequestModel requestModel, - String defaultUriScheme, - ) { - try { - String result = ""; - - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } - - result += kTemplateStart; - - var rec = getValidRequestUri( - url, - requestModel.enabledRequestParams, - ); - - Uri? uri = rec.$1; - - if (uri != null) { - var templateUrl = jj.Template(kTemplateUrl); - result += templateUrl.render({"url": uri.toString()}); - - var method = requestModel.method; - var templateMethod = jj.Template(kTemplateMethod); - result += templateMethod.render({"method": method.name.toLowerCase()}); - - var requestBody = requestModel.requestBody; - if (kMethodsWithBody.contains(method) && requestBody != null) { - if (requestModel.requestBodyContentType == ContentType.text) { - var templateRawBody = jj.Template(kTemplateRawBody); - result += templateRawBody.render({"body": requestBody}); - } else if (requestModel.requestBodyContentType == ContentType.json) { - var templateJsonBody = jj.Template(kTemplateJsonBody); - result += templateJsonBody.render({"body": requestBody}); - } else if (requestModel.isFormDataRequest) { - var templateFormData = jj.Template(kTemplateFormData); - result += templateFormData.render({ - "fields": requestModel.formDataMapList, - }); - } - } - - var headersList = requestModel.enabledRequestHeaders; - if (headersList != null) { - var headers = requestModel.enabledHeadersMap; - for (var header in headers.keys) { - var templateHeader = jj.Template(kTemplateHeader); - result += templateHeader.render({ - "header": header, - "value": headers[header], - }); - } - } - - result += kTemplateEnd; - } - - return result; - } catch (e) { - return null; - } - } -} diff --git a/lib/codegen/rust/curl_rust.dart b/lib/codegen/rust/curl_rust.dart new file mode 100644 index 00000000..c2189eca --- /dev/null +++ b/lib/codegen/rust/curl_rust.dart @@ -0,0 +1,144 @@ +import 'package:jinja/jinja.dart' as jj; +import 'package:apidash/utils/utils.dart' show getValidRequestUri, requestModelToHARJsonRequest; +import 'package:apidash/models/models.dart' show RequestModel; +import 'package:apidash/consts.dart'; + +class RustCurlCodeGen { + final String kTemplateStart = """use curl::easy::Easy; +{% if hasJsonBody %}use serde_json::json; +{% endif %}{% if hasHeaders %}use curl::easy::List; +{% endif %} +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + +"""; + + String kTemplateUrl = """ + easy.url("{{url}}").unwrap(); +"""; + + String kTemplateMethod = """ +{% if method == 'get' or method == 'post' or method == 'put' %} + easy.{{ method }}(true).unwrap(); +{% elif method == 'delete' %} + easy.custom_request("DELETE").unwrap(); +{% elif method == 'patch' %} + easy.custom_request("PATCH").unwrap(); +{% elif method == 'head' %} + easy.nobody(true).unwrap(); +{% endif %} + +"""; + + String kTemplateRawBody =""" + easy.post_fields_copy(r#"{{body}}"#.as_bytes()).unwrap(); + + +"""; + + String kTemplateJsonBody =""" + easy.post_fields_copy(json!({{body}}).to_string().as_bytes()).unwrap(); + + +"""; + + String kTemplateFormData = """ + let mut form = curl::easy::Form::new(); + {% for field in fields %} + form.part("{{field.name}}") + {% if field.type == "file" %}.file("{{field.value}}"){% else %}.contents(b"{{field.value}}"){% endif %} + .add(); + {% endfor %} + easy.httppost(form); + """; + + String kTemplateHeader = """ + {% if headers %}let mut list = List::new();{% for header, value in headers %} + list.append("{{header}}: {{value}}");{% endfor %} + easy.http_headers(list).unwrap(); + {% endif %} + +"""; + + final String kTemplateEnd = """ + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + + String? getCode(RequestModel requestModel) { + try { + String result = ""; + var requestBody = requestModel.requestBody; + + String url = requestModel.url; + + result += jj.Template(kTemplateStart).render({ + "hasJsonBody": requestModel.hasJsonData, + "hasHeaders": requestModel.enabledRequestHeaders != null || requestModel.hasBody + }); + + var rec = getValidRequestUri( + url, + requestModel.enabledRequestParams, + ); + + Uri? uri = rec.$1; + var harJson = + requestModelToHARJsonRequest(requestModel, useEnabled: true); + + var templateUrl = jj.Template(kTemplateUrl); + result += templateUrl.render({"url": harJson["url"]}); + + var methodTemplate = jj.Template(kTemplateMethod); + result += methodTemplate.render({"method": requestModel.method.name}); + + if (uri != null) { + if (requestModel.hasTextData) { + var templateBody = jj.Template(kTemplateRawBody); + result += templateBody.render({"body": requestBody}); + } else if (requestModel.hasJsonData) { + var templateBody = jj.Template(kTemplateJsonBody); + result += templateBody.render({"body": requestBody}); + } else if (requestModel.hasFormData) { + var templateFormData = jj.Template(kTemplateFormData); + result += templateFormData.render({ + "fields": requestModel.formDataMapList, + }); + } + + var headersList = requestModel.enabledRequestHeaders; + if (headersList != null || requestModel.hasBody) { + var headers = requestModel.enabledHeadersMap; + if (requestModel.hasJsonData || requestModel.hasTextData) { + headers.putIfAbsent(kHeaderContentType, + () => requestModel.requestBodyContentType.header); + } + if (headers.isNotEmpty) { + var templateHeader = jj.Template(kTemplateHeader); + result += templateHeader.render({ + "headers": headers, + }); + } + } + + result += kTemplateEnd; + } + + return result; + } catch (e) { + return null; + } + } +} diff --git a/test/codegen/curl_rust_codegen_test.dart b/test/codegen/curl_rust_codegen_test.dart new file mode 100644 index 00000000..aa337c2d --- /dev/null +++ b/test/codegen/curl_rust_codegen_test.dart @@ -0,0 +1,997 @@ +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; +import 'package:test/test.dart'; +import '../request_models.dart'; + +void main() { + final codeGen = Codegen(); + + group('GET Request', () { + test('GET1', () { + const expectedCode = r""" +use curl::easy::Easy; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev").unwrap(); + easy.get(true).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelGet1, "https"), + expectedCode); + }); + test('GET2', () { + const expectedCode = r""" +use curl::easy::Easy; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/country/data?code=US").unwrap(); + easy.get(true).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelGet2, "https"), + expectedCode); + }); + test('GET3', () { + const expectedCode = r""" +use curl::easy::Easy; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/country/data?code=IND").unwrap(); + easy.get(true).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelGet3, "https"), + expectedCode); + }); + test('GET4', () { + const expectedCode = r""" +use curl::easy::Easy; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true").unwrap(); + easy.get(true).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelGet4, "https"), + expectedCode); + }); + test('GET5', () { + const expectedCode = r""" +use curl::easy::Easy; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.github.com/repos/foss42/apidash").unwrap(); + easy.get(true).unwrap(); + + let mut list = List::new(); + list.append("User-Agent: Test Agent"); + easy.http_headers(list).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelGet5, "https"), + expectedCode); + }); + test('GET6', () { + const expectedCode = r""" +use curl::easy::Easy; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.github.com/repos/foss42/apidash?raw=true").unwrap(); + easy.get(true).unwrap(); + + let mut list = List::new(); + list.append("User-Agent: Test Agent"); + easy.http_headers(list).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelGet6, "https"), + expectedCode); + }); + test('GET7', () { + const expectedCode = r""" +use curl::easy::Easy; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev").unwrap(); + easy.get(true).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelGet7, "https"), + expectedCode); + }); + test('GET8', () { + const expectedCode = r""" +use curl::easy::Easy; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.github.com/repos/foss42/apidash?raw=true").unwrap(); + easy.get(true).unwrap(); + + let mut list = List::new(); + list.append("User-Agent: Test Agent"); + easy.http_headers(list).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelGet8, "https"), + expectedCode); + }); + test('GET9', () { + const expectedCode = r""" +use curl::easy::Easy; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/humanize/social?num=8700000&add_space=true").unwrap(); + easy.get(true).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelGet9, "https"), + expectedCode); + }); + test('GET10', () { + const expectedCode = r""" +use curl::easy::Easy; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/humanize/social").unwrap(); + easy.get(true).unwrap(); + + let mut list = List::new(); + list.append("User-Agent: Test Agent"); + easy.http_headers(list).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelGet10, "https"), + expectedCode); + }); + test('GET11', () { + const expectedCode = r""" +use curl::easy::Easy; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/humanize/social?num=8700000&digits=3").unwrap(); + easy.get(true).unwrap(); + + let mut list = List::new(); + list.append("User-Agent: Test Agent"); + easy.http_headers(list).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelGet11, "https"), + expectedCode); + }); + test('GET12', () { + const expectedCode = r""" +use curl::easy::Easy; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/humanize/social").unwrap(); + easy.get(true).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelGet12, "https"), + expectedCode); + }); + }); + + group('HEAD Request', () { + test('HEAD1', () { + const expectedCode = r""" +use curl::easy::Easy; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev").unwrap(); + easy.nobody(true).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelHead1, "https"), + expectedCode); + }); + test('HEAD2', () { + const expectedCode = r""" +use curl::easy::Easy; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev").unwrap(); + easy.nobody(true).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelHead2, "https"), + expectedCode); + }); + }); + + group('POST Request', () { + test('POST1', () { + const expectedCode = r""" +use curl::easy::Easy; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/case/lower").unwrap(); + easy.post(true).unwrap(); + + easy.post_fields_copy(r#"{ +"text": "I LOVE Flutter" +}"#.as_bytes()).unwrap(); + + let mut list = List::new(); + list.append("Content-Type: text/plain"); + easy.http_headers(list).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelPost1, "https"), + expectedCode); + }); + test('POST2', () { + const expectedCode = r""" +use curl::easy::Easy; +use serde_json::json; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/case/lower").unwrap(); + easy.post(true).unwrap(); + + easy.post_fields_copy(json!({ +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] +}).to_string().as_bytes()).unwrap(); + + let mut list = List::new(); + list.append("Content-Type: application/json"); + easy.http_headers(list).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelPost2, "https"), + expectedCode); + }); + test('POST3', () { + const expectedCode = r""" +use curl::easy::Easy; +use serde_json::json; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/case/lower").unwrap(); + easy.post(true).unwrap(); + + easy.post_fields_copy(json!({ +"text": "I LOVE Flutter" +}).to_string().as_bytes()).unwrap(); + + let mut list = List::new(); + list.append("User-Agent: Test Agent"); + list.append("Content-Type: application/json"); + easy.http_headers(list).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelPost3, "https"), + expectedCode); + }); + test('POST4', () { + const expectedCode = r""" +use curl::easy::Easy; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/io/form").unwrap(); + easy.post(true).unwrap(); + + let mut form = curl::easy::Form::new(); + + form.part("text") + .contents(b"API") + .add(); + + form.part("sep") + .contents(b"|") + .add(); + + form.part("times") + .contents(b"3") + .add(); + + easy.httppost(form); + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelPost4, "https"), + expectedCode); + }); + test('POST5', () { + const expectedCode = r""" +use curl::easy::Easy; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/io/form").unwrap(); + easy.post(true).unwrap(); + + let mut form = curl::easy::Form::new(); + + form.part("text") + .contents(b"API") + .add(); + + form.part("sep") + .contents(b"|") + .add(); + + form.part("times") + .contents(b"3") + .add(); + + easy.httppost(form); + let mut list = List::new(); + list.append("User-Agent: Test Agent"); + easy.http_headers(list).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelPost5, "https"), + expectedCode); + }); + test('POST6', () { + const expectedCode = r""" +use curl::easy::Easy; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/io/img").unwrap(); + easy.post(true).unwrap(); + + let mut form = curl::easy::Form::new(); + + form.part("token") + .contents(b"xyz") + .add(); + + form.part("imfile") + .file("/Documents/up/1.png") + .add(); + + easy.httppost(form); + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelPost6, "https"), + expectedCode); + }); + test('POST7', () { + const expectedCode = r""" +use curl::easy::Easy; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/io/img").unwrap(); + easy.post(true).unwrap(); + + let mut form = curl::easy::Form::new(); + + form.part("token") + .contents(b"xyz") + .add(); + + form.part("imfile") + .file("/Documents/up/1.png") + .add(); + + easy.httppost(form); + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelPost7, "https"), + expectedCode); + }); + test('POST8', () { + const expectedCode = r""" +use curl::easy::Easy; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/io/form?size=2&len=3").unwrap(); + easy.post(true).unwrap(); + + let mut form = curl::easy::Form::new(); + + form.part("text") + .contents(b"API") + .add(); + + form.part("sep") + .contents(b"|") + .add(); + + form.part("times") + .contents(b"3") + .add(); + + easy.httppost(form); + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelPost8, "https"), + expectedCode); + }); + test('POST9', () { + const expectedCode = r""" +use curl::easy::Easy; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://api.apidash.dev/io/img?size=2&len=3").unwrap(); + easy.post(true).unwrap(); + + let mut form = curl::easy::Form::new(); + + form.part("token") + .contents(b"xyz") + .add(); + + form.part("imfile") + .file("/Documents/up/1.png") + .add(); + + easy.httppost(form); + let mut list = List::new(); + list.append("User-Agent: Test Agent"); + list.append("Keep-Alive: true"); + easy.http_headers(list).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelPost9, "https"), + expectedCode); + }); + }); + + group('PUT Request', () { + test('PUT1', () { + const expectedCode = r""" +use curl::easy::Easy; +use serde_json::json; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://reqres.in/api/users/2").unwrap(); + easy.put(true).unwrap(); + + easy.post_fields_copy(json!({ +"name": "morpheus", +"job": "zion resident" +}).to_string().as_bytes()).unwrap(); + + let mut list = List::new(); + list.append("Content-Type: application/json"); + easy.http_headers(list).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelPut1, "https"), + expectedCode); + }); + }); + + group('PATCH Request', () { + test('PATCH1', () { + const expectedCode = r""" +use curl::easy::Easy; +use serde_json::json; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://reqres.in/api/users/2").unwrap(); + easy.custom_request("PATCH").unwrap(); + + easy.post_fields_copy(json!({ +"name": "marfeus", +"job": "accountant" +}).to_string().as_bytes()).unwrap(); + + let mut list = List::new(); + list.append("Content-Type: application/json"); + easy.http_headers(list).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelPatch1, "https"), + expectedCode); + }); + }); + + group('DELETE Request', () { + test('DELETE1', () { + const expectedCode = r""" +use curl::easy::Easy; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://reqres.in/api/users/2").unwrap(); + easy.custom_request("DELETE").unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelDelete1, "https"), + expectedCode); + }); + test('DELETE2', () { + const expectedCode = r""" +use curl::easy::Easy; +use serde_json::json; +use curl::easy::List; + +fn main() { + let mut easy = Easy::new(); + let mut data = Vec::new(); + easy.url("https://reqres.in/api/users/2").unwrap(); + easy.custom_request("DELETE").unwrap(); + + easy.post_fields_copy(json!({ +"name": "marfeus", +"job": "accountant" +}).to_string().as_bytes()).unwrap(); + + let mut list = List::new(); + list.append("Content-Type: application/json"); + easy.http_headers(list).unwrap(); + + { + let mut transfer = easy.transfer(); + transfer.write_function(|new_data| { + data.extend_from_slice(new_data); + Ok(new_data.len()) + }).unwrap(); + transfer.perform().unwrap(); + } + + let response_body = String::from_utf8_lossy(&data); + + println!("Response body:{}", response_body); + println!("Response code: {}", easy.response_code().unwrap()); +}"""; + expect( + codeGen.getCode( + CodegenLanguage.rustCurl, requestModelDelete2, "https"), + expectedCode); + }); + }); + +}