mirror of
https://github.com/foss42/apidash.git
synced 2025-06-03 08:16:25 +08:00
feat:add dio code gen
This commit is contained in:
125
lib/codegen/dart/dio.dart
Normal file
125
lib/codegen/dart/dio.dart
Normal file
@ -0,0 +1,125 @@
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash/models/request_model.dart' show RequestModel;
|
||||
import 'package:code_builder/code_builder.dart';
|
||||
import 'package:dart_style/dart_style.dart';
|
||||
|
||||
import 'shared.dart';
|
||||
|
||||
class DartDioCodeGen {
|
||||
String? getCode(
|
||||
RequestModel requestModel,
|
||||
String defaultUriScheme,
|
||||
) {
|
||||
try {
|
||||
String url = requestModel.url;
|
||||
if (!url.contains("://") && url.isNotEmpty) {
|
||||
url = "$defaultUriScheme://$url";
|
||||
}
|
||||
final next = generatedDartCode(
|
||||
url: url,
|
||||
method: requestModel.method.name,
|
||||
queryParams: requestModel.paramsMap,
|
||||
headers: requestModel.headersMap,
|
||||
body: requestModel.requestBody,
|
||||
contentType: requestModel.requestBodyContentType,
|
||||
);
|
||||
return next;
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
String generatedDartCode({
|
||||
required String url,
|
||||
required String method,
|
||||
required Map<String, String> queryParams,
|
||||
required Map<String, String> headers,
|
||||
required String? body,
|
||||
required ContentType contentType,
|
||||
}) {
|
||||
final sbf = StringBuffer();
|
||||
final emitter = DartEmitter();
|
||||
final dioImport = Directive.import('package:dio/dio.dart', as: 'dio');
|
||||
sbf.writeln(dioImport.accept(emitter));
|
||||
|
||||
Expression? queryParamExp;
|
||||
if (queryParams.isNotEmpty) {
|
||||
queryParamExp = declareFinal('queryParams').assign(
|
||||
literalMap(queryParams.map((key, value) => MapEntry(key, value))),
|
||||
);
|
||||
}
|
||||
Expression? headerExp;
|
||||
if (headers.isNotEmpty) {
|
||||
headerExp = declareFinal('headers').assign(
|
||||
literalMap(headers.map((key, value) => MapEntry(key, value))),
|
||||
);
|
||||
}
|
||||
|
||||
Expression? dataExp;
|
||||
if (body != null) {
|
||||
final strContent = CodeExpression(Code('r\'\'\'$body\'\'\''));
|
||||
switch (contentType) {
|
||||
case ContentType.json:
|
||||
final convertImport = Directive.import('dart:convert', as: 'convert');
|
||||
sbf.writeln(convertImport.accept(emitter));
|
||||
dataExp = declareFinal('data')
|
||||
.assign(refer('convert.json.decode').call([strContent]));
|
||||
case ContentType.text:
|
||||
dataExp = declareFinal('data').assign(strContent);
|
||||
}
|
||||
}
|
||||
final responseExp = declareFinal('response').assign(InvokeExpression.newOf(
|
||||
refer('dio.Dio'),
|
||||
[literalString(url)],
|
||||
{
|
||||
if (queryParamExp != null) 'queryParameters': refer('queryParams'),
|
||||
if (headerExp != null)
|
||||
'options': refer('Options').newInstance(
|
||||
[],
|
||||
{'headers': refer('headers')},
|
||||
),
|
||||
if (dataExp != null) 'data': refer('data'),
|
||||
},
|
||||
[],
|
||||
method,
|
||||
).awaited);
|
||||
|
||||
final mainFunction = Method((m) {
|
||||
final content = declareTryCatch(
|
||||
showStackStrace: true,
|
||||
body: [
|
||||
if (queryParamExp != null) queryParamExp,
|
||||
if (headerExp != null) headerExp,
|
||||
if (dataExp != null) dataExp,
|
||||
responseExp,
|
||||
refer('print').call([refer('response').property('statusCode')]),
|
||||
refer('print').call([refer('response').property('data')]),
|
||||
],
|
||||
onError: {
|
||||
'DioException': [
|
||||
refer('print').call([
|
||||
refer('e').property('response').nullSafeProperty('statusCode'),
|
||||
]),
|
||||
refer('print').call([
|
||||
refer('e').property('response').nullSafeProperty('data'),
|
||||
]),
|
||||
refer('print').call([refer('s')]),
|
||||
],
|
||||
null: [
|
||||
refer('print').call([refer('e')]),
|
||||
refer('print').call([refer('s')]),
|
||||
],
|
||||
},
|
||||
);
|
||||
m
|
||||
..name = 'main'
|
||||
..returns = refer('void')
|
||||
..modifier = MethodModifier.async
|
||||
..body = content;
|
||||
});
|
||||
|
||||
sbf.writeln(mainFunction.accept(emitter));
|
||||
|
||||
return DartFormatter(pageWidth: 160).format(sbf.toString());
|
||||
}
|
||||
}
|
26
lib/codegen/dart/shared.dart
Normal file
26
lib/codegen/dart/shared.dart
Normal file
@ -0,0 +1,26 @@
|
||||
import 'package:code_builder/code_builder.dart';
|
||||
|
||||
Block declareTryCatch({
|
||||
required List<Expression> body,
|
||||
required Map<String?, List<Expression>> onError,
|
||||
bool showStackStrace = false,
|
||||
}) {
|
||||
return Block((b) {
|
||||
b.statements.add(const Code('try'));
|
||||
b.statements.add(const Code('{'));
|
||||
b.statements.addAll(body.map((e) => e.statement).toList());
|
||||
final entries = onError.entries;
|
||||
|
||||
for (var error in entries) {
|
||||
b.statements.add(const Code('}'));
|
||||
if (error.key != null) {
|
||||
b.statements.add(Code('on ${error.key}'));
|
||||
}
|
||||
b.statements.add(Code(showStackStrace ? 'catch(e,s)' : 'catch(e)'));
|
||||
|
||||
b.statements.add(const Code('{'));
|
||||
b.statements.addAll(error.value.map((e) => e.statement).toList());
|
||||
if (entries.last.key == error.key) b.statements.add(const Code('}'));
|
||||
}
|
||||
});
|
||||
}
|
Reference in New Issue
Block a user