Skip to content

Commit 769b0e0

Browse files
kuhnroyalwing328
andauthored
[feature][dart] Add support for uniqueItems/sets (#8375)
* [dart][dart-dio] Add support for set types * copy `uniqueItems` usage from 2.0 fake spec to `3.0` * add support for sets in parameters, responses and properties * Regenerate all other samples * Fix broken tests due to invalid cast * Update documentation * Regenerate samples * update samples Co-authored-by: William Cheng <wing328hk@gmail.com>
1 parent f01ee4a commit 769b0e0

51 files changed

Lines changed: 219 additions & 86 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/generators/dart-dio.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ These options may be applied as additional-properties (cli) or configOptions (pl
4141

4242
| Type/Alias | Instantiated By |
4343
| ---------- | --------------- |
44-
|array|List|
45-
|map|Map|
4644

4745

4846
## LANGUAGE PRIMITIVES

docs/generators/dart-jaguar.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@ These options may be applied as additional-properties (cli) or configOptions (pl
3636

3737
| Type/Alias | Instantiated By |
3838
| ---------- | --------------- |
39-
|array|List|
40-
|map|Map|
4139

4240

4341
## LANGUAGE PRIMITIVES

docs/generators/dart.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ These options may be applied as additional-properties (cli) or configOptions (pl
3434

3535
| Type/Alias | Instantiated By |
3636
| ---------- | --------------- |
37-
|array|List|
38-
|map|Map|
3937

4038

4139
## LANGUAGE PRIMITIVES

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,14 +141,13 @@ public DartClientCodegen() {
141141
"double",
142142
"dynamic"
143143
);
144-
instantiationTypes.put("array", "List");
145-
instantiationTypes.put("map", "Map");
146144

147145
typeMapping = new HashMap<>();
148146
typeMapping.put("Array", "List");
149147
typeMapping.put("array", "List");
150148
typeMapping.put("map", "Map");
151149
typeMapping.put("List", "List");
150+
typeMapping.put("set", "Set");
152151
typeMapping.put("boolean", "bool");
153152
typeMapping.put("string", "String");
154153
typeMapping.put("char", "String");
@@ -468,9 +467,10 @@ public String toModelTestFilename(String name) {
468467

469468
@Override
470469
public String toDefaultValue(Schema schema) {
471-
if (ModelUtils.isMapSchema(schema)) {
470+
if (ModelUtils.isMapSchema(schema) || ModelUtils.isSet(schema)) {
472471
return "const {}";
473-
} else if (ModelUtils.isArraySchema(schema)) {
472+
}
473+
if (ModelUtils.isArraySchema(schema)) {
474474
return "const []";
475475
}
476476

@@ -494,7 +494,8 @@ public String getTypeDeclaration(Schema p) {
494494
if (ModelUtils.isArraySchema(target)) {
495495
Schema<?> items = getSchemaItems((ArraySchema) schema);
496496
return getSchemaType(target) + "<" + getTypeDeclaration(items) + ">";
497-
} else if (ModelUtils.isMapSchema(target)) {
497+
}
498+
if (ModelUtils.isMapSchema(target)) {
498499
// Note: ModelUtils.isMapSchema(p) returns true when p is a composed schema that also defines
499500
// additionalproperties: true
500501
Schema<?> inner = getAdditionalProperties(target);

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartDioClientCodegen.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ protected ImmutableMap.Builder<String, Mustache.Lambda> addMustacheLambdas() {
127127
public String toDefaultValue(Schema schema) {
128128
if (schema.getDefault() != null) {
129129
if (ModelUtils.isArraySchema(schema)) {
130+
if (ModelUtils.isSet(schema)) {
131+
return "SetBuilder()";
132+
}
130133
return "ListBuilder()";
131134
}
132135
if (ModelUtils.isMapSchema(schema)) {
@@ -318,6 +321,7 @@ public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> o
318321
if (param.isContainer) {
319322
final Map<String, Object> serializer = new HashMap<>();
320323
serializer.put("isArray", param.isArray);
324+
serializer.put("uniqueItems", param.uniqueItems);
321325
serializer.put("isMap", param.isMap);
322326
serializer.put("baseType", param.baseType);
323327
serializers.add(serializer);
@@ -347,7 +351,8 @@ public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> o
347351

348352
if (op.returnContainer != null) {
349353
final Map<String, Object> serializer = new HashMap<>();
350-
serializer.put("isArray", Objects.equals("array", op.returnContainer));
354+
serializer.put("isArray", Objects.equals("array", op.returnContainer) || Objects.equals("set", op.returnContainer));
355+
serializer.put("uniqueItems", op.uniqueItems);
351356
serializer.put("isMap", Objects.equals("map", op.returnContainer));
352357
serializer.put("baseType", op.returnBaseType);
353358
serializers.add(serializer);

modules/openapi-generator/src/main/resources/dart-dio/api.mustache

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class {{classname}} {
6969

7070
{{#isContainer}}
7171
{{#isArray}}
72-
const type = FullType(BuiltList, [FullType({{baseType}})]);
72+
const type = FullType(Built{{#uniqueItems}}Built{{/uniqueItems}}{{^uniqueItems}}List{{/uniqueItems}}, [FullType({{baseType}})]);
7373
final serializedBody = _serializers.serialize({{paramName}}, specifiedType: type);
7474
{{/isArray}}
7575
{{#isMap}}
@@ -135,8 +135,7 @@ class {{classname}} {
135135
{{/returnTypeIsPrimitive}}
136136
{{/returnSimpleType}}
137137
{{^returnSimpleType}}
138-
const collectionType = {{#isMap}}BuiltMap{{/isMap}}{{^isMap}}BuiltList{{/isMap}};
139-
const type = FullType(collectionType, [{{#isMap}}FullType(String), {{/isMap}}FullType({{{returnBaseType}}})]);
138+
const type = FullType(Built{{#isMap}}Map{{/isMap}}{{#isArray}}{{#uniqueItems}}Set{{/uniqueItems}}{{^uniqueItems}}List{{/uniqueItems}}{{/isArray}}, [{{#isMap}}FullType(String), {{/isMap}}FullType({{{returnBaseType}}})]);
140139
final data = _serializers.deserialize(
141140
response.data is String
142141
? jsonDecode(response.data as String)

modules/openapi-generator/src/main/resources/dart-dio/serializers.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ part 'serializers.g.dart';
1818
Serializers serializers = (_$serializers.toBuilder(){{#apiInfo}}{{#apis}}{{#serializers}}
1919
..addBuilderFactory(
2020
{{#isArray}}
21-
const FullType(BuiltList, [FullType({{baseType}})]),
22-
() => ListBuilder<{{baseType}}>(),
21+
const FullType(Built{{#uniqueItems}}Set{{/uniqueItems}}{{^uniqueItems}}List{{/uniqueItems}}, [FullType({{baseType}})]),
22+
() => {{#uniqueItems}}Set{{/uniqueItems}}{{^uniqueItems}}List{{/uniqueItems}}Builder<{{baseType}}>(),
2323
{{/isArray}}
2424
{{#isMap}}
2525
const FullType(BuiltMap, [FullType(String), FullType({{baseType}})]),

modules/openapi-generator/src/main/resources/dart2/api.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ class {{{classname}}} {
187187
if (response.body != null && response.statusCode != HttpStatus.noContent) {
188188
{{#isArray}}
189189
return (apiClient.deserialize(_decodeBodyBytes(response), '{{{returnType}}}') as List)
190-
.map((item) => item as {{{returnBaseType}}})
191-
.toList(growable: false);
190+
.cast<{{{returnBaseType}}}>()
191+
.{{#uniqueItems}}toSet(){{/uniqueItems}}{{^uniqueItems}}toList(growable: false){{/uniqueItems}};
192192
{{/isArray}}
193193
{{^isArray}}
194194
{{#isMap}}

modules/openapi-generator/src/main/resources/dart2/api_client.mustache

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,12 @@ class ApiClient {
194194
.map((v) => _deserialize(v, newTargetType, growable: growable))
195195
.toList(growable: true == growable);
196196
}
197+
if (value is Set && (match = _regSet.firstMatch(targetType)) != null) {
198+
final newTargetType = match[1];
199+
return value
200+
.map((v) => _deserialize(v, newTargetType, growable: growable))
201+
.toSet();
202+
}
197203
if (value is Map && (match = _regMap.firstMatch(targetType)) != null) {
198204
final newTargetType = match[1];
199205
return Map.fromIterables(

modules/openapi-generator/src/main/resources/dart2/apilib.mustache

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ const _delimiters = {'csv': ',', 'ssv': ' ', 'tsv': '\t', 'pipes': '|'};
2626
const _dateEpochMarker = 'epoch';
2727
final _dateFormatter = DateFormat('yyyy-MM-dd');
2828
final _regList = RegExp(r'^List<(.*)>$');
29+
final _regSet = RegExp(r'^Set<(.*)>$');
2930
final _regMap = RegExp(r'^Map<String,(.*)>$');
3031

3132
ApiClient defaultApiClient = ApiClient();

0 commit comments

Comments
 (0)