From 9cdfafbd9cb40ff034849e6b4c08477a7008de82 Mon Sep 17 00:00:00 2001 From: Apoorv Dwivedi Date: Sat, 9 Mar 2024 20:57:18 +0530 Subject: [PATCH 01/14] Added code generator for curl-rust --- lib/codegen/codegen.dart | 3 + lib/codegen/rust/curl-rust.dart | 113 ++++++++++++++++++++++++++++++++ lib/consts.dart | 4 +- 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 lib/codegen/rust/curl-rust.dart diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index 1aec7144..db4334a0 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -1,3 +1,4 @@ +import 'package:apidash/codegen/rust/curl-rust.dart'; import 'package:apidash/models/models.dart' show RequestModel; import 'package:apidash/consts.dart'; import 'dart/http.dart'; @@ -42,6 +43,8 @@ class Codegen { .getCode(requestModel, defaultUriScheme); case CodegenLanguage.pythonRequests: return PythonRequestsCodeGen().getCode(requestModel, defaultUriScheme); + case CodegenLanguage.rustCurl: + return RustCurlCodeGen().getCode(requestModel, defaultUriScheme); } } } diff --git a/lib/codegen/rust/curl-rust.dart b/lib/codegen/rust/curl-rust.dart new file mode 100644 index 00000000..9d775b74 --- /dev/null +++ b/lib/codegen/rust/curl-rust.dart @@ -0,0 +1,113 @@ +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/consts.dart b/lib/consts.dart index d157b7fa..124e98c7 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -271,7 +271,9 @@ enum CodegenLanguage { nodejsFetch("node.js (fetch)", "javascript", "js"), kotlinOkHttp("Kotlin (okhttp3)", "java", "kt"), pythonHttpClient("Python (http.client)", "python", "py"), - pythonRequests("Python (requests)", "python", "py"); + pythonRequests("Python (requests)", "python", "py"), + rustCurl("Rust (curl-rust)", "rust", "rs"); + const CodegenLanguage(this.label, this.codeHighlightLang, this.ext); final String label; From 3a7ae7179639f2bf46f0c57ce49d5682eba104d1 Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Sat, 16 Mar 2024 15:01:47 +0530 Subject: [PATCH 02/14] feat: automatic row adding --- .../request_pane/request_form_data.dart | 63 +++++++------------ .../request_pane/request_headers.dart | 59 +++++++---------- .../request_pane/request_params.dart | 58 +++++++---------- 3 files changed, 68 insertions(+), 112 deletions(-) diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart index 5d518e22..f77133e7 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart @@ -27,6 +27,8 @@ class _FormDataBodyState extends ConsumerState { @override Widget build(BuildContext context) { final selectedId = ref.watch(selectedIdStateProvider); + ref.watch(selectedRequestModelProvider + .select((value) => value?.requestFormDataList?.length)); var formRows = ref.read(selectedRequestModelProvider)?.requestFormDataList; rows = formRows == null || formRows.isEmpty ? [kFormDataEmptyModel] : formRows; @@ -47,18 +49,21 @@ class _FormDataBodyState extends ConsumerState { initialValue: rows[idx].name, hintText: " Add Key", onChanged: (value) { - rows[idx] = rows[idx].copyWith( - name: value, - ); + rows[idx] = rows[idx].copyWith(name: value); + if (idx == rows.length - 1) rows.add(kFormDataEmptyModel); _onFieldChange(selectedId!); }, colorScheme: Theme.of(context).colorScheme, formDataType: rows[idx].type, onFormDataTypeChanged: (value) { + bool hasChanged = rows[idx].type != value; rows[idx] = rows[idx].copyWith( type: value ?? FormDataType.text, ); rows[idx] = rows[idx].copyWith(value: ""); + if (idx == rows.length - 1 && hasChanged) { + rows.add(kFormDataEmptyModel); + } setState(() {}); _onFieldChange(selectedId!); }, @@ -137,6 +142,7 @@ class _FormDataBodyState extends ConsumerState { hintText: " Add Value", onChanged: (value) { rows[idx] = rows[idx].copyWith(value: value); + if (idx == rows.length - 1) rows.add(kFormDataEmptyModel); _onFieldChange(selectedId!); }, colorScheme: Theme.of(context).colorScheme, @@ -169,45 +175,22 @@ class _FormDataBodyState extends ConsumerState { ), ], ); - return Stack( - children: [ - Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: kBorderRadius12, - ), - margin: kP10, - child: Column( - children: [ - Expanded( - child: DaviTheme( - data: kTableThemeData, - child: Davi(daviModelRows), - ), - ), - ], - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.only(bottom: 30), - child: ElevatedButton.icon( - onPressed: () { - setState(() { - rows.add(kFormDataEmptyModel); - }); - _onFieldChange(selectedId!); - }, - icon: const Icon(Icons.add), - label: const Text( - "Add Form Data", - style: kTextStyleButton, - ), + return Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.background, + borderRadius: kBorderRadius12, + ), + margin: kP10, + child: Column( + children: [ + Expanded( + child: DaviTheme( + data: kTableThemeData, + child: Davi(daviModelRows), ), ), - ), - ], + ], + ), ); } diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart index 503355f8..a6524b23 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart @@ -81,7 +81,12 @@ class EditRequestHeadersState extends ConsumerState { initialValue: rows[idx].name, hintText: "Add Header Name", onChanged: (value) { + isRowEnabledList[idx] = true; rows[idx] = rows[idx].copyWith(name: value); + if (idx == rows.length - 1) { + rows.add(kNameValueEmptyModel); + isRowEnabledList.add(true); + } _onFieldChange(selectedId!); }, colorScheme: Theme.of(context).colorScheme, @@ -109,6 +114,10 @@ class EditRequestHeadersState extends ConsumerState { hintText: " Add Header Value", onChanged: (value) { rows[idx] = rows[idx].copyWith(value: value); + if (idx == rows.length - 1) { + rows.add(kNameValueEmptyModel); + isRowEnabledList.add(true); + } _onFieldChange(selectedId!); }, colorScheme: Theme.of(context).colorScheme, @@ -144,44 +153,22 @@ class EditRequestHeadersState extends ConsumerState { ), ], ); - return Stack( - children: [ - Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: kBorderRadius12, - ), - margin: kP10, - child: Column( - children: [ - Expanded( - child: DaviTheme( - data: kTableThemeData, - child: Davi(model), - ), - ), - ], - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.only(bottom: 30), - child: ElevatedButton.icon( - onPressed: () { - rows.add(kNameValueEmptyModel); - isRowEnabledList.add(true); - _onFieldChange(selectedId!); - }, - icon: const Icon(Icons.add), - label: const Text( - "Add Header", - style: kTextStyleButton, - ), + return Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.background, + borderRadius: kBorderRadius12, + ), + margin: kP10, + child: Column( + children: [ + Expanded( + child: DaviTheme( + data: kTableThemeData, + child: Davi(model), ), ), - ), - ], + ], + ), ); } } diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart index 6e3aca4b..f602200d 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart @@ -83,6 +83,10 @@ class EditRequestURLParamsState extends ConsumerState { hintText: "Add URL Parameter", onChanged: (value) { rows[idx] = rows[idx].copyWith(name: value); + if (idx == rows.length - 1) { + rows.add(kNameValueEmptyModel); + isRowEnabledList.add(true); + } _onFieldChange(selectedId!); }, colorScheme: Theme.of(context).colorScheme, @@ -110,6 +114,10 @@ class EditRequestURLParamsState extends ConsumerState { hintText: "Add Value", onChanged: (value) { rows[idx] = rows[idx].copyWith(value: value); + if (idx == rows.length - 1) { + rows.add(kNameValueEmptyModel); + isRowEnabledList.add(true); + } _onFieldChange(selectedId!); }, colorScheme: Theme.of(context).colorScheme, @@ -145,44 +153,22 @@ class EditRequestURLParamsState extends ConsumerState { ), ], ); - return Stack( - children: [ - Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: kBorderRadius12, - ), - margin: kP10, - child: Column( - children: [ - Expanded( - child: DaviTheme( - data: kTableThemeData, - child: Davi(model), - ), - ), - ], - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.only(bottom: 30), - child: ElevatedButton.icon( - onPressed: () { - rows.add(kNameValueEmptyModel); - isRowEnabledList.add(true); - _onFieldChange(selectedId!); - }, - icon: const Icon(Icons.add), - label: const Text( - "Add Param", - style: kTextStyleButton, - ), + return Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.background, + borderRadius: kBorderRadius12, + ), + margin: kP10, + child: Column( + children: [ + Expanded( + child: DaviTheme( + data: kTableThemeData, + child: Davi(model), ), ), - ), - ], + ], + ), ); } } From e42165061737b299b7597992328977cfef44d5df Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Sat, 16 Mar 2024 16:29:35 +0530 Subject: [PATCH 03/14] fix: checkbox empty selection --- .../request_pane/request_headers.dart | 33 +++++++++++------- .../request_pane/request_params.dart | 34 ++++++++++++------- lib/widgets/checkbox.dart | 2 +- 3 files changed, 42 insertions(+), 27 deletions(-) diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart index a6524b23..560955c0 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart @@ -40,14 +40,16 @@ class EditRequestHeadersState extends ConsumerState { ref.watch(selectedRequestModelProvider .select((value) => value?.requestHeaders?.length)); var rH = ref.read(selectedRequestModelProvider)?.requestHeaders; - rows = (rH == null || rH.isEmpty) + bool isHeadersEmpty = rH == null || rH.isEmpty; + rows = (isHeadersEmpty) ? [ kNameValueEmptyModel, ] : rH; - isRowEnabledList = - ref.read(selectedRequestModelProvider)?.isHeaderEnabledList ?? - List.filled(rows.length, true, growable: true); + isRowEnabledList = ref + .read(selectedRequestModelProvider) + ?.isHeaderEnabledList ?? + List.filled(rows.length, isHeadersEmpty ? false : true, growable: true); DaviModel model = DaviModel( rows: rows, @@ -60,12 +62,17 @@ class EditRequestHeadersState extends ConsumerState { return CheckBox( keyId: "$selectedId-$idx-headers-c-$seed", value: isRowEnabledList[idx], - onChanged: (value) { - setState(() { - isRowEnabledList[idx] = value!; - }); - _onFieldChange(selectedId!); - }, + onChanged: rows.length == 1 && + idx == 0 && + rows[idx].name.isEmpty && + rows[idx].value.isEmpty + ? null + : (value) { + setState(() { + isRowEnabledList[idx] = value!; + }); + _onFieldChange(selectedId!); + }, colorScheme: Theme.of(context).colorScheme, ); }, @@ -85,7 +92,7 @@ class EditRequestHeadersState extends ConsumerState { rows[idx] = rows[idx].copyWith(name: value); if (idx == rows.length - 1) { rows.add(kNameValueEmptyModel); - isRowEnabledList.add(true); + isRowEnabledList.add(false); } _onFieldChange(selectedId!); }, @@ -116,7 +123,7 @@ class EditRequestHeadersState extends ConsumerState { rows[idx] = rows[idx].copyWith(value: value); if (idx == rows.length - 1) { rows.add(kNameValueEmptyModel); - isRowEnabledList.add(true); + isRowEnabledList.add(false); } _onFieldChange(selectedId!); }, @@ -140,7 +147,7 @@ class EditRequestHeadersState extends ConsumerState { rows = [ kNameValueEmptyModel, ]; - isRowEnabledList = [true]; + isRowEnabledList = [false]; }); } else { rows.removeAt(row.index); diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart index f602200d..3bb018cb 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart @@ -41,14 +41,16 @@ class EditRequestURLParamsState extends ConsumerState { ref.watch(selectedRequestModelProvider .select((value) => value?.requestParams?.length)); var rP = ref.read(selectedRequestModelProvider)?.requestParams; - rows = (rP == null || rP.isEmpty) + bool isParamsEmpty = rP == null || rP.isEmpty; + rows = (isParamsEmpty) ? [ kNameValueEmptyModel, ] : rP; - isRowEnabledList = - ref.read(selectedRequestModelProvider)?.isParamEnabledList ?? - List.filled(rows.length, true, growable: true); + isRowEnabledList = ref + .read(selectedRequestModelProvider) + ?.isParamEnabledList ?? + List.filled(rows.length, isParamsEmpty ? false : true, growable: true); DaviModel model = DaviModel( rows: rows, @@ -61,12 +63,16 @@ class EditRequestURLParamsState extends ConsumerState { return CheckBox( keyId: "$selectedId-$idx-params-c-$seed", value: isRowEnabledList[idx], - onChanged: (value) { - setState(() { - isRowEnabledList[idx] = value!; - }); - _onFieldChange(selectedId!); - }, + onChanged: idx + 1 == rows.length && + rows[idx].name.isEmpty && + rows[idx].value.isEmpty + ? null + : (value) { + setState(() { + isRowEnabledList[idx] = value!; + }); + _onFieldChange(selectedId!); + }, colorScheme: Theme.of(context).colorScheme, ); }, @@ -84,8 +90,9 @@ class EditRequestURLParamsState extends ConsumerState { onChanged: (value) { rows[idx] = rows[idx].copyWith(name: value); if (idx == rows.length - 1) { + isRowEnabledList[idx] = true; rows.add(kNameValueEmptyModel); - isRowEnabledList.add(true); + isRowEnabledList.add(false); } _onFieldChange(selectedId!); }, @@ -115,8 +122,9 @@ class EditRequestURLParamsState extends ConsumerState { onChanged: (value) { rows[idx] = rows[idx].copyWith(value: value); if (idx == rows.length - 1) { + isRowEnabledList[idx] = true; rows.add(kNameValueEmptyModel); - isRowEnabledList.add(true); + isRowEnabledList.add(false); } _onFieldChange(selectedId!); }, @@ -140,7 +148,7 @@ class EditRequestURLParamsState extends ConsumerState { rows = [ kNameValueEmptyModel, ]; - isRowEnabledList = [true]; + isRowEnabledList = [false]; }); } else { rows.removeAt(row.index); diff --git a/lib/widgets/checkbox.dart b/lib/widgets/checkbox.dart index 22c3869f..53adf496 100644 --- a/lib/widgets/checkbox.dart +++ b/lib/widgets/checkbox.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; class CheckBox extends StatelessWidget { final String keyId; final bool value; - final ValueChanged onChanged; + final ValueChanged? onChanged; final ColorScheme? colorScheme; const CheckBox({ super.key, From 48d4beff0056a611dbd6bab16a65de0c0f271ea2 Mon Sep 17 00:00:00 2001 From: Apoorv Dwivedi Date: Sun, 17 Mar 2024 02:48:54 +0530 Subject: [PATCH 04/14] Added curl rust code generator --- lib/codegen/codegen.dart | 2 +- lib/codegen/rust/curl-rust.dart | 113 --- lib/codegen/rust/curl_rust.dart | 144 ++++ test/codegen/curl_rust_codegen_test.dart | 997 +++++++++++++++++++++++ 4 files changed, 1142 insertions(+), 114 deletions(-) delete mode 100644 lib/codegen/rust/curl-rust.dart create mode 100644 lib/codegen/rust/curl_rust.dart create mode 100644 test/codegen/curl_rust_codegen_test.dart 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); + }); + }); + +} From 711e3bd74d018401556704469306e27d94cd16fd Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Sun, 17 Mar 2024 18:27:13 +0530 Subject: [PATCH 05/14] fix: add buttons back --- .../request_pane/request_form_data.dart | 65 ++++++++++++------- .../request_pane/request_headers.dart | 50 ++++++++++---- .../request_pane/request_params.dart | 50 ++++++++++---- 3 files changed, 115 insertions(+), 50 deletions(-) diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart index f77133e7..cec94eab 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart @@ -18,12 +18,20 @@ class _FormDataBodyState extends ConsumerState { late int seed; final random = Random.secure(); late List rows; + @override void initState() { super.initState(); seed = random.nextInt(kRandMax); } + void _onFieldChange(String selectedId) { + ref.read(collectionStateNotifierProvider.notifier).update( + selectedId, + requestFormDataList: rows, + ); + } + @override Widget build(BuildContext context) { final selectedId = ref.watch(selectedIdStateProvider); @@ -168,36 +176,49 @@ class _FormDataBodyState extends ConsumerState { rows.removeAt(row.index); } _onFieldChange(selectedId!); - setState(() {}); }, ); }, ), ], ); - return Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: kBorderRadius12, - ), - margin: kP10, - child: Column( - children: [ - Expanded( - child: DaviTheme( - data: kTableThemeData, - child: Davi(daviModelRows), + return Stack( + children: [ + Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.background, + borderRadius: kBorderRadius12, + ), + margin: kP10, + child: Column( + children: [ + Expanded( + child: DaviTheme( + data: kTableThemeData, + child: Davi(daviModelRows), + ), + ), + ], + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.only(bottom: 30), + child: ElevatedButton.icon( + onPressed: () { + rows.add(kFormDataEmptyModel); + _onFieldChange(selectedId!); + }, + icon: const Icon(Icons.add), + label: const Text( + "Add Form Data", + style: kTextStyleButton, + ), ), ), - ], - ), + ), + ], ); } - - void _onFieldChange(String selectedId) { - ref.read(collectionStateNotifierProvider.notifier).update( - selectedId, - requestFormDataList: rows, - ); - } } diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart index 560955c0..f77fda32 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart @@ -160,22 +160,44 @@ class EditRequestHeadersState extends ConsumerState { ), ], ); - return Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: kBorderRadius12, - ), - margin: kP10, - child: Column( - children: [ - Expanded( - child: DaviTheme( - data: kTableThemeData, - child: Davi(model), + return Stack( + children: [ + Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.background, + borderRadius: kBorderRadius12, + ), + margin: kP10, + child: Column( + children: [ + Expanded( + child: DaviTheme( + data: kTableThemeData, + child: Davi(model), + ), + ), + ], + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.only(bottom: 30), + child: ElevatedButton.icon( + onPressed: () { + rows.add(kNameValueEmptyModel); + isRowEnabledList.add(false); + _onFieldChange(selectedId!); + }, + icon: const Icon(Icons.add), + label: const Text( + "Add Header", + style: kTextStyleButton, + ), ), ), - ], - ), + ), + ], ); } } diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart index 3bb018cb..dfc78c50 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart @@ -161,22 +161,44 @@ class EditRequestURLParamsState extends ConsumerState { ), ], ); - return Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.background, - borderRadius: kBorderRadius12, - ), - margin: kP10, - child: Column( - children: [ - Expanded( - child: DaviTheme( - data: kTableThemeData, - child: Davi(model), + return Stack( + children: [ + Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.background, + borderRadius: kBorderRadius12, + ), + margin: kP10, + child: Column( + children: [ + Expanded( + child: DaviTheme( + data: kTableThemeData, + child: Davi(model), + ), + ), + ], + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.only(bottom: 30), + child: ElevatedButton.icon( + onPressed: () { + rows.add(kNameValueEmptyModel); + isRowEnabledList.add(false); + _onFieldChange(selectedId!); + }, + icon: const Icon(Icons.add), + label: const Text( + "Add Param", + style: kTextStyleButton, + ), ), ), - ], - ), + ), + ], ); } } From a2c20eedc153ef58412378be0a14eb5de6e3bc4a Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Mon, 18 Mar 2024 01:17:18 +0530 Subject: [PATCH 06/14] fix: empty row when rows exist --- .../request_pane/request_form_data.dart | 80 +++++++++-------- .../request_pane/request_headers.dart | 86 ++++++++++--------- .../request_pane/request_params.dart | 86 +++++++++++-------- 3 files changed, 139 insertions(+), 113 deletions(-) diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart index cec94eab..b3d8f67c 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart @@ -17,7 +17,7 @@ class FormDataWidget extends ConsumerStatefulWidget { class _FormDataBodyState extends ConsumerState { late int seed; final random = Random.secure(); - late List rows; + late List formRows; @override void initState() { @@ -28,7 +28,7 @@ class _FormDataBodyState extends ConsumerState { void _onFieldChange(String selectedId) { ref.read(collectionStateNotifierProvider.notifier).update( selectedId, - requestFormDataList: rows, + requestFormDataList: formRows.sublist(0, formRows.length - 1), ); } @@ -37,12 +37,17 @@ class _FormDataBodyState extends ConsumerState { final selectedId = ref.watch(selectedIdStateProvider); ref.watch(selectedRequestModelProvider .select((value) => value?.requestFormDataList?.length)); - var formRows = ref.read(selectedRequestModelProvider)?.requestFormDataList; - rows = - formRows == null || formRows.isEmpty ? [kFormDataEmptyModel] : formRows; + var rF = ref.read(selectedRequestModelProvider)?.requestFormDataList; + bool isFormDataEmpty = rF == null || rF.isEmpty; + List rows = (isFormDataEmpty) + ? [ + kFormDataEmptyModel, + ] + : rF; + formRows = isFormDataEmpty ? rows : rows + [kFormDataEmptyModel]; DaviModel daviModelRows = DaviModel( - rows: rows, + rows: formRows, columns: [ DaviColumn( cellPadding: kpsV5, @@ -50,27 +55,28 @@ class _FormDataBodyState extends ConsumerState { grow: 4, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == formRows.length; return Theme( data: Theme.of(context), child: FormDataField( keyId: "$selectedId-$idx-form-v-$seed", - initialValue: rows[idx].name, + initialValue: formRows[idx].name, hintText: " Add Key", onChanged: (value) { - rows[idx] = rows[idx].copyWith(name: value); - if (idx == rows.length - 1) rows.add(kFormDataEmptyModel); + formRows[idx] = formRows[idx].copyWith(name: value); + if (isLast) formRows.add(kFormDataEmptyModel); _onFieldChange(selectedId!); }, colorScheme: Theme.of(context).colorScheme, - formDataType: rows[idx].type, + formDataType: formRows[idx].type, onFormDataTypeChanged: (value) { - bool hasChanged = rows[idx].type != value; - rows[idx] = rows[idx].copyWith( + bool hasChanged = formRows[idx].type != value; + formRows[idx] = formRows[idx].copyWith( type: value ?? FormDataType.text, ); - rows[idx] = rows[idx].copyWith(value: ""); - if (idx == rows.length - 1 && hasChanged) { - rows.add(kFormDataEmptyModel); + formRows[idx] = formRows[idx].copyWith(value: ""); + if (idx == formRows.length - 1 && hasChanged) { + formRows.add(kFormDataEmptyModel); } setState(() {}); _onFieldChange(selectedId!); @@ -97,7 +103,8 @@ class _FormDataBodyState extends ConsumerState { cellPadding: kpsV5, cellBuilder: (_, row) { int idx = row.index; - return rows[idx].type == FormDataType.file + bool isLast = idx + 1 == formRows.length; + return formRows[idx].type == FormDataType.file ? Align( alignment: Alignment.centerLeft, child: Row( @@ -122,7 +129,7 @@ class _FormDataBodyState extends ConsumerState { if (pickedResult != null && pickedResult.files.isNotEmpty && pickedResult.files.first.path != null) { - rows[idx] = rows[idx].copyWith( + formRows[idx] = formRows[idx].copyWith( value: pickedResult.files.first.path!, ); setState(() {}); @@ -130,9 +137,9 @@ class _FormDataBodyState extends ConsumerState { } }, label: Text( - (rows[idx].type == FormDataType.file && - rows[idx].value.isNotEmpty) - ? rows[idx].value.toString() + (formRows[idx].type == FormDataType.file && + formRows[idx].value.isNotEmpty) + ? formRows[idx].value.toString() : "Select File", textAlign: TextAlign.center, overflow: TextOverflow.ellipsis, @@ -146,11 +153,11 @@ class _FormDataBodyState extends ConsumerState { ) : CellField( keyId: "$selectedId-$idx-form-v-$seed", - initialValue: rows[idx].value, + initialValue: formRows[idx].value, hintText: " Add Value", onChanged: (value) { - rows[idx] = rows[idx].copyWith(value: value); - if (idx == rows.length - 1) rows.add(kFormDataEmptyModel); + formRows[idx] = formRows[idx].copyWith(value: value); + if (isLast) formRows.add(kFormDataEmptyModel); _onFieldChange(selectedId!); }, colorScheme: Theme.of(context).colorScheme, @@ -162,21 +169,24 @@ class _FormDataBodyState extends ConsumerState { pinStatus: PinStatus.none, width: 30, cellBuilder: (_, row) { + bool isLast = row.index + 1 == formRows.length; return InkWell( + onTap: isLast + ? null + : () { + seed = random.nextInt(kRandMax); + if (formRows.length == 2) { + setState(() { + formRows = [kFormDataEmptyModel]; + }); + } else { + formRows.removeAt(row.index); + } + _onFieldChange(selectedId!); + }, child: Theme.of(context).brightness == Brightness.dark ? kIconRemoveDark : kIconRemoveLight, - onTap: () { - seed = random.nextInt(kRandMax); - if (rows.length == 1) { - setState(() { - rows = [kFormDataEmptyModel]; - }); - } else { - rows.removeAt(row.index); - } - _onFieldChange(selectedId!); - }, ); }, ), @@ -207,7 +217,7 @@ class _FormDataBodyState extends ConsumerState { padding: const EdgeInsets.only(bottom: 30), child: ElevatedButton.icon( onPressed: () { - rows.add(kFormDataEmptyModel); + formRows.add(kFormDataEmptyModel); _onFieldChange(selectedId!); }, icon: const Icon(Icons.add), diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart index f77fda32..e5b0df59 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart @@ -15,10 +15,10 @@ class EditRequestHeaders extends ConsumerStatefulWidget { } class EditRequestHeadersState extends ConsumerState { - final random = Random.secure(); - late List rows; - late List isRowEnabledList; late int seed; + final random = Random.secure(); + late List headerRows; + late List isRowEnabledList; @override void initState() { @@ -29,8 +29,9 @@ class EditRequestHeadersState extends ConsumerState { void _onFieldChange(String selectedId) { ref.read(collectionStateNotifierProvider.notifier).update( selectedId, - requestHeaders: rows, - isHeaderEnabledList: isRowEnabledList, + requestHeaders: headerRows.sublist(0, headerRows.length - 1), + isHeaderEnabledList: + isRowEnabledList.sublist(0, headerRows.length - 1), ); } @@ -41,31 +42,30 @@ class EditRequestHeadersState extends ConsumerState { .select((value) => value?.requestHeaders?.length)); var rH = ref.read(selectedRequestModelProvider)?.requestHeaders; bool isHeadersEmpty = rH == null || rH.isEmpty; - rows = (isHeadersEmpty) + List rows = (isHeadersEmpty) ? [ kNameValueEmptyModel, ] : rH; - isRowEnabledList = ref - .read(selectedRequestModelProvider) - ?.isHeaderEnabledList ?? - List.filled(rows.length, isHeadersEmpty ? false : true, growable: true); + headerRows = isHeadersEmpty ? rows : rows + [kNameValueEmptyModel]; + isRowEnabledList = + ref.read(selectedRequestModelProvider)?.isHeaderEnabledList ?? + List.filled(rH?.length ?? 0, true, growable: true); + isRowEnabledList.add(false); DaviModel model = DaviModel( - rows: rows, + rows: headerRows, columns: [ DaviColumn( name: 'Checkbox', width: 30, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == headerRows.length; return CheckBox( keyId: "$selectedId-$idx-headers-c-$seed", value: isRowEnabledList[idx], - onChanged: rows.length == 1 && - idx == 0 && - rows[idx].name.isEmpty && - rows[idx].value.isEmpty + onChanged: isLast ? null : (value) { setState(() { @@ -83,15 +83,16 @@ class EditRequestHeadersState extends ConsumerState { grow: 1, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == headerRows.length; return HeaderField( keyId: "$selectedId-$idx-headers-k-$seed", - initialValue: rows[idx].name, + initialValue: headerRows[idx].name, hintText: "Add Header Name", onChanged: (value) { - isRowEnabledList[idx] = true; - rows[idx] = rows[idx].copyWith(name: value); - if (idx == rows.length - 1) { - rows.add(kNameValueEmptyModel); + headerRows[idx] = headerRows[idx].copyWith(name: value); + if (isLast) { + isRowEnabledList[idx] = true; + headerRows.add(kNameValueEmptyModel); isRowEnabledList.add(false); } _onFieldChange(selectedId!); @@ -115,14 +116,16 @@ class EditRequestHeadersState extends ConsumerState { grow: 1, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == headerRows.length; return CellField( keyId: "$selectedId-$idx-headers-v-$seed", - initialValue: rows[idx].value, + initialValue: headerRows[idx].value, hintText: " Add Header Value", onChanged: (value) { - rows[idx] = rows[idx].copyWith(value: value); - if (idx == rows.length - 1) { - rows.add(kNameValueEmptyModel); + headerRows[idx] = headerRows[idx].copyWith(value: value); + if (isLast) { + isRowEnabledList[idx] = true; + headerRows.add(kNameValueEmptyModel); isRowEnabledList.add(false); } _onFieldChange(selectedId!); @@ -136,25 +139,28 @@ class EditRequestHeadersState extends ConsumerState { pinStatus: PinStatus.none, width: 30, cellBuilder: (_, row) { + bool isLast = row.index + 1 == headerRows.length; return InkWell( + onTap: isLast + ? null + : () { + seed = random.nextInt(kRandMax); + if (headerRows.length == 2) { + setState(() { + headerRows = [ + kNameValueEmptyModel, + ]; + isRowEnabledList = [false]; + }); + } else { + headerRows.removeAt(row.index); + isRowEnabledList.removeAt(row.index); + } + _onFieldChange(selectedId!); + }, child: Theme.of(context).brightness == Brightness.dark ? kIconRemoveDark : kIconRemoveLight, - onTap: () { - seed = random.nextInt(kRandMax); - if (rows.length == 1) { - setState(() { - rows = [ - kNameValueEmptyModel, - ]; - isRowEnabledList = [false]; - }); - } else { - rows.removeAt(row.index); - isRowEnabledList.removeAt(row.index); - } - _onFieldChange(selectedId!); - }, ); }, ), @@ -185,7 +191,7 @@ class EditRequestHeadersState extends ConsumerState { padding: const EdgeInsets.only(bottom: 30), child: ElevatedButton.icon( onPressed: () { - rows.add(kNameValueEmptyModel); + headerRows.add(kNameValueEmptyModel); isRowEnabledList.add(false); _onFieldChange(selectedId!); }, diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart index dfc78c50..a306b46b 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart @@ -16,10 +16,10 @@ class EditRequestURLParams extends ConsumerStatefulWidget { } class EditRequestURLParamsState extends ConsumerState { - final random = Random.secure(); - late List rows; - late List isRowEnabledList; late int seed; + final random = Random.secure(); + late List paramRows; + late List isRowEnabledList; @override void initState() { @@ -30,9 +30,14 @@ class EditRequestURLParamsState extends ConsumerState { void _onFieldChange(String selectedId) { ref.read(collectionStateNotifierProvider.notifier).update( selectedId, - requestParams: rows, - isParamEnabledList: isRowEnabledList, + requestParams: paramRows.sublist(0, paramRows.length - 1), + isParamEnabledList: isRowEnabledList.sublist(0, paramRows.length - 1), ); + debugPrint("URL Params Updated"); + for (var i = 0; i < paramRows.length - 1; i++) { + debugPrint( + "URL Param $i: (${paramRows[i].name}=${paramRows[i].value}) ==> ${isRowEnabledList[i]}"); + } } @override @@ -42,30 +47,30 @@ class EditRequestURLParamsState extends ConsumerState { .select((value) => value?.requestParams?.length)); var rP = ref.read(selectedRequestModelProvider)?.requestParams; bool isParamsEmpty = rP == null || rP.isEmpty; - rows = (isParamsEmpty) + List rows = (isParamsEmpty) ? [ kNameValueEmptyModel, ] : rP; - isRowEnabledList = ref - .read(selectedRequestModelProvider) - ?.isParamEnabledList ?? - List.filled(rows.length, isParamsEmpty ? false : true, growable: true); + paramRows = isParamsEmpty ? rows : rows + [kNameValueEmptyModel]; + isRowEnabledList = + ref.read(selectedRequestModelProvider)?.isParamEnabledList ?? + List.filled(rP?.length ?? 0, true, growable: true); + isRowEnabledList.add(false); DaviModel model = DaviModel( - rows: rows, + rows: paramRows, columns: [ DaviColumn( name: 'Checkbox', width: 30, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == paramRows.length; return CheckBox( keyId: "$selectedId-$idx-params-c-$seed", value: isRowEnabledList[idx], - onChanged: idx + 1 == rows.length && - rows[idx].name.isEmpty && - rows[idx].value.isEmpty + onChanged: isLast ? null : (value) { setState(() { @@ -83,15 +88,16 @@ class EditRequestURLParamsState extends ConsumerState { grow: 1, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == paramRows.length; return CellField( keyId: "$selectedId-$idx-params-k-$seed", - initialValue: rows[idx].name, + initialValue: paramRows[idx].name, hintText: "Add URL Parameter", onChanged: (value) { - rows[idx] = rows[idx].copyWith(name: value); - if (idx == rows.length - 1) { + paramRows[idx] = paramRows[idx].copyWith(name: value); + if (isLast) { isRowEnabledList[idx] = true; - rows.add(kNameValueEmptyModel); + paramRows.add(kNameValueEmptyModel); isRowEnabledList.add(false); } _onFieldChange(selectedId!); @@ -115,15 +121,16 @@ class EditRequestURLParamsState extends ConsumerState { grow: 1, cellBuilder: (_, row) { int idx = row.index; + bool isLast = idx + 1 == paramRows.length; return CellField( keyId: "$selectedId-$idx-params-v-$seed", - initialValue: rows[idx].value, + initialValue: paramRows[idx].value, hintText: "Add Value", onChanged: (value) { - rows[idx] = rows[idx].copyWith(value: value); - if (idx == rows.length - 1) { + paramRows[idx] = paramRows[idx].copyWith(value: value); + if (isLast) { isRowEnabledList[idx] = true; - rows.add(kNameValueEmptyModel); + paramRows.add(kNameValueEmptyModel); isRowEnabledList.add(false); } _onFieldChange(selectedId!); @@ -137,25 +144,28 @@ class EditRequestURLParamsState extends ConsumerState { pinStatus: PinStatus.none, width: 30, cellBuilder: (_, row) { + bool isLast = row.index + 1 == paramRows.length; return InkWell( + onTap: isLast + ? null + : () { + seed = random.nextInt(kRandMax); + if (paramRows.length == 2) { + setState(() { + paramRows = [ + kNameValueEmptyModel, + ]; + isRowEnabledList = [false]; + }); + } else { + paramRows.removeAt(row.index); + isRowEnabledList.removeAt(row.index); + } + _onFieldChange(selectedId!); + }, child: Theme.of(context).brightness == Brightness.dark ? kIconRemoveDark : kIconRemoveLight, - onTap: () { - seed = random.nextInt(kRandMax); - if (rows.length == 1) { - setState(() { - rows = [ - kNameValueEmptyModel, - ]; - isRowEnabledList = [false]; - }); - } else { - rows.removeAt(row.index); - isRowEnabledList.removeAt(row.index); - } - _onFieldChange(selectedId!); - }, ); }, ), @@ -186,7 +196,7 @@ class EditRequestURLParamsState extends ConsumerState { padding: const EdgeInsets.only(bottom: 30), child: ElevatedButton.icon( onPressed: () { - rows.add(kNameValueEmptyModel); + paramRows.add(kNameValueEmptyModel); isRowEnabledList.add(false); _onFieldChange(selectedId!); }, From fb36f05792d32e881e583d702499b6a03736a5aa Mon Sep 17 00:00:00 2001 From: DenserMeerkat Date: Mon, 18 Mar 2024 01:22:16 +0530 Subject: [PATCH 07/14] refactor: remove debugPrint --- .../details_card/request_pane/request_params.dart | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart index a306b46b..319330ba 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart @@ -33,11 +33,6 @@ class EditRequestURLParamsState extends ConsumerState { requestParams: paramRows.sublist(0, paramRows.length - 1), isParamEnabledList: isRowEnabledList.sublist(0, paramRows.length - 1), ); - debugPrint("URL Params Updated"); - for (var i = 0; i < paramRows.length - 1; i++) { - debugPrint( - "URL Param $i: (${paramRows[i].name}=${paramRows[i].value}) ==> ${isRowEnabledList[i]}"); - } } @override From 97d3c30bbad6bfcc39b7c2b79885ce951368ca27 Mon Sep 17 00:00:00 2001 From: Apoorv Dwivedi Date: Mon, 18 Mar 2024 20:26:33 +0530 Subject: [PATCH 08/14] Fixed rust generated code and testcases --- lib/codegen/rust/curl_rust.dart | 17 +++--- test/codegen/curl_rust_codegen_test.dart | 73 ++++++++++++------------ 2 files changed, 46 insertions(+), 44 deletions(-) diff --git a/lib/codegen/rust/curl_rust.dart b/lib/codegen/rust/curl_rust.dart index c2189eca..fdba169c 100644 --- a/lib/codegen/rust/curl_rust.dart +++ b/lib/codegen/rust/curl_rust.dart @@ -1,5 +1,6 @@ import 'package:jinja/jinja.dart' as jj; -import 'package:apidash/utils/utils.dart' show getValidRequestUri, requestModelToHARJsonRequest; +import 'package:apidash/utils/utils.dart' + show getValidRequestUri, requestModelToHARJsonRequest; import 'package:apidash/models/models.dart' show RequestModel; import 'package:apidash/consts.dart'; @@ -31,13 +32,13 @@ fn main() { """; - String kTemplateRawBody =""" + String kTemplateRawBody = """ easy.post_fields_copy(r#"{{body}}"#.as_bytes()).unwrap(); """; - String kTemplateJsonBody =""" + String kTemplateJsonBody = """ easy.post_fields_copy(json!({{body}}).to_string().as_bytes()).unwrap(); @@ -48,14 +49,14 @@ fn main() { {% for field in fields %} form.part("{{field.name}}") {% if field.type == "file" %}.file("{{field.value}}"){% else %}.contents(b"{{field.value}}"){% endif %} - .add(); + .add().unwrap(); {% endfor %} - easy.httppost(form); + easy.httppost(form).unwrap(); """; String kTemplateHeader = """ {% if headers %}let mut list = List::new();{% for header, value in headers %} - list.append("{{header}}: {{value}}");{% endfor %} + list.append("{{header}}: {{value}}").unwrap();{% endfor %} easy.http_headers(list).unwrap(); {% endif %} @@ -86,7 +87,9 @@ fn main() { result += jj.Template(kTemplateStart).render({ "hasJsonBody": requestModel.hasJsonData, - "hasHeaders": requestModel.enabledRequestHeaders != null || requestModel.hasBody + "hasHeaders": (requestModel.enabledRequestHeaders != null && + requestModel.enabledRequestHeaders!.isNotEmpty) || + requestModel.hasBody }); var rec = getValidRequestUri( diff --git a/test/codegen/curl_rust_codegen_test.dart b/test/codegen/curl_rust_codegen_test.dart index aa337c2d..75ef133e 100644 --- a/test/codegen/curl_rust_codegen_test.dart +++ b/test/codegen/curl_rust_codegen_test.dart @@ -135,7 +135,7 @@ fn main() { easy.get(true).unwrap(); let mut list = List::new(); - list.append("User-Agent: Test Agent"); + list.append("User-Agent: Test Agent").unwrap(); easy.http_headers(list).unwrap(); { @@ -169,7 +169,7 @@ fn main() { easy.get(true).unwrap(); let mut list = List::new(); - list.append("User-Agent: Test Agent"); + list.append("User-Agent: Test Agent").unwrap(); easy.http_headers(list).unwrap(); { @@ -232,7 +232,7 @@ fn main() { easy.get(true).unwrap(); let mut list = List::new(); - list.append("User-Agent: Test Agent"); + list.append("User-Agent: Test Agent").unwrap(); easy.http_headers(list).unwrap(); { @@ -295,7 +295,7 @@ fn main() { easy.get(true).unwrap(); let mut list = List::new(); - list.append("User-Agent: Test Agent"); + list.append("User-Agent: Test Agent").unwrap(); easy.http_headers(list).unwrap(); { @@ -329,7 +329,7 @@ fn main() { easy.get(true).unwrap(); let mut list = List::new(); - list.append("User-Agent: Test Agent"); + list.append("User-Agent: Test Agent").unwrap(); easy.http_headers(list).unwrap(); { @@ -354,7 +354,6 @@ fn main() { test('GET12', () { const expectedCode = r""" use curl::easy::Easy; -use curl::easy::List; fn main() { let mut easy = Easy::new(); @@ -461,7 +460,7 @@ fn main() { }"#.as_bytes()).unwrap(); let mut list = List::new(); - list.append("Content-Type: text/plain"); + list.append("Content-Type: text/plain").unwrap(); easy.http_headers(list).unwrap(); { @@ -505,7 +504,7 @@ fn main() { }).to_string().as_bytes()).unwrap(); let mut list = List::new(); - list.append("Content-Type: application/json"); + list.append("Content-Type: application/json").unwrap(); easy.http_headers(list).unwrap(); { @@ -544,8 +543,8 @@ fn main() { }).to_string().as_bytes()).unwrap(); let mut list = List::new(); - list.append("User-Agent: Test Agent"); - list.append("Content-Type: application/json"); + list.append("User-Agent: Test Agent").unwrap(); + list.append("Content-Type: application/json").unwrap(); easy.http_headers(list).unwrap(); { @@ -582,17 +581,17 @@ fn main() { form.part("text") .contents(b"API") - .add(); + .add().unwrap(); form.part("sep") .contents(b"|") - .add(); + .add().unwrap(); form.part("times") .contents(b"3") - .add(); + .add().unwrap(); - easy.httppost(form); + easy.httppost(form).unwrap(); { let mut transfer = easy.transfer(); transfer.write_function(|new_data| { @@ -627,19 +626,19 @@ fn main() { form.part("text") .contents(b"API") - .add(); + .add().unwrap(); form.part("sep") .contents(b"|") - .add(); + .add().unwrap(); form.part("times") .contents(b"3") - .add(); + .add().unwrap(); - easy.httppost(form); + easy.httppost(form).unwrap(); let mut list = List::new(); - list.append("User-Agent: Test Agent"); + list.append("User-Agent: Test Agent").unwrap(); easy.http_headers(list).unwrap(); { @@ -676,13 +675,13 @@ fn main() { form.part("token") .contents(b"xyz") - .add(); + .add().unwrap(); form.part("imfile") .file("/Documents/up/1.png") - .add(); + .add().unwrap(); - easy.httppost(form); + easy.httppost(form).unwrap(); { let mut transfer = easy.transfer(); transfer.write_function(|new_data| { @@ -717,13 +716,13 @@ fn main() { form.part("token") .contents(b"xyz") - .add(); + .add().unwrap(); form.part("imfile") .file("/Documents/up/1.png") - .add(); + .add().unwrap(); - easy.httppost(form); + easy.httppost(form).unwrap(); { let mut transfer = easy.transfer(); transfer.write_function(|new_data| { @@ -758,17 +757,17 @@ fn main() { form.part("text") .contents(b"API") - .add(); + .add().unwrap(); form.part("sep") .contents(b"|") - .add(); + .add().unwrap(); form.part("times") .contents(b"3") - .add(); + .add().unwrap(); - easy.httppost(form); + easy.httppost(form).unwrap(); { let mut transfer = easy.transfer(); transfer.write_function(|new_data| { @@ -803,16 +802,16 @@ fn main() { form.part("token") .contents(b"xyz") - .add(); + .add().unwrap(); form.part("imfile") .file("/Documents/up/1.png") - .add(); + .add().unwrap(); - easy.httppost(form); + easy.httppost(form).unwrap(); let mut list = List::new(); - list.append("User-Agent: Test Agent"); - list.append("Keep-Alive: true"); + list.append("User-Agent: Test Agent").unwrap(); + list.append("Keep-Alive: true").unwrap(); easy.http_headers(list).unwrap(); { @@ -855,7 +854,7 @@ fn main() { }).to_string().as_bytes()).unwrap(); let mut list = List::new(); - list.append("Content-Type: application/json"); + list.append("Content-Type: application/json").unwrap(); easy.http_headers(list).unwrap(); { @@ -898,7 +897,7 @@ fn main() { }).to_string().as_bytes()).unwrap(); let mut list = List::new(); - list.append("Content-Type: application/json"); + list.append("Content-Type: application/json").unwrap(); easy.http_headers(list).unwrap(); { @@ -970,7 +969,7 @@ fn main() { }).to_string().as_bytes()).unwrap(); let mut list = List::new(); - list.append("Content-Type: application/json"); + list.append("Content-Type: application/json").unwrap(); easy.http_headers(list).unwrap(); { From beeece8875e8610898ce460d78b6d6becc5cc8ca Mon Sep 17 00:00:00 2001 From: Apoorv Dwivedi Date: Wed, 20 Mar 2024 23:13:06 +0530 Subject: [PATCH 09/14] added content type header in formdata --- lib/codegen/rust/curl_rust.dart | 2 +- ..._test.dart => rust_curl_codegen_test.dart} | 26 ++++++++++++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) rename test/codegen/{curl_rust_codegen_test.dart => rust_curl_codegen_test.dart} (97%) diff --git a/lib/codegen/rust/curl_rust.dart b/lib/codegen/rust/curl_rust.dart index fdba169c..205e10c5 100644 --- a/lib/codegen/rust/curl_rust.dart +++ b/lib/codegen/rust/curl_rust.dart @@ -124,7 +124,7 @@ fn main() { var headersList = requestModel.enabledRequestHeaders; if (headersList != null || requestModel.hasBody) { var headers = requestModel.enabledHeadersMap; - if (requestModel.hasJsonData || requestModel.hasTextData) { + if (requestModel.hasJsonData || requestModel.hasTextData || requestModel.hasFormData) { headers.putIfAbsent(kHeaderContentType, () => requestModel.requestBodyContentType.header); } diff --git a/test/codegen/curl_rust_codegen_test.dart b/test/codegen/rust_curl_codegen_test.dart similarity index 97% rename from test/codegen/curl_rust_codegen_test.dart rename to test/codegen/rust_curl_codegen_test.dart index 75ef133e..39aa7d9e 100644 --- a/test/codegen/curl_rust_codegen_test.dart +++ b/test/codegen/rust_curl_codegen_test.dart @@ -592,7 +592,11 @@ fn main() { .add().unwrap(); easy.httppost(form).unwrap(); - { + let mut list = List::new(); + list.append("Content-Type: multipart/form-data").unwrap(); + easy.http_headers(list).unwrap(); + + { let mut transfer = easy.transfer(); transfer.write_function(|new_data| { data.extend_from_slice(new_data); @@ -639,6 +643,7 @@ fn main() { easy.httppost(form).unwrap(); let mut list = List::new(); list.append("User-Agent: Test Agent").unwrap(); + list.append("Content-Type: multipart/form-data").unwrap(); easy.http_headers(list).unwrap(); { @@ -682,7 +687,11 @@ fn main() { .add().unwrap(); easy.httppost(form).unwrap(); - { + let mut list = List::new(); + list.append("Content-Type: multipart/form-data").unwrap(); + easy.http_headers(list).unwrap(); + + { let mut transfer = easy.transfer(); transfer.write_function(|new_data| { data.extend_from_slice(new_data); @@ -723,7 +732,11 @@ fn main() { .add().unwrap(); easy.httppost(form).unwrap(); - { + let mut list = List::new(); + list.append("Content-Type: multipart/form-data").unwrap(); + easy.http_headers(list).unwrap(); + + { let mut transfer = easy.transfer(); transfer.write_function(|new_data| { data.extend_from_slice(new_data); @@ -768,7 +781,11 @@ fn main() { .add().unwrap(); easy.httppost(form).unwrap(); - { + let mut list = List::new(); + list.append("Content-Type: multipart/form-data").unwrap(); + easy.http_headers(list).unwrap(); + + { let mut transfer = easy.transfer(); transfer.write_function(|new_data| { data.extend_from_slice(new_data); @@ -812,6 +829,7 @@ fn main() { let mut list = List::new(); list.append("User-Agent: Test Agent").unwrap(); list.append("Keep-Alive: true").unwrap(); + list.append("Content-Type: multipart/form-data").unwrap(); easy.http_headers(list).unwrap(); { From f99a84375a09ffb5931e4fd73f817983ff117cd1 Mon Sep 17 00:00:00 2001 From: Apoorv Dwivedi Date: Thu, 21 Mar 2024 02:40:47 +0530 Subject: [PATCH 10/14] Fixed headers and corresponding template --- lib/codegen/rust/curl_rust.dart | 4 ++-- test/codegen/rust_curl_codegen_test.dart | 30 ++++-------------------- 2 files changed, 6 insertions(+), 28 deletions(-) diff --git a/lib/codegen/rust/curl_rust.dart b/lib/codegen/rust/curl_rust.dart index 205e10c5..9f461a64 100644 --- a/lib/codegen/rust/curl_rust.dart +++ b/lib/codegen/rust/curl_rust.dart @@ -89,7 +89,7 @@ fn main() { "hasJsonBody": requestModel.hasJsonData, "hasHeaders": (requestModel.enabledRequestHeaders != null && requestModel.enabledRequestHeaders!.isNotEmpty) || - requestModel.hasBody + (requestModel.hasJsonData || requestModel.hasTextData) }); var rec = getValidRequestUri( @@ -124,7 +124,7 @@ fn main() { var headersList = requestModel.enabledRequestHeaders; if (headersList != null || requestModel.hasBody) { var headers = requestModel.enabledHeadersMap; - if (requestModel.hasJsonData || requestModel.hasTextData || requestModel.hasFormData) { + if (requestModel.hasJsonData || requestModel.hasTextData) { headers.putIfAbsent(kHeaderContentType, () => requestModel.requestBodyContentType.header); } diff --git a/test/codegen/rust_curl_codegen_test.dart b/test/codegen/rust_curl_codegen_test.dart index 39aa7d9e..bcdcdada 100644 --- a/test/codegen/rust_curl_codegen_test.dart +++ b/test/codegen/rust_curl_codegen_test.dart @@ -569,7 +569,6 @@ fn main() { test('POST4', () { const expectedCode = r""" use curl::easy::Easy; -use curl::easy::List; fn main() { let mut easy = Easy::new(); @@ -592,11 +591,7 @@ fn main() { .add().unwrap(); easy.httppost(form).unwrap(); - let mut list = List::new(); - list.append("Content-Type: multipart/form-data").unwrap(); - easy.http_headers(list).unwrap(); - - { + { let mut transfer = easy.transfer(); transfer.write_function(|new_data| { data.extend_from_slice(new_data); @@ -643,7 +638,6 @@ fn main() { easy.httppost(form).unwrap(); let mut list = List::new(); list.append("User-Agent: Test Agent").unwrap(); - list.append("Content-Type: multipart/form-data").unwrap(); easy.http_headers(list).unwrap(); { @@ -668,7 +662,6 @@ fn main() { test('POST6', () { const expectedCode = r""" use curl::easy::Easy; -use curl::easy::List; fn main() { let mut easy = Easy::new(); @@ -687,11 +680,7 @@ fn main() { .add().unwrap(); easy.httppost(form).unwrap(); - let mut list = List::new(); - list.append("Content-Type: multipart/form-data").unwrap(); - easy.http_headers(list).unwrap(); - - { + { let mut transfer = easy.transfer(); transfer.write_function(|new_data| { data.extend_from_slice(new_data); @@ -713,7 +702,6 @@ fn main() { test('POST7', () { const expectedCode = r""" use curl::easy::Easy; -use curl::easy::List; fn main() { let mut easy = Easy::new(); @@ -732,11 +720,7 @@ fn main() { .add().unwrap(); easy.httppost(form).unwrap(); - let mut list = List::new(); - list.append("Content-Type: multipart/form-data").unwrap(); - easy.http_headers(list).unwrap(); - - { + { let mut transfer = easy.transfer(); transfer.write_function(|new_data| { data.extend_from_slice(new_data); @@ -758,7 +742,6 @@ fn main() { test('POST8', () { const expectedCode = r""" use curl::easy::Easy; -use curl::easy::List; fn main() { let mut easy = Easy::new(); @@ -781,11 +764,7 @@ fn main() { .add().unwrap(); easy.httppost(form).unwrap(); - let mut list = List::new(); - list.append("Content-Type: multipart/form-data").unwrap(); - easy.http_headers(list).unwrap(); - - { + { let mut transfer = easy.transfer(); transfer.write_function(|new_data| { data.extend_from_slice(new_data); @@ -829,7 +808,6 @@ fn main() { let mut list = List::new(); list.append("User-Agent: Test Agent").unwrap(); list.append("Keep-Alive: true").unwrap(); - list.append("Content-Type: multipart/form-data").unwrap(); easy.http_headers(list).unwrap(); { From fd03e704b2669f7f055d574234f46cc565681f6d Mon Sep 17 00:00:00 2001 From: Yousef Rabia <78663127+Yousef-Rabia@users.noreply.github.com> Date: Thu, 21 Mar 2024 02:03:00 +0200 Subject: [PATCH 11/14] Add Android Additional Instructions --- CONTRIBUTING.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 211eaf06..ec24ec76 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -131,6 +131,19 @@ Instead of copy pasting from pub.dev, it is recommended that you use `flutter pu ## Platform-specific Additional Instructions +### Android +Add the `multiDexEnabled true` line to the `defaultConfig` section at `android/app/build.gradle file` + +``` +android { + ... + defaultConfig { + ... + multiDexEnabled true + } +} +``` + ### macOS Add below keys to `macos/Runner/DebugProfile.entitlements` and `macos/Runner/Release.entitlements`. From decd1d68ebc51482ffda81833e4b52201534903b Mon Sep 17 00:00:00 2001 From: Apoorv Dwivedi Date: Thu, 21 Mar 2024 20:53:48 +0530 Subject: [PATCH 12/14] Padded response body print statement --- lib/codegen/rust/curl_rust.dart | 2 +- test/codegen/rust_curl_codegen_test.dart | 54 ++++++++++++------------ 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/lib/codegen/rust/curl_rust.dart b/lib/codegen/rust/curl_rust.dart index 9f461a64..9299554f 100644 --- a/lib/codegen/rust/curl_rust.dart +++ b/lib/codegen/rust/curl_rust.dart @@ -74,7 +74,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; diff --git a/test/codegen/rust_curl_codegen_test.dart b/test/codegen/rust_curl_codegen_test.dart index bcdcdada..badc18ba 100644 --- a/test/codegen/rust_curl_codegen_test.dart +++ b/test/codegen/rust_curl_codegen_test.dart @@ -28,7 +28,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -57,7 +57,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -86,7 +86,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -115,7 +115,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -149,7 +149,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -183,7 +183,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -212,7 +212,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -246,7 +246,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -275,7 +275,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -309,7 +309,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -343,7 +343,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -372,7 +372,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -404,7 +404,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -433,7 +433,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -474,7 +474,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -518,7 +518,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -558,7 +558,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -602,7 +602,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -651,7 +651,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -691,7 +691,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -731,7 +731,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -775,7 +775,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -821,7 +821,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -864,7 +864,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -907,7 +907,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -939,7 +939,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( @@ -979,7 +979,7 @@ fn main() { let response_body = String::from_utf8_lossy(&data); - println!("Response body:{}", response_body); + println!("Response body: {}", response_body); println!("Response code: {}", easy.response_code().unwrap()); }"""; expect( From a076a7a6cb3de4bb640a1d4e38091c1a2b7dd502 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Thu, 21 Mar 2024 23:28:24 +0530 Subject: [PATCH 13/14] Update CONTRIBUTING.md --- CONTRIBUTING.md | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ec24ec76..32f79e5c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -131,19 +131,6 @@ Instead of copy pasting from pub.dev, it is recommended that you use `flutter pu ## Platform-specific Additional Instructions -### Android -Add the `multiDexEnabled true` line to the `defaultConfig` section at `android/app/build.gradle file` - -``` -android { - ... - defaultConfig { - ... - multiDexEnabled true - } -} -``` - ### macOS Add below keys to `macos/Runner/DebugProfile.entitlements` and `macos/Runner/Release.entitlements`. @@ -167,4 +154,16 @@ ClientException with SocketException: Connection failed (OS Error: Operation not You can read more [here](https://docs.flutter.dev/platform-integration/macos/building#setting-up-entitlements) +### Android (Work in Progress) +Add the `multiDexEnabled true` line to the `defaultConfig` section at `android/app/build.gradle file` + +``` +android { + ... + defaultConfig { + ... + multiDexEnabled true + } +} +``` From adfbc2bce84a1ff55cd5b30f339301bde8c83e21 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Fri, 22 Mar 2024 09:17:24 +0530 Subject: [PATCH 14/14] fixes --- lib/codegen/codegen.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index e343b241..f3f606ae 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -1,4 +1,3 @@ -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; @@ -10,6 +9,7 @@ import 'php/guzzle.dart'; import 'python/http_client.dart'; import 'python/requests.dart'; import 'rust/actix.dart'; +import 'rust/curl_rust.dart'; import 'rust/reqwest.dart'; import 'rust/ureq.dart'; import 'js/axios.dart'; @@ -74,10 +74,10 @@ class Codegen { return PythonRequestsCodeGen().getCode(rM, boundary: boundary); case CodegenLanguage.rustActix: return RustActixCodeGen().getCode(rM, boundary: boundary); - case CodegenLanguage.rustReqwest: - return RustReqwestCodeGen().getCode(rM); case CodegenLanguage.rustCurl: return RustCurlCodeGen().getCode(rM); + case CodegenLanguage.rustReqwest: + return RustReqwestCodeGen().getCode(rM); case CodegenLanguage.rustUreq: return RustUreqCodeGen().getCode(rM, boundary: boundary); case CodegenLanguage.phpGuzzle: