Skip to content

Commit db32d95

Browse files
committed
refactor(dynamite): split mimetype resolving and parameter generation
Signed-off-by: Nikolas Rimikis <leptopoda@users.noreply.github.com>
1 parent a16cc4b commit db32d95

File tree

2 files changed

+76
-84
lines changed

2 files changed

+76
-84
lines changed

packages/dynamite/dynamite/lib/src/builder/client.dart

+48-1
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,54 @@ Iterable<Method> buildTags(
306306

307307
code.writeln(buildParameterSerialization(result, parameter, state, state.emitter.allocator.allocate));
308308
}
309-
resolveMimeTypeEncode(operation, spec, state, operationName, operationParameters).forEach(code.writeln);
309+
310+
({String mimeType, TypeResult result})? bodyParameter;
311+
final requestBody = operation.requestBody;
312+
if (requestBody != null) {
313+
for (final content in requestBody.content!.entries) {
314+
if (bodyParameter != null) {
315+
print('Can not work with multiple mime types right now. Using the first supported.');
316+
break;
317+
}
318+
319+
final mimeType = content.key;
320+
final mediaType = content.value;
321+
322+
final dartParameterNullable = isDartParameterNullable(
323+
requestBody.required,
324+
mediaType.schema,
325+
);
326+
final dartParameterRequired = isRequired(
327+
requestBody.required,
328+
mediaType.schema,
329+
);
330+
331+
final result = resolveType(
332+
spec,
333+
state,
334+
toDartName('$operationName-request-$mimeType', className: true),
335+
mediaType.schema!,
336+
nullable: dartParameterNullable,
337+
);
338+
339+
bodyParameter = (mimeType: mimeType, result: result);
340+
341+
final parameterName = toDartName(result.name);
342+
operationParameters.add(
343+
Parameter(
344+
(b) => b
345+
..name = parameterName
346+
..type = refer(result.nullableName)
347+
..named = true
348+
..required = dartParameterRequired,
349+
),
350+
);
351+
}
352+
}
353+
354+
if (bodyParameter != null) {
355+
resolveMimeTypeEncode(bodyParameter.mimeType, bodyParameter.result, code);
356+
}
310357

311358
final bodyType = buildBodyType(
312359
state,
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
import 'package:built_collection/built_collection.dart';
2-
import 'package:code_builder/code_builder.dart';
31
import 'package:dynamite/src/builder/resolve_type.dart';
42
import 'package:dynamite/src/builder/state.dart';
53
import 'package:dynamite/src/helpers/dart_helpers.dart';
6-
import 'package:dynamite/src/helpers/dynamite.dart';
74
import 'package:dynamite/src/models/openapi.dart' as openapi;
85
import 'package:dynamite/src/models/type_result.dart';
96

@@ -42,87 +39,35 @@ TypeResult? resolveMimeTypeDecode(
4239
return null;
4340
}
4441

45-
Iterable<String> resolveMimeTypeEncode(
46-
openapi.Operation operation,
47-
openapi.OpenAPI spec,
48-
State state,
49-
String identifier,
50-
ListBuilder<Parameter> b,
51-
) sync* {
52-
if (operation.requestBody != null) {
53-
if (operation.requestBody!.content!.length > 1) {
54-
print('Can not work with multiple mime types right now. Using the first supported.');
55-
}
56-
for (final content in operation.requestBody!.content!.entries) {
57-
final mimeType = content.key;
58-
final mediaType = content.value;
59-
60-
yield "_headers['Content-Type'] = '$mimeType';";
61-
62-
final dartParameterNullable = isDartParameterNullable(
63-
operation.requestBody!.required,
64-
mediaType.schema,
65-
);
66-
67-
final result = resolveType(
68-
spec,
69-
state,
70-
toDartName('$identifier-request-$mimeType', className: true),
71-
mediaType.schema!,
72-
nullable: dartParameterNullable,
73-
);
74-
final parameterName = toDartName(result.name);
75-
switch (mimeType) {
76-
case 'application/json':
77-
case 'application/x-www-form-urlencoded':
78-
final dartParameterRequired = isRequired(
79-
operation.requestBody!.required,
80-
mediaType.schema,
81-
);
82-
b.add(
83-
Parameter(
84-
(b) => b
85-
..name = parameterName
86-
..type = refer(result.nullableName)
87-
..named = true
88-
..required = dartParameterRequired,
89-
),
90-
);
91-
92-
if (dartParameterNullable) {
93-
yield 'if ($parameterName != null) {';
94-
}
95-
yield '_body = utf8.encode(${result.encode(parameterName, mimeType: mimeType)});';
96-
if (dartParameterNullable) {
97-
yield '}';
98-
}
99-
return;
100-
case 'application/octet-stream':
101-
final dartParameterRequired = isRequired(
102-
operation.requestBody!.required,
103-
mediaType.schema,
104-
);
105-
b.add(
106-
Parameter(
107-
(b) => b
108-
..name = parameterName
109-
..type = refer(result.nullableName)
110-
..named = true
111-
..required = dartParameterRequired,
112-
),
113-
);
42+
void resolveMimeTypeEncode(
43+
String mimeType,
44+
TypeResult result,
45+
StringSink output,
46+
) {
47+
output.writeln("_headers['Content-Type'] = '$mimeType';");
48+
final parameterName = toDartName(result.name);
11449

115-
if (dartParameterNullable) {
116-
yield 'if ($parameterName != null) {';
117-
}
118-
yield '_body = ${result.encode(parameterName, mimeType: mimeType)};';
119-
if (dartParameterNullable) {
120-
yield '}';
121-
}
122-
return;
50+
switch (mimeType) {
51+
case 'application/json':
52+
case 'application/x-www-form-urlencoded':
53+
if (result.nullable) {
54+
output.writeln('if ($parameterName != null) {');
12355
}
124-
}
125-
126-
throw Exception('Can not parse any mime type of Operation: "$identifier"');
56+
output.writeln('_body = utf8.encode(${result.encode(parameterName, mimeType: mimeType)});');
57+
if (result.nullable) {
58+
output.writeln('}');
59+
}
60+
return;
61+
case 'application/octet-stream':
62+
if (result.nullable) {
63+
output.writeln('if ($parameterName != null) {');
64+
}
65+
output.writeln('_body = ${result.encode(parameterName, mimeType: mimeType)};');
66+
if (result.nullable) {
67+
output.writeln('}');
68+
}
69+
return;
70+
case _:
71+
throw Exception('Can not parse any mime type of the Operation.');
12772
}
12873
}

0 commit comments

Comments
 (0)