@@ -7,46 +7,19 @@ class QueryParam {
7
7
QueryParam(this.name, this.value);
8
8
}
9
9
10
- const _delimiters = const { ' csv' : ' ,' , ' ssv' : ' ' , ' tsv' : ' \t ' , ' pipes' : ' |' } ;
11
-
12
- // port from Java version
13
- List<QueryParam > convertParametersForCollectionFormat(
14
- String collectionFormat, String name, dynamic value) {
15
- var params = {} ;
16
-
17
- // preconditions
18
- if (name == null || name.isEmpty || value == null) return params;
19
-
20
- if (value is! List) {
21
- params.add(new QueryParam(name, value as String));
22
- return params;
23
- }
24
-
25
- List<String > values = value as List<String >;
26
-
27
- // get the collection format
28
- collectionFormat = (collectionFormat == null || collectionFormat.isEmpty)
29
- ? "csv"
30
- : collectionFormat; // default: csv
31
-
32
- if (collectionFormat == "multi") {
33
- return values.map((v) => new QueryParam(name, v));
34
- }
35
-
36
- String delimiter = _delimiters[collectionFormat] ?? ",";
37
-
38
- params.add(new QueryParam(name, values.join(delimiter)));
39
- return params;
40
- }
41
-
42
10
class ApiClient {
43
- static ApiClient defaultApiClient = new ApiClient();
11
+
12
+ var client = new {{#browserClient} }Browser{ {/browserClient} }Client();
44
13
45
14
Map<String , String > _defaultHeaderMap = { } ;
46
15
Map<String , Authentication > _authentications = { } ;
47
- static final dson = new Dartson.JSON();
16
+
17
+ final dson = new Dartson.JSON();
48
18
final DateFormat _dateFormatter = new DateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
49
19
20
+ final _RegList = new RegExp(r'^List<(.*)>$');
21
+ final _RegMap = new RegExp(r'^Map<String ,(.*) >$');
22
+
50
23
ApiClient() {
51
24
// Setup authentications (key: authentication name, value: authentication).{{#authMethods} }{ {#isBasic} }
52
25
_authentications['{ {name} }'] = new HttpBasicAuth();{ {/isBasic} }{ {#isApiKey} }
@@ -76,43 +49,57 @@ class ApiClient {
76
49
}
77
50
}
78
51
79
- static dynamic deserialize(String json, dynamic clazz) {
80
- var result = json;
81
-
52
+ dynamic _deserialize(dynamic value, String targetType) {
82
53
try {
83
- var decodedJson = JSON.decode(json);
84
-
85
- if (decodedJson is List) {
86
- result = [];
87
- for(var obj in decodedJson) {
88
- result.add(_createEntity(obj, clazz));
89
- }
90
- } else {
91
- result = _createEntity(json, clazz);
54
+ switch (targetType) {
55
+ case ' String' :
56
+ return ' $value' ;
57
+ case ' int' :
58
+ return value is int ? value : int.parse(' $value' );
59
+ case ' bool' :
60
+ return value is bool ? value : ' $value' .toLowerCase() == ' true' ;
61
+ case ' double' :
62
+ return value is double ? value : double.parse(' $value' );
63
+ {{#models} }
64
+ { {#model} }
65
+ case '{ {classname} }':
66
+ return dson.map(value, new { {classname} }());
67
+ { {/model} }
68
+ { {/models} }
69
+ default:
70
+ {
71
+ Match match;
72
+ if (value is List &&
73
+ (match = _RegList.firstMatch(targetType)) != null) {
74
+ var valueL = value as List;
75
+ var newTargetType = match[1];
76
+ return valueL.map((v) => _deserialize(v, newTargetType)).toList();
77
+ } else if (value is Map &&
78
+ (match = _RegMap.firstMatch(targetType)) != null) {
79
+ var valueM = value as Map;
80
+ var newTargetType = match[1];
81
+ return new Map.fromIterables(valueM.keys,
82
+ valueM.values.map((v) => _deserialize(v, newTargetType)));
83
+ }
84
+ }
92
85
}
93
- } on FormatException {
94
- // Just return the passed in value
86
+ } catch(e) {
87
+ // Just throw the ApiException below
95
88
}
96
-
97
- return result;
89
+ throw new ApiException(500, 'Could not find a suitable class for deserialization');
98
90
}
99
91
100
- static dynamic _createEntity(dynamic json, dynamic clazz) {
101
- bool isMap = json is Map;
102
-
103
- switch (clazz) {
104
- {{#models} }
105
- { {#model} }
106
- case { {classname} }:
107
- return isMap ? dson.map(json, new { {classname} }()) : dson.decode(json, new { {classname} }());
108
- { {/model} }
109
- { {/models} }
110
- default:
111
- throw new ApiException(500, 'Could not find a suitable class for deserialization');
112
- }
92
+ dynamic deserialize(String json, String targetType) {
93
+ // Remove all spaces. Necessary for reg expressions as well.
94
+ targetType = targetType.replaceAll(' ' , ' ' );
95
+
96
+ if (targetType == ' String' ) return json;
97
+
98
+ var decodedJson = JSON.decode(json);
99
+ return _deserialize(decodedJson, targetType);
113
100
}
114
101
115
- static String serialize(Object obj) {
102
+ String serialize(Object obj) {
116
103
String serialized = ' ' ;
117
104
if (obj == null) {
118
105
serialized = ' ' ;
@@ -136,13 +123,9 @@ class ApiClient {
136
123
String contentType,
137
124
List<String > authNames) async {
138
125
139
- updateParamsForAuth (authNames, queryParams, headerParams);
126
+ _updateParamsForAuth (authNames, queryParams, headerParams);
140
127
141
- var client = new {{#browserClient} }Browser{ {/browserClient} }Client();
142
-
143
- StringBuffer sb = new StringBuffer();
144
-
145
- var ps = queryParams.where((p) => p.value != null).map((p) => '${ p.key} =${ p.value} ');
128
+ var ps = queryParams.where((p) => p.value != null).map((p) => ' ${p.name}=${p.value}' );
146
129
String queryString = ps.isNotEmpty ?
147
130
' ?' + ps.join(' &' ) :
148
131
' ' ;
@@ -177,12 +160,11 @@ class ApiClient {
177
160
178
161
/// Update query and header parameters based on authentication settings.
179
162
/// @param authNames The authentications to apply
180
- void updateParamsForAuth (List<String > authNames, List<QueryParam > queryParams, Map<String , String > headerParams) {
163
+ void _updateParamsForAuth (List<String > authNames, List<QueryParam > queryParams, Map<String , String > headerParams) {
181
164
authNames.forEach((authName) {
182
165
Authentication auth = _authentications[authName];
183
166
if (auth == null) throw new ArgumentError(" Authentication undefined: " + authName);
184
167
auth.applyToParams(queryParams, headerParams);
185
168
} );
186
169
}
187
-
188
170
}
0 commit comments