@@ -161,6 +161,17 @@ def get_required_input_params_for_cls(cls, valuesdict):
161
161
def try_parse (value , types ):
162
162
if not types : return value
163
163
164
+ # If it's an array, we should call try_parse (recursively)
165
+
166
+ if isinstance (value , list ):
167
+ retval = [Serializable .try_parse (t , types ) for t in value ]
168
+ invalid_values = get_indices_of_element_in_list ([False if v is None else True for v in retval ], False )
169
+ if invalid_values :
170
+ invalid_valuesstr = ',' .join (str (i ) for i in invalid_values )
171
+ raise Exception (f"Couldn't parse items: { invalid_valuesstr } , corresponding to: "
172
+ + ", " .join (str (value [i ] for i in invalid_values )))
173
+ return retval
174
+
164
175
for T in types :
165
176
retval = Serializable .try_parse_type (value , T )
166
177
if retval :
@@ -185,7 +196,14 @@ def try_parse_type(value, T):
185
196
elif isinstance (T , list ):
186
197
T = T [0 ]
187
198
188
- if isinstance (value , list ):
199
+ if T in _unparseable_types :
200
+ try :
201
+ if isinstance (value , list ):
202
+ return [T (v ) for v in value ]
203
+ return T (value )
204
+ except :
205
+ return None
206
+ elif isinstance (value , list ):
189
207
return [T .parse_dict (vv ) for vv in value ]
190
208
elif isinstance (value , dict ):
191
209
# We'll need to map the 'id' back in
@@ -198,6 +216,12 @@ def try_parse_type(value, T):
198
216
raise Exception ("Don't recognise type '%s', expected dictionary or list" % type (value ))
199
217
200
218
# T is the retval, or an array of the values (because some params are allowed to be both
201
- return T .parse_dict ( value ) if not isinstance (value , list ) else [T .parse_dict ( vv ) for vv in value ]
219
+ return T .parse_dict_generic ( T , value ) if not isinstance (value , list ) else [T .parse_dict_generic ( T , vv ) for vv in value ]
202
220
203
221
222
+ def get_indices_of_element_in_list (searchable , element ):
223
+ indices = []
224
+ for i in range (len (searchable )):
225
+ if element == searchable [i ]:
226
+ indices .append (i )
227
+ return indices
0 commit comments