Kotlin Code Generator Added

This commit is contained in:
mmjsmohit
2023-05-30 23:50:26 +05:30
parent c4f9260942
commit d54a4473cb
4 changed files with 142 additions and 4 deletions

View File

@ -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');
}
}
}

View File

@ -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;
}
}

View File

@ -13,8 +13,6 @@ class CodePane extends ConsumerStatefulWidget {
} }
class _CodePaneState extends ConsumerState<CodePane> { class _CodePaneState extends ConsumerState<CodePane> {
final DartHttpCodeGen dartHttpCodeGen = DartHttpCodeGen();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -22,10 +20,13 @@ class _CodePaneState extends ConsumerState<CodePane> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final CodegenLanguage codegenLanguage =
ref.watch(codegenLanguageStateProvider);
final Codegen codegen = Codegen(codegenLanguage: codegenLanguage);
final activeRequestModel = ref.watch(activeRequestModelProvider); final activeRequestModel = ref.watch(activeRequestModelProvider);
final defaultUriScheme = final defaultUriScheme =
ref.watch(settingsProvider.select((value) => value.defaultUriScheme)); ref.watch(settingsProvider.select((value) => value.defaultUriScheme));
final code = dartHttpCodeGen.getCode(activeRequestModel!, defaultUriScheme); final code = codegen.getCode(ref, activeRequestModel!, defaultUriScheme);
if (code == null) { if (code == null) {
return const ErrorMessage( return const ErrorMessage(
message: "An error was encountered while generating code. $kRaiseIssue", message: "An error was encountered while generating code. $kRaiseIssue",

30
test/widget_test.dart Normal file
View File

@ -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);
});
}