mirror of
https://github.com/foss42/apidash.git
synced 2025-06-02 07:46:10 +08:00
Kotlin Code Generator Added
This commit is contained in:
@ -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');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
78
lib/codegen/kotlin/pkg_okhttp.dart
Normal file
78
lib/codegen/kotlin/pkg_okhttp.dart
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
@ -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
30
test/widget_test.dart
Normal 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);
|
||||||
|
});
|
||||||
|
}
|
Reference in New Issue
Block a user