Skip to content

Commit 5362a16

Browse files
authored
fix(parser): overload parse when using envelope (#885)
1 parent 99227ce commit 5362a16

File tree

3 files changed

+19
-11
lines changed

3 files changed

+19
-11
lines changed

Diff for: aws_lambda_powertools/utilities/parser/envelopes/base.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from abc import ABC, abstractmethod
33
from typing import Any, Dict, Optional, Type, TypeVar, Union
44

5-
from ..types import Model
5+
from aws_lambda_powertools.utilities.parser.types import Model
66

77
logger = logging.getLogger(__name__)
88

Diff for: aws_lambda_powertools/utilities/parser/parser.py

+16-10
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
11
import logging
2-
from typing import Any, Callable, Dict, Optional, Type, TypeVar, Union
2+
from typing import Any, Callable, Dict, Optional, Type, overload
3+
4+
from aws_lambda_powertools.utilities.parser.types import EnvelopeModel, EventParserReturnType, Model
35

46
from ...middleware_factory import lambda_handler_decorator
57
from ..typing import LambdaContext
68
from .envelopes.base import Envelope
79
from .exceptions import InvalidEnvelopeError, InvalidModelTypeError
8-
from .types import Model
910

1011
logger = logging.getLogger(__name__)
1112

1213

13-
EventParserReturnType = TypeVar("EventParserReturnType")
14-
15-
1614
@lambda_handler_decorator
1715
def event_parser(
1816
handler: Callable[[Any, LambdaContext], EventParserReturnType],
1917
event: Dict[str, Any],
2018
context: LambdaContext,
2119
model: Type[Model],
22-
envelope: Optional[Union[Envelope, Type[Envelope]]] = None,
20+
envelope: Optional[Type[Envelope]] = None,
2321
) -> EventParserReturnType:
2422
"""Lambda handler decorator to parse & validate events using Pydantic models
2523
@@ -81,14 +79,22 @@ def handler(event: Order, context: LambdaContext):
8179
InvalidEnvelopeError
8280
When envelope given does not implement BaseEnvelope
8381
"""
84-
parsed_event = parse(event=event, model=model, envelope=envelope)
82+
parsed_event = parse(event=event, model=model, envelope=envelope) if envelope else parse(event=event, model=model)
8583
logger.debug(f"Calling handler {handler.__name__}")
8684
return handler(parsed_event, context)
8785

8886

89-
def parse(
90-
event: Dict[str, Any], model: Type[Model], envelope: Optional[Union[Envelope, Type[Envelope]]] = None
91-
) -> Model:
87+
@overload
88+
def parse(event: Dict[str, Any], model: Type[Model]) -> Model:
89+
...
90+
91+
92+
@overload
93+
def parse(event: Dict[str, Any], model: Type[Model], envelope: Type[Envelope]) -> EnvelopeModel:
94+
...
95+
96+
97+
def parse(event: Dict[str, Any], model: Type[Model], envelope: Optional[Type[Envelope]] = None):
9298
"""Standalone function to parse & validate events using Pydantic models
9399
94100
Typically used when you need fine-grained control over error handling compared to event_parser decorator.

Diff for: aws_lambda_powertools/utilities/parser/types.py

+2
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@
1212
from typing_extensions import Literal # noqa: F401
1313

1414
Model = TypeVar("Model", bound=BaseModel)
15+
EnvelopeModel = TypeVar("EnvelopeModel")
16+
EventParserReturnType = TypeVar("EventParserReturnType")

0 commit comments

Comments
 (0)