@@ -22,23 +22,22 @@ const supportedMediaTypes: { [mediaType: string]: number } = {
22
22
" application/octet-stream" : 0
23
23
}
24
24
25
-
26
- let enumsMap: Set<string > = new Set<string >([
25
+ const enumsMap: { [key: string]: any[]} = {
27
26
{{#models} }
28
27
{ {#model} }
29
28
{ {#isEnum} }
30
- "{ {classname} }{ {enumName} }",
29
+ "{ {classname} }{ {enumName} }": [ { {#allowableValues } } { {#enumVars } } { {{value } }} { {^-last } }, { {/-last } } { {/enumVars } }] { {/allowableValues } } ,
31
30
{ {/isEnum} }
32
31
{ {#hasEnums} }
33
32
{ {#vars} }
34
33
{ {#isEnum} }
35
- "{ {classname} }{ {enumName} }",
34
+ "{ {classname} }{ {enumName} }": [ { {#allowableValues } } { {#enumVars } } { {{value } }} { {^-last } }, { {/-last } } { {/enumVars } }] { {/allowableValues } } ,
36
35
{ {/isEnum} }
37
36
{ {/vars} }
38
37
{ {/hasEnums} }
39
38
{ {/model} }
40
39
{ {/models} }
41
- ]) ;
40
+ } ;
42
41
43
42
let typeMap: { [index: string]: any} = {
44
43
{{#models} }
@@ -58,41 +57,6 @@ let oneOfMap: {[index: string]: string[]} = {
58
57
};
59
58
60
59
export class ObjectSerializer {
61
- public static findCorrectType(data: any, expectedType: string) {
62
- if (data == undefined) {
63
- return expectedType;
64
- } else if (primitives.indexOf(expectedType.toLowerCase()) !== -1) {
65
- return expectedType;
66
- } else if (expectedType === "Date") {
67
- return expectedType;
68
- } else {
69
- if (enumsMap.has(expectedType)) {
70
- return expectedType;
71
- }
72
-
73
- if (!typeMap[expectedType]) {
74
- return expectedType; // w/e we don' t know the type
75
- }
76
-
77
- // Check the discriminator
78
- let discriminatorProperty = typeMap[expectedType].discriminator;
79
- if (discriminatorProperty == null) {
80
- return expectedType; // the type does not have a discriminator. use it.
81
- } else {
82
- if (data[discriminatorProperty]) {
83
- var discriminatorType = data[discriminatorProperty];
84
- if(typeMap[discriminatorType]){
85
- return discriminatorType; // use the type given in the discriminator
86
- } else {
87
- return expectedType; // discriminator did not map to a type
88
- }
89
- } else {
90
- return expectedType; // discriminator was not present (or an empty string)
91
- }
92
- }
93
- }
94
- }
95
-
96
60
public static serialize(data: any, type: string, format: string) {
97
61
if (data == undefined) {
98
62
return data;
@@ -131,14 +95,17 @@ export class ObjectSerializer {
131
95
return data.toISOString();
132
96
}
133
97
} else {
134
- if (enumsMap.has(type)) {
135
- return data;
98
+ if (enumsMap[type]) {
99
+ if (enumsMap[type].includes(data)) {
100
+ return data;
101
+ }
102
+ throw new TypeError(`unknown enum value '${data}'`)
136
103
}
137
104
if (oneOfMap[type]) {
138
105
let oneOfs: any[] = [];
139
106
for(let oneOf of oneOfMap[type]) {
140
107
try {
141
- oneOfs.push(ObjectSerializer.serialize(data, oneOf, format))
108
+ oneOfs.push(ObjectSerializer.serialize(data, oneOf, format));
142
109
} catch (e) {
143
110
console.debug(`could not serialize ${oneOf} (${e})`)
144
111
}
@@ -152,17 +119,28 @@ export class ObjectSerializer {
152
119
return oneOfs[0];
153
120
}
154
121
155
- if (!typeMap[type]) { // dont know the type
156
- throw new TypeError(`unknown type ' ${type} ' ` );
157
- }
122
+ // get the map for the correct type.
123
+ let attributesMap = typeMap[ type].getAttributeTypeMap( );
124
+ let instance: {[index: string]: any} = {};
158
125
159
- return typeMap[type].serialize(data);
126
+ for (let attributeName in attributesMap) {
127
+ let attributeObj = attributesMap[attributeName];
128
+ instance[attributeObj.baseName] = ObjectSerializer.serialize(data[attributeName], attributeObj.type, attributeObj.format);
129
+
130
+ // check for required properties
131
+ if (attributeObj?.required && instance[attributeObj.baseName] === undefined) {
132
+ throw new Error(`missing required property '${attributeObj.baseName}'`);
133
+ }
134
+
135
+ if (enumsMap[attributeObj.type] && !enumsMap[attributeObj.type].includes(instance[attributeObj.baseName])) {
136
+ instance.unparsedObject = instance[attributeObj.baseName];
137
+ }
138
+ }
139
+ return instance;
160
140
}
161
141
}
162
142
163
- public static deserialize(data: any, type: string, format: string) {
164
- // polymorphism may change the actual type.
165
- type = ObjectSerializer.findCorrectType(data, type);
143
+ public static deserialize(data: any, type: string, format: string = " " ) {
166
144
if (data == undefined) {
167
145
return data;
168
146
} else if (primitives.indexOf(type.toLowerCase()) !== -1) {
@@ -188,8 +166,8 @@ export class ObjectSerializer {
188
166
} else if (type === " Date" ) {
189
167
return new Date(data);
190
168
} else {
191
- if (enumsMap.has( type)) {// is Enum
192
- return data;
169
+ if (enumsMap[ type]) {
170
+ return data;
193
171
}
194
172
195
173
if (oneOfMap[type]) {
@@ -214,7 +192,26 @@ export class ObjectSerializer {
214
192
if (!typeMap[type]) { // dont know the type
215
193
throw new TypeError(`unknown type '${type}'`);
216
194
}
217
- return typeMap[type].deserialize(data);
195
+
196
+ let instance = new typeMap[type]();
197
+ let attributesMap = typeMap[type].getAttributeTypeMap();
198
+
199
+ for (let attributeName in attributesMap) {
200
+ let attributeObj = attributesMap[attributeName];
201
+ instance[attributeName] = ObjectSerializer.deserialize(data[attributeObj.baseName], attributeObj.type, attributeObj.format);
202
+
203
+ // check for required properties
204
+ if (attributeObj?.required && instance[attributeName] == undefined) {
205
+ throw new Error(`missing required property '${attributeName}'`);
206
+ }
207
+
208
+ // check for enum values
209
+ if (enumsMap[attributeObj.type] && !enumsMap[attributeObj.type].includes(instance[attributeName])) {
210
+ instance.unparsedObject = instance[attributeName];
211
+ }
212
+ }
213
+
214
+ return instance;
218
215
}
219
216
}
220
217
0 commit comments