From f5c49d4ac97d76de8e71d212b120d97ab270b561 Mon Sep 17 00:00:00 2001 From: Deepraj Baidya <63138398+deepraj02@users.noreply.github.com> Date: Wed, 28 Aug 2024 17:32:21 +0530 Subject: [PATCH] Feat/codegen url session (#1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ (wip): codegen `URLSession` configs * 📝 (chore): docs update and deps install * ✨ (feat): `URLSession` codegen * ✅ (test): `test/codegen/swift_urlsession_test.dart` --wip --- README.md | 1 + lib/codegen/codegen.dart | 26 ++++--- lib/codegen/swift/urlsession.dart | 94 +++++++++++++++++++++++++ lib/consts.dart | 4 +- pubspec.lock | 4 +- test/codegen/swift_urlsession_test.dart | 0 6 files changed, 115 insertions(+), 14 deletions(-) create mode 100644 lib/codegen/swift/urlsession.dart create mode 100644 test/codegen/swift_urlsession_test.dart diff --git a/README.md b/README.md index 2da72ff9..5c57ebe9 100644 --- a/README.md +++ b/README.md @@ -133,6 +133,7 @@ API Dash currently supports API integration code generation for the following la | Rust | `reqwest` | | | Rust | `ureq` | | | Rust | `Actix Client` | | +| Swift | `URLSession` | | | Java | `asynchttpclient` | | | Java | `HttpClient` | | | Java | `okhttp3` | | diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index 514d0af5..fe468ad0 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -1,13 +1,23 @@ -import 'package:apidash/models/models.dart'; import 'package:apidash/consts.dart'; +import 'package:apidash/models/models.dart'; import 'package:apidash/utils/utils.dart' show getNewUuid; + import 'c/curl.dart'; import 'csharp/http_client.dart'; import 'csharp/rest_sharp.dart'; -import 'dart/http.dart'; import 'dart/dio.dart'; +import 'dart/http.dart'; import 'go/http.dart'; +import 'java/async_http_client.dart'; +import 'java/httpclient.dart'; +import 'java/okhttp.dart'; +import 'java/unirest.dart'; +import 'js/axios.dart'; +import 'js/fetch.dart'; +import 'julia/http.dart'; import 'kotlin/okhttp.dart'; +import 'others/curl.dart'; +import 'others/har.dart'; import 'php/curl.dart'; import 'php/guzzle.dart'; import 'php/http_plug.dart'; @@ -19,15 +29,7 @@ import 'rust/actix.dart'; import 'rust/curl_rust.dart'; import 'rust/reqwest.dart'; import 'rust/ureq.dart'; -import 'js/axios.dart'; -import 'js/fetch.dart'; -import 'others/har.dart'; -import 'others/curl.dart'; -import 'julia/http.dart'; -import 'java/unirest.dart'; -import 'java/okhttp.dart'; -import 'java/async_http_client.dart'; -import 'java/httpclient.dart'; +import 'swift/urlsession.dart'; class Codegen { String? getCode( @@ -98,6 +100,8 @@ class Codegen { return RustReqwestCodeGen().getCode(rM); case CodegenLanguage.rustUreq: return RustUreqCodeGen().getCode(rM, boundary: boundary); + case CodegenLanguage.swiftUrlsession: + return SwiftURLSessionCodeGen().getCode(rM); case CodegenLanguage.phpGuzzle: return PhpGuzzleCodeGen().getCode(rM); case CodegenLanguage.phpCurl: diff --git a/lib/codegen/swift/urlsession.dart b/lib/codegen/swift/urlsession.dart new file mode 100644 index 00000000..b3c57c8d --- /dev/null +++ b/lib/codegen/swift/urlsession.dart @@ -0,0 +1,94 @@ +import 'package:apidash/consts.dart'; +import 'package:apidash/models/models.dart'; +import 'package:apidash/utils/utils.dart' show getValidRequestUri; +import 'package:jinja/jinja.dart' as jj; + +class SwiftURLSessionCodeGen { + final String kTemplateStart = """ +import Foundation + +"""; + + final String kTemplateParameters = ''' +let parameters = "{{parameters}}" +let postData = parameters.data(using: .utf8) + +'''; + + final String kTemplateRequest = """ +var request = URLRequest(url: URL(string: "{{url}}")!,timeoutInterval: Double.infinity) +request.httpMethod = "{{method}}" + +"""; + + final String kTemplateHeaders = """ +{% for header, value in headers %} +request.addValue("{{value}}", forHTTPHeaderField: "{{header}}") +{% endfor %} + +"""; + + final String kTemplateBody = """ +request.httpBody = postData + +"""; + + final String kTemplateEnd = """ +let task = URLSession.shared.dataTask(with: request) { data, response, error in + guard let data = data else { + print(String(describing: error)) + return + } + print(String(data: data, encoding: .utf8)!) +} +task.resume() +"""; + + String? getCode(HttpRequestModel requestModel) { + try { + String result = kTemplateStart; + + var rec = + getValidRequestUri(requestModel.url, requestModel.enabledParams); + Uri? uri = rec.$1; + + // if (uri == null) { + // throw Exception("Invalid URL"); + // } + + if (requestModel.hasJsonData || requestModel.hasTextData) { + var templateParameters = jj.Template(kTemplateParameters); + result += templateParameters.render({ + "parameters": + requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n') + }); + } + + var templateRequest = jj.Template(kTemplateRequest); + result += templateRequest.render({ + "url": uri.toString(), + "method": requestModel.method.name.toUpperCase() + }); + + var headers = requestModel.enabledHeadersMap; + if (requestModel.hasJsonData || requestModel.hasTextData) { + headers.putIfAbsent( + kHeaderContentType, () => requestModel.bodyContentType.header); + } + if (headers.isNotEmpty) { + var templateHeader = jj.Template(kTemplateHeaders); + result += templateHeader.render({"headers": headers}); + } + + if (requestModel.hasTextData || requestModel.hasJsonData) { + result += kTemplateBody; + } + + result += kTemplateEnd; + + return result; + } catch (e) { + return null; + } + } +} diff --git a/lib/consts.dart b/lib/consts.dart index 9d72e0e3..ef8d74fc 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -1,5 +1,6 @@ -import 'dart:io'; import 'dart:convert'; +import 'dart:io'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -391,6 +392,7 @@ enum CodegenLanguage { rustReqwest("Rust (reqwest)", "rust", "rs"), rustCurl("Rust (curl-rust)", "rust", "rs"), rustUreq("Rust (ureq)", "rust", "rs"), + swiftUrlsession("Swift (urlsession)", "swift", "swift"), javaOkHttp("Java (okhttp3)", "java", 'java'), javaAsyncHttpClient("Java (asynchttpclient)", "java", "java"), javaHttpClient("Java (HttpClient)", "java", "java"), diff --git a/pubspec.lock b/pubspec.lock index f4140996..696e9f0a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1576,10 +1576,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.2.4" watcher: dependency: transitive description: diff --git a/test/codegen/swift_urlsession_test.dart b/test/codegen/swift_urlsession_test.dart new file mode 100644 index 00000000..e69de29b