Nikolas Rimikis
1 year ago
4 changed files with 201 additions and 109 deletions
@ -0,0 +1,148 @@ |
|||||||
|
import 'package:code_builder/code_builder.dart'; |
||||||
|
import 'package:dynamite/src/builder/resolve_type.dart'; |
||||||
|
import 'package:dynamite/src/builder/state.dart'; |
||||||
|
import 'package:dynamite/src/helpers/dart_helpers.dart'; |
||||||
|
import 'package:dynamite/src/helpers/dynamite.dart'; |
||||||
|
import 'package:dynamite/src/models/open_api.dart'; |
||||||
|
import 'package:dynamite/src/models/operation.dart'; |
||||||
|
import 'package:dynamite/src/models/response.dart'; |
||||||
|
import 'package:dynamite/src/type_result/type_result.dart'; |
||||||
|
|
||||||
|
(String? dataType, String? dataValue, bool? dataNeedsAwait) resolveMimeTypeDecode( |
||||||
|
final Response response, |
||||||
|
final OpenAPI spec, |
||||||
|
final State state, |
||||||
|
final String identifier, |
||||||
|
) { |
||||||
|
if (response.content != null) { |
||||||
|
if (response.content!.length > 1) { |
||||||
|
print('Can not work with multiple mime types right now. Using the first supported.'); |
||||||
|
} |
||||||
|
|
||||||
|
for (final content in response.content!.entries) { |
||||||
|
final mimeType = content.key; |
||||||
|
final mediaType = content.value; |
||||||
|
|
||||||
|
final result = resolveType( |
||||||
|
spec, |
||||||
|
state, |
||||||
|
'identifier-$mimeType', |
||||||
|
mediaType.schema!, |
||||||
|
); |
||||||
|
|
||||||
|
if (mimeType == '*/*' || mimeType == 'application/octet-stream' || mimeType.startsWith('image/')) { |
||||||
|
return ('Uint8List', '_response.bodyBytes', true); |
||||||
|
} else if (mimeType.startsWith('text/') || mimeType == 'application/javascript') { |
||||||
|
return ('String', '_response.body', true); |
||||||
|
} else if (mimeType == 'application/json') { |
||||||
|
String? dataValue; |
||||||
|
bool? dataNeedsAwait; |
||||||
|
if (result.name == 'dynamic') { |
||||||
|
dataValue = ''; |
||||||
|
} else if (result.name == 'String') { |
||||||
|
dataValue = '_response.body'; |
||||||
|
dataNeedsAwait = true; |
||||||
|
} else if (result is TypeResultEnum || result is TypeResultBase) { |
||||||
|
dataValue = result.deserialize(result.decode('await _response.body')); |
||||||
|
dataNeedsAwait = false; |
||||||
|
} else { |
||||||
|
dataValue = result.deserialize('await _response.jsonBody'); |
||||||
|
dataNeedsAwait = false; |
||||||
|
} |
||||||
|
return (result.name, dataValue, dataNeedsAwait); |
||||||
|
} |
||||||
|
} |
||||||
|
throw Exception('Can not parse any mime type of Operation:"$identifier"'); |
||||||
|
} |
||||||
|
return (null, null, null); |
||||||
|
} |
||||||
|
|
||||||
|
void resolveMimeTypeEncode( |
||||||
|
final Operation operation, |
||||||
|
final OpenAPI spec, |
||||||
|
final State state, |
||||||
|
final String identifier, |
||||||
|
final MethodBuilder b, |
||||||
|
final StringBuffer code, |
||||||
|
) { |
||||||
|
if (operation.requestBody != null) { |
||||||
|
if (operation.requestBody!.content!.length > 1) { |
||||||
|
print('Can not work with multiple mime types right now. Using the first supported.'); |
||||||
|
} |
||||||
|
for (final content in operation.requestBody!.content!.entries) { |
||||||
|
final mimeType = content.key; |
||||||
|
final mediaType = content.value; |
||||||
|
|
||||||
|
code.write("_headers['Content-Type'] = '$mimeType';"); |
||||||
|
|
||||||
|
final dartParameterNullable = isDartParameterNullable( |
||||||
|
operation.requestBody!.required, |
||||||
|
mediaType.schema, |
||||||
|
); |
||||||
|
|
||||||
|
final result = resolveType( |
||||||
|
spec, |
||||||
|
state, |
||||||
|
toDartName('$identifier-request-$mimeType', uppercaseFirstCharacter: true), |
||||||
|
mediaType.schema!, |
||||||
|
nullable: dartParameterNullable, |
||||||
|
); |
||||||
|
final parameterName = toDartName(result.name.replaceFirst(state.classPrefix, '')); |
||||||
|
switch (mimeType) { |
||||||
|
case 'application/json': |
||||||
|
case 'application/x-www-form-urlencoded': |
||||||
|
final dartParameterRequired = isRequired( |
||||||
|
operation.requestBody!.required, |
||||||
|
mediaType.schema?.$default, |
||||||
|
); |
||||||
|
b.optionalParameters.add( |
||||||
|
Parameter( |
||||||
|
(final b) => b |
||||||
|
..name = parameterName |
||||||
|
..type = refer(result.nullableName) |
||||||
|
..named = true |
||||||
|
..required = dartParameterRequired, |
||||||
|
), |
||||||
|
); |
||||||
|
|
||||||
|
if (dartParameterNullable) { |
||||||
|
code.write('if ($parameterName != null) {'); |
||||||
|
} |
||||||
|
code.write( |
||||||
|
'_body = utf8.encode(${result.encode(parameterName, mimeType: mimeType)}) as Uint8List;', |
||||||
|
); |
||||||
|
if (dartParameterNullable) { |
||||||
|
code.write('}'); |
||||||
|
} |
||||||
|
return; |
||||||
|
case 'application/octet-stream': |
||||||
|
final dartParameterRequired = isRequired( |
||||||
|
operation.requestBody!.required, |
||||||
|
mediaType.schema?.$default, |
||||||
|
); |
||||||
|
b.optionalParameters.add( |
||||||
|
Parameter( |
||||||
|
(final b) => b |
||||||
|
..name = parameterName |
||||||
|
..type = refer(result.nullableName) |
||||||
|
..named = true |
||||||
|
..required = dartParameterRequired, |
||||||
|
), |
||||||
|
); |
||||||
|
|
||||||
|
if (dartParameterNullable) { |
||||||
|
code.write('if ($parameterName != null) {'); |
||||||
|
} |
||||||
|
code.write( |
||||||
|
'_body = ${result.encode(parameterName, mimeType: mimeType)};', |
||||||
|
); |
||||||
|
if (dartParameterNullable) { |
||||||
|
code.write('}'); |
||||||
|
} |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
throw Exception('Can not parse any mime type of Operation:"$identifier"'); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue