Skip to content

fix(parser): overload parse when using envelope #885

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion aws_lambda_powertools/utilities/parser/envelopes/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from abc import ABC, abstractmethod
from typing import Any, Dict, Optional, Type, TypeVar, Union

from ..types import Model
from aws_lambda_powertools.utilities.parser.types import Model

logger = logging.getLogger(__name__)

Expand Down
26 changes: 16 additions & 10 deletions aws_lambda_powertools/utilities/parser/parser.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,23 @@
import logging
from typing import Any, Callable, Dict, Optional, Type, TypeVar, Union
from typing import Any, Callable, Dict, Optional, Type, overload

from aws_lambda_powertools.utilities.parser.types import EnvelopeModel, EventParserReturnType, Model

from ...middleware_factory import lambda_handler_decorator
from ..typing import LambdaContext
from .envelopes.base import Envelope
from .exceptions import InvalidEnvelopeError, InvalidModelTypeError
from .types import Model

logger = logging.getLogger(__name__)


EventParserReturnType = TypeVar("EventParserReturnType")


@lambda_handler_decorator
def event_parser(
handler: Callable[[Any, LambdaContext], EventParserReturnType],
event: Dict[str, Any],
context: LambdaContext,
model: Type[Model],
envelope: Optional[Union[Envelope, Type[Envelope]]] = None,
envelope: Optional[Type[Envelope]] = None,
) -> EventParserReturnType:
"""Lambda handler decorator to parse & validate events using Pydantic models

Expand Down Expand Up @@ -81,14 +79,22 @@ def handler(event: Order, context: LambdaContext):
InvalidEnvelopeError
When envelope given does not implement BaseEnvelope
"""
parsed_event = parse(event=event, model=model, envelope=envelope)
parsed_event = parse(event=event, model=model, envelope=envelope) if envelope else parse(event=event, model=model)
logger.debug(f"Calling handler {handler.__name__}")
return handler(parsed_event, context)


def parse(
event: Dict[str, Any], model: Type[Model], envelope: Optional[Union[Envelope, Type[Envelope]]] = None
) -> Model:
@overload
def parse(event: Dict[str, Any], model: Type[Model]) -> Model:
...


@overload
def parse(event: Dict[str, Any], model: Type[Model], envelope: Type[Envelope]) -> EnvelopeModel:
...


def parse(event: Dict[str, Any], model: Type[Model], envelope: Optional[Type[Envelope]] = None):
"""Standalone function to parse & validate events using Pydantic models

Typically used when you need fine-grained control over error handling compared to event_parser decorator.
Expand Down
2 changes: 2 additions & 0 deletions aws_lambda_powertools/utilities/parser/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,5 @@
from typing_extensions import Literal # noqa: F401

Model = TypeVar("Model", bound=BaseModel)
EnvelopeModel = TypeVar("EnvelopeModel")
EventParserReturnType = TypeVar("EventParserReturnType")