Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[dart][dart-dio] Add support for query collection parameter format #9635

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,6 @@ public void processOpts() {

final String srcFolder = libFolder + File.separator + "src";
supportingFiles.add(new SupportingFile("api_client.mustache", srcFolder, "api.dart"));
supportingFiles.add(new SupportingFile("api_util.mustache", srcFolder, "api_util.dart"));

final String authFolder = srcFolder + File.separator + "auth";
supportingFiles.add(new SupportingFile("auth/api_key_auth.mustache", authFolder, "api_key_auth.dart"));
Expand All @@ -177,6 +176,7 @@ private void configureSerializationLibrary(String srcFolder) {

private void configureSerializationLibraryBuiltValue(String srcFolder) {
supportingFiles.add(new SupportingFile("serialization/built_value/serializers.mustache", srcFolder, "serializers.dart"));
supportingFiles.add(new SupportingFile("serialization/built_value/api_util.mustache", srcFolder, "api_util.dart"));

typeMapping.put("Array", "BuiltList");
typeMapping.put("array", "BuiltList");
Expand Down Expand Up @@ -339,7 +339,7 @@ public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> o
}

resultImports.addAll(rewriteImports(op.imports, false));
if (op.getHasFormParams()) {
if (op.getHasFormParams() || op.getHasQueryParams()) {
resultImports.add("package:" + pubName + "/src/api_util.dart");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,14 +83,13 @@ class {{classname}} {
},{{#hasConsumes}}
contentType: '{{#prioritizedContentTypes}}{{#-first}}{{{mediaType}}}{{/-first}}{{/prioritizedContentTypes}}',{{/hasConsumes}}
validateStatus: validateStatus,
);
);{{#hasQueryParams}}

final _queryParameters = <String, dynamic>{
{{#queryParams}}
{{^required}}{{^isNullable}}if ({{{paramName}}} != null) {{/isNullable}}{{/required}}r'{{baseName}}': {{paramName}},
{{^required}}{{^isNullable}}if ({{{paramName}}} != null) {{/isNullable}}{{/required}}r'{{baseName}}': {{#useBuiltValue}}{{>serialization/built_value/query_param}}{{/useBuiltValue}},
{{/queryParams}}
};
{{#hasBodyOrFormParams}}
};{{/hasQueryParams}}{{#hasBodyOrFormParams}}

dynamic _bodyData;

Expand All @@ -100,20 +99,19 @@ class {{classname}} {
throw DioError(
requestOptions: _options.compose(
_dio.options,
_path,
queryParameters: _queryParameters,
_path,{{#hasQueryParams}}
queryParameters: _queryParameters,{{/hasQueryParams}}
),
type: DioErrorType.other,
error: error,
)..stackTrace = stackTrace;
}
{{/hasBodyOrFormParams}}
}{{/hasBodyOrFormParams}}

final _response = await _dio.request<Object>(
_path,{{#hasBodyOrFormParams}}
data: _bodyData,{{/hasBodyOrFormParams}}
options: _options,
queryParameters: _queryParameters,
options: _options,{{#hasQueryParams}}
queryParameters: _queryParameters,{{/hasQueryParams}}
cancelToken: cancelToken,
onSendProgress: onSendProgress,
onReceiveProgress: onReceiveProgress,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
{{>header}}
import 'dart:convert';
import 'dart:typed_data';

import 'package:built_collection/built_collection.dart';
import 'package:built_value/serializer.dart';
import 'package:dio/dio.dart';
import 'package:dio/src/parameter.dart';

/// Format the given form parameter object into something that Dio can handle.
/// Returns primitive or String.
/// Returns List/Map if the value is BuildList/BuiltMap.
dynamic encodeFormParameter(Serializers serializers, dynamic value, FullType type) {
if (value == null) {
return '';
}
if (value is String || value is num || value is bool) {
return value;
}
final serialized = serializers.serialize(
value as Object,
specifiedType: type,
);
if (serialized is String) {
return serialized;
}
if (value is BuiltList || value is BuiltSet || value is BuiltMap) {
return serialized;
}
return json.encode(serialized);
}

dynamic encodeQueryParameter(
Serializers serializers,
dynamic value,
FullType type,
) {
if (value == null) {
return '';
}
if (value is String || value is num || value is bool) {
return value;
}
if (value is Uint8List) {
// Currently not sure how to serialize this
return value;
}
final serialized = serializers.serialize(
value as Object,
specifiedType: type,
);
if (serialized == null) {
return '';
}
if (serialized is String) {
return serialized;
}
return serialized;
}

ListParam<T> encodeCollectionQueryParameter<T>(
Serializers serializers,
dynamic value,
FullType type, {
ListFormat format = ListFormat.multi,
}) {
final serialized = serializers.serialize(
value as Object,
specifiedType: type,
);
if (value is BuiltList<T> || value is BuiltSet<T>) {
return ListParam(List.of((serialized as Iterable<Object?>).cast()), format);
}
throw ArgumentError('Invalid value passed to encodeCollectionQueryParameter');
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{{#isContainer}}encodeCollectionQueryParameter<{{{baseType}}}>{{/isContainer}}{{^isContainer}}encodeQueryParameter{{/isContainer}}(_serializers, {{{paramName}}}, const FullType({{^isContainer}}{{{dataType}}}){{/isContainer}}{{#isContainer}}Built{{#isMap}}Map{{/isMap}}{{#isArray}}{{#uniqueItems}}Set{{/uniqueItems}}{{^uniqueItems}}List{{/uniqueItems}}{{/isArray}}, [{{#isMap}}FullType(String), {{/isMap}}FullType({{{baseType}}})]), format: ListFormat.{{collectionFormat}}{{/isContainer}})
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
{{#hasFormParams}}
_bodyData = {{#isMultipart}}FormData.fromMap({{/isMultipart}}<String, dynamic>{
{{#isMultipart}}
_bodyData = FormData.fromMap(<String, dynamic>{
{{#formParams}}
{{^required}}{{^isNullable}}if ({{{paramName}}} != null) {{/isNullable}}{{/required}}r'{{{baseName}}}': {{#isFile}}{{{paramName}}}{{/isFile}}{{^isFile}}encodeFormParameter(_serializers, {{{paramName}}}, const FullType({{^isContainer}}{{{baseType}}}{{/isContainer}}{{#isContainer}}Built{{#isMap}}Map{{/isMap}}{{#isArray}}{{#uniqueItems}}Set{{/uniqueItems}}{{^uniqueItems}}List{{/uniqueItems}}{{/isArray}}, [{{#isMap}}FullType(String), {{/isMap}}FullType({{{baseType}}})]{{/isContainer}})){{/isFile}},
{{/formParams}}
}{{#isMultipart}}){{/isMultipart}};
});
{{/isMultipart}}
{{^isMultipart}}
_bodyData = <String, dynamic>{
{{#formParams}}
{{^required}}{{^isNullable}}if ({{{paramName}}} != null) {{/isNullable}}{{/required}}r'{{{baseName}}}': {{>serialization/built_value/query_param}},
{{/formParams}}
};
{{/isMultipart}}
{{/hasFormParams}}
{{#bodyParam}}
{{#isPrimitiveType}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,6 @@ class AnotherFakeApi {
validateStatus: validateStatus,
);

final _queryParameters = <String, dynamic>{
};

dynamic _bodyData;

try {
Expand All @@ -68,7 +65,6 @@ class AnotherFakeApi {
requestOptions: _options.compose(
_dio.options,
_path,
queryParameters: _queryParameters,
),
type: DioErrorType.other,
error: error,
Expand All @@ -79,7 +75,6 @@ class AnotherFakeApi {
_path,
data: _bodyData,
options: _options,
queryParameters: _queryParameters,
cancelToken: cancelToken,
onSendProgress: onSendProgress,
onReceiveProgress: onReceiveProgress,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,9 @@ class DefaultApi {
validateStatus: validateStatus,
);

final _queryParameters = <String, dynamic>{
};

final _response = await _dio.request<Object>(
_path,
options: _options,
queryParameters: _queryParameters,
cancelToken: cancelToken,
onSendProgress: onSendProgress,
onReceiveProgress: onReceiveProgress,
Expand Down
Loading