Skip to content

Commit 53009ec

Browse files
committed
Added support for enums in Dart.
1 parent 8067612 commit 53009ec

File tree

16 files changed

+124
-40
lines changed

16 files changed

+124
-40
lines changed

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/DartClientCodegen.java

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,23 @@
33
import io.swagger.codegen.CliOption;
44
import io.swagger.codegen.CodegenConfig;
55
import io.swagger.codegen.CodegenConstants;
6+
import io.swagger.codegen.CodegenModel;
7+
import io.swagger.codegen.CodegenProperty;
68
import io.swagger.codegen.CodegenType;
79
import io.swagger.codegen.DefaultCodegen;
810
import io.swagger.codegen.SupportingFile;
11+
import io.swagger.models.Model;
912
import io.swagger.models.properties.ArrayProperty;
1013
import io.swagger.models.properties.MapProperty;
1114
import io.swagger.models.properties.Property;
1215

1316
import java.io.File;
17+
import java.util.ArrayList;
1418
import java.util.Arrays;
1519
import java.util.HashSet;
1620
import java.util.HashMap;
21+
import java.util.List;
22+
import java.util.Map;
1723

1824
public class DartClientCodegen extends DefaultCodegen implements CodegenConfig {
1925
public static final String BROWSER_CLIENT = "browserClient";
@@ -182,7 +188,7 @@ public void processOpts() {
182188

183189

184190
@Override
185-
public String escapeReservedWord(String name) {
191+
public String escapeReservedWord(String name) {
186192
if(this.reservedWordsMappings().containsKey(name)) {
187193
return this.reservedWordsMappings().get(name);
188194
}
@@ -300,6 +306,60 @@ public String getSwaggerType(Property p) {
300306
return toModelName(type);
301307
}
302308

309+
@Override
310+
public Map<String, Object> postProcessModels(Map<String, Object> objs) {
311+
Map<String, Object> result = postProcessModelsEnum(objs);
312+
313+
// Build a list of all the enum models.
314+
List<Object> models = (List<Object>) objs.get("models");
315+
// Check if there already exists a list.
316+
Object storedTransformers = additionalProperties.get("transformers");
317+
List<Map<String, String>> enumTransformers = storedTransformers != null ?
318+
(List<Map<String, String>>) storedTransformers :
319+
new ArrayList<Map<String, String>>();
320+
for (Object modelObject : models) {
321+
Map<String, Object> modelMap = (Map<String, Object>) modelObject;
322+
CodegenModel model = (CodegenModel) modelMap.get("model");
323+
if (model.isEnum && model.allowableValues != null) {
324+
Map<String, String> enumObject = new HashMap<String, String>();
325+
String className = model.classname;
326+
enumObject.put("className", className);
327+
enumObject.put("transformer", className + "TypeTransformer");
328+
enumTransformers.add(enumObject);
329+
}
330+
}
331+
// Store the list as an additional property.
332+
additionalProperties.put("transformers", enumTransformers);
333+
return result;
334+
}
335+
336+
@Override
337+
public String toEnumVarName(String value, String datatype) {
338+
if (value.length() == 0) {
339+
return "EMPTY";
340+
}
341+
342+
// The lone difference with the super version is the replacement of non
343+
// word characters with '__' instead of '_'. This is to handle negative
344+
// numbers, so that e.g. -1 is transformed into '__1' and not '_1' like
345+
// 1 is.
346+
String var = value.replaceAll("\\W+", "__").toUpperCase();
347+
if (var.matches("\\d.*")) {
348+
return "_" + var;
349+
} else {
350+
return var;
351+
}
352+
}
353+
354+
@Override
355+
public String toEnumValue(String value, String datatype) {
356+
if ("number".equalsIgnoreCase(datatype) || "int".equalsIgnoreCase(datatype)) {
357+
return value;
358+
} else {
359+
return "\"" + escapeText(value) + "\"";
360+
}
361+
}
362+
303363
@Override
304364
public String toOperationId(String operationId) {
305365
// method name cannot use reserved keyword, e.g. return

modules/swagger-codegen/src/main/resources/dart/api_client.mustache

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ class ApiClient {
1616
Map<String, Authentication> _authentications = {};
1717

1818
final dson = new Dartson.JSON()
19-
..addTransformer(new DateTimeParser(), DateTime);
19+
{{#transformers}}..addTransformer(new {{transformer}}(), {{className}})
20+
{{/transformers}}..addTransformer(new DateTimeParser(), DateTime);
2021

2122
final _RegList = new RegExp(r'^List<(.*)>$');
2223
final _RegMap = new RegExp(r'^Map<String,(.*)>$');
@@ -46,7 +47,14 @@ class ApiClient {
4647
{{#models}}
4748
{{#model}}
4849
case '{{classname}}':
50+
{{#isEnum}}
51+
final listValue = [value];
52+
final List<dynamic> listResult = dson.map(listValue, []);
53+
return listResult[0];
54+
{{/isEnum}}
55+
{{^isEnum}}
4956
return dson.map(value, new {{classname}}());
57+
{{/isEnum}}
5058
{{/model}}
5159
{{/models}}
5260
default:
@@ -116,7 +124,7 @@ class ApiClient {
116124
headerParams['Content-Type'] = contentType;
117125
118126
if(body is MultipartRequest) {
119-
var request = new MultipartRequest(method, Uri.parse(url));
127+
var request = new MultipartRequest(method, Uri.parse(url));
120128
request.fields.addAll(body.fields);
121129
request.files.addAll(body.files);
122130
request.headers.addAll(body.headers);
@@ -141,7 +149,7 @@ class ApiClient {
141149
}
142150

143151
/// Update query and header parameters based on authentication settings.
144-
/// @param authNames The authentications to apply
152+
/// @param authNames The authentications to apply
145153
void _updateParamsForAuth(List<String> authNames, List<QueryParam> queryParams, Map<String, String> headerParams) {
146154
authNames.forEach((authName) {
147155
Authentication auth = _authentications[authName];

modules/swagger-codegen/src/main/resources/dart/apilib.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:http/browser_client.dart';{{/browserClient}}
66
import 'package:http/http.dart';
77
import 'package:dartson/dartson.dart';
88
import 'package:dartson/transformers/date_time.dart';
9+
import 'package:dartson/type_transformer.dart';
910

1011
part 'api_client.dart';
1112
part 'api_helper.dart';
@@ -21,4 +22,3 @@ part 'auth/http_basic_auth.dart';
2122
{{/model}}{{/models}}
2223

2324
ApiClient defaultApiClient = new ApiClient();
24-
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
@Entity()
2+
class {{classname}} {
3+
{{#vars}}{{#description}}/* {{{description}}} */{{/description}}
4+
@Property(name: '{{baseName}}')
5+
{{{datatype}}} {{name}} = {{{defaultValue}}};
6+
{{#allowableValues}}{{#min}} // range from {{min}} to {{max}}{{/min}}//{{^min}}enum {{name}}Enum { {{#values}} {{.}}, {{/values}} };{{/min}}{{/allowableValues}}
7+
{{/vars}}
8+
{{classname}}();
9+
10+
@override
11+
String toString() {
12+
return '{{classname}}[{{#vars}}{{name}}=${{name}}, {{/vars}}]';
13+
}
14+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
@Entity()
2+
enum {{classname}} {
3+
{{#allowableValues}}{{#enumVars}}{{name}}{{^-last}},{{/-last}}
4+
{{/enumVars}}{{/allowableValues}}
5+
}
6+
7+
class {{classname}}TypeTransformer extends TypeTransformer<{{classname}}> {
8+
9+
@override
10+
dynamic encode({{classname}} data) {
11+
switch(data) {
12+
{{#allowableValues}}{{#enumVars}}case {{classname}}.{{name}}: return {{value}};
13+
{{/enumVars}}{{/allowableValues}}
14+
default: throw('Unknown enum value to encode: $data');
15+
}
16+
}
17+
18+
@override
19+
{{classname}} decode(dynamic data) {
20+
switch (data) {
21+
{{#allowableValues}}{{#enumVars}}case {{value}}: return {{classname}}.{{name}};
22+
{{/enumVars}}{{/allowableValues}}
23+
default: throw('Unknown enum value to decode: $data');
24+
}
25+
}
26+
}
Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,7 @@
11
part of {{pubName}}.api;
22

3-
{{#models}}{{#model}}
4-
@Entity()
5-
class {{classname}} {
6-
{{#vars}}{{#description}}/* {{{description}}} */{{/description}}
7-
@Property(name: '{{baseName}}')
8-
{{{datatype}}} {{name}} = {{{defaultValue}}};
9-
{{#allowableValues}}{{#min}} // range from {{min}} to {{max}}{{/min}}//{{^min}}enum {{name}}Enum { {{#values}} {{.}}, {{/values}} };{{/min}}{{/allowableValues}}
10-
{{/vars}}
11-
{{classname}}();
12-
13-
@override
14-
String toString() {
15-
return '{{classname}}[{{#vars}}{{name}}=${{name}}, {{/vars}}]';
16-
}
17-
18-
}
19-
{{/model}}{{/models}}
3+
{{#models}}
4+
{{#model}}
5+
{{#isEnum}}{{>enum}}{{/isEnum}}{{^isEnum}}{{>class}}{{/isEnum}}
6+
{{/model}}
7+
{{/models}}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.2.3-SNAPSHOT
1+
2.3.0-SNAPSHOT

samples/client/petstore/dart/swagger/docs/StoreApi.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ This endpoint does not need any parameter.
8787

8888
### Return type
8989

90-
[**Map<String, int>**](Map.md)
90+
**Map<String, int>**
9191

9292
### Authorization
9393

samples/client/petstore/dart/swagger/lib/api.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:http/browser_client.dart';
66
import 'package:http/http.dart';
77
import 'package:dartson/dartson.dart';
88
import 'package:dartson/transformers/date_time.dart';
9+
import 'package:dartson/type_transformer.dart';
910

1011
part 'api_client.dart';
1112
part 'api_helper.dart';
@@ -28,4 +29,3 @@ part 'model/user.dart';
2829

2930

3031
ApiClient defaultApiClient = new ApiClient();
31-

samples/client/petstore/dart/swagger/lib/api_client.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class ApiClient {
1616
Map<String, Authentication> _authentications = {};
1717

1818
final dson = new Dartson.JSON()
19-
..addTransformer(new DateTimeParser(), DateTime);
19+
..addTransformer(new DateTimeParser(), DateTime);
2020

2121
final _RegList = new RegExp(r'^List<(.*)>$');
2222
final _RegMap = new RegExp(r'^Map<String,(.*)>$');
@@ -121,7 +121,7 @@ class ApiClient {
121121
headerParams['Content-Type'] = contentType;
122122

123123
if(body is MultipartRequest) {
124-
var request = new MultipartRequest(method, Uri.parse(url));
124+
var request = new MultipartRequest(method, Uri.parse(url));
125125
request.fields.addAll(body.fields);
126126
request.files.addAll(body.files);
127127
request.headers.addAll(body.headers);
@@ -146,7 +146,7 @@ class ApiClient {
146146
}
147147

148148
/// Update query and header parameters based on authentication settings.
149-
/// @param authNames The authentications to apply
149+
/// @param authNames The authentications to apply
150150
void _updateParamsForAuth(List<String> authNames, List<QueryParam> queryParams, Map<String, String> headerParams) {
151151
authNames.forEach((authName) {
152152
Authentication auth = _authentications[authName];

0 commit comments

Comments
 (0)