{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE TemplateHaskell #-} module AWSLambda.Events where import Control.Applicative ((<|>)) import Control.Lens.TH import Data.Aeson (FromJSON (..), Value) import Network.AWS.Data.Text (FromText) import AWSLambda.Events.KinesisEvent import AWSLambda.Events.S3Event import AWSLambda.Events.SNSEvent -- | Not yet implemented data DynamoDBEvent -- | Not yet implemented data SESEvent -- | Not yet implemented data CognitoEvent -- | Not yet implemented data CloudFormationEvent -- | Not yet implemented data CloudWatchLogsEvent -- | Not yet implemented data CloudWatchEventsEvent -- | Not yet implemented data CodeCommitEvent -- | Not yet implemented data ConfigEvent -- | Not yet implemented data AlexaEvent -- | Not yet implemented data LexEvent -- | Not yet implemented data APIGatewayEvent -- | Not yet implemented data IoTButtonEvent -- | Not yet implemented data CloudFrontEvent -- | Not yet implemented data FirehoseEvent -- | Not yet implemented data InvokeEvent -- | Sum type for all possible Lambda events. -- Parameterised on the type of SNS Events to be handled. -- See @SNSEvent@ for details. data LambdaEvent snsMessage = S3 !S3Event | DynamoDB !DynamoDBEvent | KinesisStream !KinesisEvent | SNS !(SNSEvent snsMessage) | SES !SESEvent | Cognito !CognitoEvent | CloudFormation !CloudFormationEvent | CloudWatchLogs !CloudWatchLogsEvent | CloudWatchEvents !CloudWatchEventsEvent | CodeCommit !CodeCommitEvent | Config !ConfigEvent | Alexa !AlexaEvent | Lex !LexEvent | APIGateway !APIGatewayEvent | IoTButton !IoTButtonEvent | CloudFront !CloudFrontEvent | Firehose !FirehoseEvent | Invoke !InvokeEvent | Custom !Value -- | Attempt to parse the various event types. -- Any valid JSON that can't be parsed as a specific -- event type will result in a 'Custom' value. instance FromText snsMessage => FromJSON (LambdaEvent snsMessage) where parseJSON v = try S3 v <|> try KinesisStream v <|> try SNS v <|> pure (Custom v) where try f = fmap f . parseJSON $(makePrisms ''LambdaEvent)