[dart-dio] Generate the correct serializers (#8357)

* only generate actually used serializers (anything used in body or response)
* generate previously missing serializers for collection types
* improve formatting
This commit is contained in:
Peter Leibiger 2021-01-07 15:28:37 +01:00 committed by GitHub
parent 3b6c2b2342
commit c43234711a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 139 additions and 264 deletions

View File

@ -289,6 +289,7 @@ public class DartDioClientCodegen extends DartClientCodegen {
Map<String, Object> operations = (Map<String, Object>) objs.get("operations"); Map<String, Object> operations = (Map<String, Object>) objs.get("operations");
List<CodegenOperation> operationList = (List<CodegenOperation>) operations.get("operation"); List<CodegenOperation> operationList = (List<CodegenOperation>) operations.get("operation");
Set<Map<String, Object>> serializers = new HashSet<>();
Set<String> modelImports = new HashSet<>(); Set<String> modelImports = new HashSet<>();
Set<String> fullImports = new HashSet<>(); Set<String> fullImports = new HashSet<>();
@ -314,6 +315,13 @@ public class DartDioClientCodegen extends DartClientCodegen {
param.baseType = "MultipartFile"; param.baseType = "MultipartFile";
param.dataType = "MultipartFile"; param.dataType = "MultipartFile";
} }
if (param.isContainer) {
final Map<String, Object> serializer = new HashMap<>();
serializer.put("isArray", param.isArray);
serializer.put("isMap", param.isMap);
serializer.put("baseType", param.baseType);
serializers.add(serializer);
}
} }
op.vendorExtensions.put("x-is-json", isJson); op.vendorExtensions.put("x-is-json", isJson);
@ -336,10 +344,19 @@ public class DartDioClientCodegen extends DartClientCodegen {
} }
modelImports.addAll(imports); modelImports.addAll(imports);
op.imports = imports; op.imports = imports;
if (op.returnContainer != null) {
final Map<String, Object> serializer = new HashMap<>();
serializer.put("isArray", Objects.equals("array", op.returnContainer));
serializer.put("isMap", Objects.equals("map", op.returnContainer));
serializer.put("baseType", op.returnBaseType);
serializers.add(serializer);
}
} }
objs.put("modelImports", modelImports); objs.put("modelImports", modelImports);
objs.put("fullImports", fullImports); objs.put("fullImports", fullImports);
objs.put("serializers", serializers);
return objs; return objs;
} }

View File

@ -10,25 +10,26 @@ import 'package:built_value/standard_json_plugin.dart';
import 'package:{{pubName}}/local_date_serializer.dart';{{/timeMachine}} import 'package:{{pubName}}/local_date_serializer.dart';{{/timeMachine}}
{{#models}}{{#model}}import 'package:{{pubName}}/model/{{classFilename}}.dart'; {{#models}}{{#model}}import 'package:{{pubName}}/model/{{classFilename}}.dart';
{{/model}}{{/models}} {{/model}}{{/models}}
part 'serializers.g.dart'; part 'serializers.g.dart';
@SerializersFor(const [ @SerializersFor(const [{{#models}}{{#model}}
{{#models}}{{#model}}{{classname}}, {{classname}},{{/model}}{{/models}}
{{/model}}{{/models}}
]) ])
Serializers serializers = (_$serializers.toBuilder(){{#apiInfo}}{{#apis}}{{#serializers}}
//allow all models to be serialized within a list ..addBuilderFactory(
Serializers serializers = (_$serializers.toBuilder() {{#isArray}}
{{#models}}{{#model}}..addBuilderFactory( const FullType(BuiltList, [FullType({{baseType}})]),
const FullType(BuiltList, const [const FullType({{classname}})]), () => ListBuilder<{{baseType}}>(),
() => new ListBuilder<{{classname}}>()) {{/isArray}}
{{/model}}{{/models}} {{#isMap}}
..add(Iso8601DateTimeSerializer()) const FullType(BuiltMap, [FullType(String), FullType({{baseType}})]),
).build(); () => MapBuilder<String, {{baseType}}>(),
{{/isMap}}
){{/serializers}}{{/apis}}{{/apiInfo}}{{#timeMachine}}
..add(OffsetDateSerializer())
..add(OffsetDateTimeSerializer()){{/timeMachine}}
..add(Iso8601DateTimeSerializer()))
.build();
Serializers standardSerializers = Serializers standardSerializers =
(serializers.toBuilder() (serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
{{#timeMachine}}..add(OffsetDateSerializer())
..add(OffsetDateTimeSerializer())
{{/timeMachine}}..addPlugin(StandardJsonPlugin())).build();

View File

@ -20,7 +20,6 @@ import 'package:openapi/model/pet.dart';
import 'package:openapi/model/tag.dart'; import 'package:openapi/model/tag.dart';
import 'package:openapi/model/user.dart'; import 'package:openapi/model/user.dart';
part 'serializers.g.dart'; part 'serializers.g.dart';
@SerializersFor(const [ @SerializersFor(const [
@ -30,33 +29,22 @@ Order,
Pet, Pet,
Tag, Tag,
User, User,
]) ])
//allow all models to be serialized within a list
Serializers serializers = (_$serializers.toBuilder() Serializers serializers = (_$serializers.toBuilder()
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [const FullType(ApiResponse)]), const FullType(BuiltList, [FullType(Pet)]),
() => new ListBuilder<ApiResponse>()) () => ListBuilder<Pet>(),
)
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Category)]), const FullType(BuiltMap, [FullType(String), FullType(int)]),
() => new ListBuilder<Category>()) () => MapBuilder<String, int>(),
)
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Order)]), const FullType(BuiltList, [FullType(User)]),
() => new ListBuilder<Order>()) () => ListBuilder<User>(),
..addBuilderFactory( )
const FullType(BuiltList, const [const FullType(Pet)]), ..add(Iso8601DateTimeSerializer()))
() => new ListBuilder<Pet>()) .build();
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Tag)]),
() => new ListBuilder<Tag>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(User)]),
() => new ListBuilder<User>())
..add(Iso8601DateTimeSerializer())
).build();
Serializers standardSerializers = Serializers standardSerializers =
(serializers.toBuilder() (serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
..addPlugin(StandardJsonPlugin())).build();

View File

@ -20,7 +20,6 @@ import 'package:openapi/model/pet.dart';
import 'package:openapi/model/tag.dart'; import 'package:openapi/model/tag.dart';
import 'package:openapi/model/user.dart'; import 'package:openapi/model/user.dart';
part 'serializers.g.dart'; part 'serializers.g.dart';
@SerializersFor(const [ @SerializersFor(const [
@ -30,33 +29,22 @@ Order,
Pet, Pet,
Tag, Tag,
User, User,
]) ])
//allow all models to be serialized within a list
Serializers serializers = (_$serializers.toBuilder() Serializers serializers = (_$serializers.toBuilder()
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [const FullType(ApiResponse)]), const FullType(BuiltList, [FullType(Pet)]),
() => new ListBuilder<ApiResponse>()) () => ListBuilder<Pet>(),
)
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Category)]), const FullType(BuiltMap, [FullType(String), FullType(int)]),
() => new ListBuilder<Category>()) () => MapBuilder<String, int>(),
)
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Order)]), const FullType(BuiltList, [FullType(User)]),
() => new ListBuilder<Order>()) () => ListBuilder<User>(),
..addBuilderFactory( )
const FullType(BuiltList, const [const FullType(Pet)]), ..add(Iso8601DateTimeSerializer()))
() => new ListBuilder<Pet>()) .build();
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Tag)]),
() => new ListBuilder<Tag>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(User)]),
() => new ListBuilder<User>())
..add(Iso8601DateTimeSerializer())
).build();
Serializers standardSerializers = Serializers standardSerializers =
(serializers.toBuilder() (serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
..addPlugin(StandardJsonPlugin())).build();

View File

@ -57,7 +57,6 @@ import 'package:openapi/model/special_model_name.dart';
import 'package:openapi/model/tag.dart'; import 'package:openapi/model/tag.dart';
import 'package:openapi/model/user.dart'; import 'package:openapi/model/user.dart';
part 'serializers.g.dart'; part 'serializers.g.dart';
@SerializersFor(const [ @SerializersFor(const [
@ -104,144 +103,26 @@ ReadOnlyFirst,
SpecialModelName, SpecialModelName,
Tag, Tag,
User, User,
]) ])
//allow all models to be serialized within a list
Serializers serializers = (_$serializers.toBuilder() Serializers serializers = (_$serializers.toBuilder()
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [const FullType(AdditionalPropertiesClass)]), const FullType(BuiltMap, [FullType(String), FullType(String)]),
() => new ListBuilder<AdditionalPropertiesClass>()) () => MapBuilder<String, String>(),
)
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Animal)]), const FullType(BuiltList, [FullType(Pet)]),
() => new ListBuilder<Animal>()) () => ListBuilder<Pet>(),
)
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [const FullType(ApiResponse)]), const FullType(BuiltMap, [FullType(String), FullType(int)]),
() => new ListBuilder<ApiResponse>()) () => MapBuilder<String, int>(),
)
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [const FullType(ArrayOfArrayOfNumberOnly)]), const FullType(BuiltList, [FullType(User)]),
() => new ListBuilder<ArrayOfArrayOfNumberOnly>()) () => ListBuilder<User>(),
..addBuilderFactory( )
const FullType(BuiltList, const [const FullType(ArrayOfNumberOnly)]), ..add(Iso8601DateTimeSerializer()))
() => new ListBuilder<ArrayOfNumberOnly>()) .build();
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(ArrayTest)]),
() => new ListBuilder<ArrayTest>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Capitalization)]),
() => new ListBuilder<Capitalization>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Cat)]),
() => new ListBuilder<Cat>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(CatAllOf)]),
() => new ListBuilder<CatAllOf>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Category)]),
() => new ListBuilder<Category>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(ClassModel)]),
() => new ListBuilder<ClassModel>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Dog)]),
() => new ListBuilder<Dog>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(DogAllOf)]),
() => new ListBuilder<DogAllOf>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(EnumArrays)]),
() => new ListBuilder<EnumArrays>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(EnumTest)]),
() => new ListBuilder<EnumTest>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(FileSchemaTestClass)]),
() => new ListBuilder<FileSchemaTestClass>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Foo)]),
() => new ListBuilder<Foo>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(FormatTest)]),
() => new ListBuilder<FormatTest>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(HasOnlyReadOnly)]),
() => new ListBuilder<HasOnlyReadOnly>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(HealthCheckResult)]),
() => new ListBuilder<HealthCheckResult>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(InlineResponseDefault)]),
() => new ListBuilder<InlineResponseDefault>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(MapTest)]),
() => new ListBuilder<MapTest>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(MixedPropertiesAndAdditionalPropertiesClass)]),
() => new ListBuilder<MixedPropertiesAndAdditionalPropertiesClass>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Model200Response)]),
() => new ListBuilder<Model200Response>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(ModelClient)]),
() => new ListBuilder<ModelClient>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(ModelEnumClass)]),
() => new ListBuilder<ModelEnumClass>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(ModelFile)]),
() => new ListBuilder<ModelFile>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(ModelList)]),
() => new ListBuilder<ModelList>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(ModelReturn)]),
() => new ListBuilder<ModelReturn>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Name)]),
() => new ListBuilder<Name>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(NullableClass)]),
() => new ListBuilder<NullableClass>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(NumberOnly)]),
() => new ListBuilder<NumberOnly>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Order)]),
() => new ListBuilder<Order>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(OuterComposite)]),
() => new ListBuilder<OuterComposite>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(OuterEnum)]),
() => new ListBuilder<OuterEnum>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(OuterEnumDefaultValue)]),
() => new ListBuilder<OuterEnumDefaultValue>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(OuterEnumInteger)]),
() => new ListBuilder<OuterEnumInteger>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(OuterEnumIntegerDefaultValue)]),
() => new ListBuilder<OuterEnumIntegerDefaultValue>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Pet)]),
() => new ListBuilder<Pet>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(ReadOnlyFirst)]),
() => new ListBuilder<ReadOnlyFirst>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(SpecialModelName)]),
() => new ListBuilder<SpecialModelName>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(Tag)]),
() => new ListBuilder<Tag>())
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(User)]),
() => new ListBuilder<User>())
..add(Iso8601DateTimeSerializer())
).build();
Serializers standardSerializers = Serializers standardSerializers =
(serializers.toBuilder() (serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
..addPlugin(StandardJsonPlugin())).build();