11import logging
22from typing import Any , Callable , Dict , Optional
33
4- from pydantic import BaseModel , ValidationError
5-
64from ...middleware_factory import lambda_handler_decorator
75from ..typing import LambdaContext
8- from .envelopes .base import BaseEnvelope
9- from .exceptions import InvalidEnvelopeError , InvalidModelTypeError , ModelValidationError
6+ from .envelopes .base import Envelope
7+ from .exceptions import InvalidEnvelopeError , InvalidModelTypeError
8+ from .types import Model
109
1110logger = logging .getLogger (__name__ )
1211
1312
1413@lambda_handler_decorator
1514def event_parser (
16- handler : Callable [[Dict , Any ], Any ],
15+ handler : Callable [[Any , LambdaContext ], Any ],
1716 event : Dict [str , Any ],
1817 context : LambdaContext ,
19- model : BaseModel ,
20- envelope : Optional [BaseEnvelope ] = None ,
18+ model : Model ,
19+ envelope : Optional [Envelope ] = None ,
2120) -> Any :
2221 """Lambda handler decorator to parse & validate events using Pydantic models
2322
@@ -65,14 +64,14 @@ def handler(event: Order, context: LambdaContext):
6564 Lambda event to be parsed & validated
6665 context: LambdaContext
6766 Lambda context object
68- model: BaseModel
67+ model: Model
6968 Your data model that will replace the event.
70- envelope: BaseEnvelope
69+ envelope: Envelope
7170 Optional envelope to extract the model from
7271
7372 Raises
7473 ------
75- ModelValidationError
74+ ValidationError
7675 When input event does not conform with model provided
7776 InvalidModelTypeError
7877 When model given does not implement BaseModel
@@ -84,7 +83,7 @@ def handler(event: Order, context: LambdaContext):
8483 return handler (parsed_event , context )
8584
8685
87- def parse (event : Dict [str , Any ], model : BaseModel , envelope : Optional [BaseEnvelope ] = None ) -> Any :
86+ def parse (event : Dict [str , Any ], model : Model , envelope : Optional [Envelope ] = None ) -> Model :
8887 """Standalone function to parse & validate events using Pydantic models
8988
9089 Typically used when you need fine-grained control over error handling compared to event_parser decorator.
@@ -94,7 +93,7 @@ def parse(event: Dict[str, Any], model: BaseModel, envelope: Optional[BaseEnvelo
9493
9594 **Lambda handler decorator to parse & validate event**
9695
97- from aws_lambda_powertools.utilities.parser.exceptions import ModelValidationError
96+ from aws_lambda_powertools.utilities.parser import ValidationError
9897
9998 class Order(BaseModel):
10099 id: int
@@ -104,7 +103,7 @@ class Order(BaseModel):
104103 def handler(event: Order, context: LambdaContext):
105104 try:
106105 parse(model=Order)
107- except ModelValidationError :
106+ except ValidationError :
108107 ...
109108
110109 **Lambda handler decorator to parse & validate event - using built-in envelope**
@@ -117,21 +116,21 @@ class Order(BaseModel):
117116 def handler(event: Order, context: LambdaContext):
118117 try:
119118 parse(model=Order, envelope=envelopes.EVENTBRIDGE)
120- except ModelValidationError :
119+ except ValidationError :
121120 ...
122121
123122 Parameters
124123 ----------
125124 event: Dict
126125 Lambda event to be parsed & validated
127- model: BaseModel
126+ model: Model
128127 Your data model that will replace the event
129- envelope: BaseEnvelope
128+ envelope: Envelope
130129 Optional envelope to extract the model from
131130
132131 Raises
133132 ------
134- ModelValidationError
133+ ValidationError
135134 When input event does not conform with model provided
136135 InvalidModelTypeError
137136 When model given does not implement BaseModel
@@ -144,13 +143,12 @@ def handler(event: Order, context: LambdaContext):
144143 return envelope ().parse (data = event , model = model )
145144 except AttributeError :
146145 raise InvalidEnvelopeError (f"Envelope must implement BaseEnvelope, envelope={ envelope } " )
147- except (ValidationError , TypeError ) as e :
148- raise ModelValidationError (f"Input event does not conform with model, envelope={ envelope } " ) from e
149146
150147 try :
151148 logger .debug ("Parsing and validating event model; no envelope used" )
149+ if isinstance (event , str ):
150+ return model .parse_raw (event )
151+
152152 return model .parse_obj (event )
153- except (ValidationError , TypeError ) as e :
154- raise ModelValidationError ("Input event does not conform with model" ) from e
155153 except AttributeError :
156- raise InvalidModelTypeError ("Input model must implement BaseModel" )
154+ raise InvalidModelTypeError (f "Input model must implement BaseModel, model= { model } " )
0 commit comments