diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index 8883a098..414fded1 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -1 +1,30 @@ -export 'dart/pkg_http.dart'; +import 'package:apidash/codegen/kotlin/pkg_okhttp.dart'; +import 'package:apidash/consts.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +import '../models/request_model.dart'; +import '../providers/collection_providers.dart'; +import '../providers/settings_providers.dart'; +import 'dart/pkg_http.dart'; + +class Codegen { + const Codegen({required this.codegenLanguage}); + final CodegenLanguage codegenLanguage; + String? getCode( + WidgetRef ref, + RequestModel requestModel, + String defaultUriScheme, + ) { + final activeRequestModel = ref.watch(activeRequestModelProvider); + final defaultUriScheme = + ref.watch(settingsProvider.select((value) => value.defaultUriScheme)); + switch (codegenLanguage) { + case CodegenLanguage.dartHttp: + return DartHttpCodeGen().getCode(activeRequestModel!, defaultUriScheme); + case CodegenLanguage.kotlinOkHttp: + return KotlinOkHttpCodeGen().getCode(activeRequestModel!); + default: + throw ArgumentError('Invalid codegenLanguage'); + } + } +} diff --git a/lib/codegen/kotlin/pkg_okhttp.dart b/lib/codegen/kotlin/pkg_okhttp.dart new file mode 100644 index 00000000..365efb3c --- /dev/null +++ b/lib/codegen/kotlin/pkg_okhttp.dart @@ -0,0 +1,78 @@ +import 'package:apidash/consts.dart'; + +import '../../models/request_model.dart'; + +class KotlinOkHttpCodeGen { + final String headerSnippet = """import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MultipartBody +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import java.io.File +import java.util.concurrent.TimeUnit + +val client = OkHttpClient() +"""; + + final String footerSnippet = """ .build() +val response = client.newCall(request).execute() + +println(response.body!!.string()) +"""; + String getCode(RequestModel requestModel) { + String result = ""; + result = result + headerSnippet; + if (requestModel.method != HTTPVerb.get && + requestModel.method != HTTPVerb.head) { + result = + """${result}val mediaType = "${requestModel.requestBodyContentType == ContentType.json ? "application/json" : "text/plain"}".toMediaType() +val body = "${requestModel.requestBody}".toRequestBody(mediaType)\n"""; + } + result = "${result}val request = Request.Builder()\n"; + + result = "$result .url(\"${requestModel.url}\")\n"; + result = result + addQueryParams(requestModel); + result = result + addRequestMethod(requestModel); + result = result + addHeaders(requestModel); + result = result + footerSnippet; + + return result; + } + + String addQueryParams(RequestModel requestModel) { + String result = ""; + if (requestModel.requestParams == null) { + return result; + } + for (final queryParam in requestModel.requestParams!) { + result = + """$result .addQueryParameter("${queryParam.k}", "${queryParam.v}")\n"""; + } + return result; + } + + String addHeaders(RequestModel requestModel) { + String result = ""; + if (requestModel.requestHeaders == null) { + return result; + } + for (final header in requestModel.requestHeaders!) { + result = """$result .addHeader("${header.k}", "${header.v}")\n"""; + } + return result; + } + + String addRequestMethod(RequestModel requestModel) { + String result = ""; + if (requestModel.method != HTTPVerb.get && + requestModel.method != HTTPVerb.head && + requestModel.method != HTTPVerb.delete) { + result = """$result .${requestModel.method.name}(body)\n"""; + } + if (requestModel.method == HTTPVerb.delete) { + result = """$result .method("DELETE", body)\n"""; + } + return result; + } +} diff --git a/lib/screens/home_page/editor_pane/details_card/code_pane.dart b/lib/screens/home_page/editor_pane/details_card/code_pane.dart index 4317e3b4..da649415 100644 --- a/lib/screens/home_page/editor_pane/details_card/code_pane.dart +++ b/lib/screens/home_page/editor_pane/details_card/code_pane.dart @@ -13,8 +13,6 @@ class CodePane extends ConsumerStatefulWidget { } class _CodePaneState extends ConsumerState { - final DartHttpCodeGen dartHttpCodeGen = DartHttpCodeGen(); - @override void initState() { super.initState(); @@ -22,10 +20,13 @@ class _CodePaneState extends ConsumerState { @override Widget build(BuildContext context) { + final CodegenLanguage codegenLanguage = + ref.watch(codegenLanguageStateProvider); + final Codegen codegen = Codegen(codegenLanguage: codegenLanguage); final activeRequestModel = ref.watch(activeRequestModelProvider); final defaultUriScheme = ref.watch(settingsProvider.select((value) => value.defaultUriScheme)); - final code = dartHttpCodeGen.getCode(activeRequestModel!, defaultUriScheme); + final code = codegen.getCode(ref, activeRequestModel!, defaultUriScheme); if (code == null) { return const ErrorMessage( message: "An error was encountered while generating code. $kRaiseIssue", diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 00000000..3a3f03aa --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:apidash/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +}