@@ -194,6 +194,15 @@ class ResponseParserError(Exception):
194194 pass
195195
196196
197+ def box_decorator (func ):
198+ def handle_box (self , shape , value ):
199+ if shape .boxed and value is None :
200+ return None
201+ return func (self , shape , value )
202+
203+ return handle_box
204+
205+
197206class ResponseParser :
198207 """Base class for response parsing.
199208
@@ -340,10 +349,18 @@ def _do_modeled_error_parse(self, response, shape, parsed):
340349 f"{ self .__class__ .__name__ } ._do_modeled_error_parse"
341350 )
342351
352+ BOXABLE_PRIMITIVE_TYPES = ["long" , "integer" , "boolean" ]
353+
343354 def _parse_shape (self , shape , node ):
344355 handler = getattr (
345356 self , f'_handle_{ shape .type_name } ' , self ._default_handle
346357 )
358+ if (
359+ shape .type_name in self .BOXABLE_PRIMITIVE_TYPES
360+ and shape .boxed
361+ and node is None
362+ ):
363+ return None
347364 return handler (shape , node )
348365
349366 def _handle_list (self , shape , node ):
@@ -1331,10 +1348,7 @@ def _handle_boolean(self, shape, value):
13311348 return ensure_boolean (value )
13321349
13331350 def _handle_integer (self , shape , value ):
1334- if value is None :
1335- return None
1336- else :
1337- return int (value )
1351+ return int (value )
13381352
13391353 def _handle_float (self , shape , value ):
13401354 return float (value )
0 commit comments