{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TemplateHaskell #-}
module AWSLambda.Events
( module AWSLambda.Events.APIGateway
, module AWSLambda.Events.KinesisEvent
, module AWSLambda.Events.MessageAttribute
, module AWSLambda.Events.Records
, module AWSLambda.Events.S3Event
, module AWSLambda.Events.SNSEvent
, module AWSLambda.Events.SQSEvent
, traverseSnsInSqs
, snsInSqsMain
, traverseS3InSnsInSqs
, s3InSnsInSqsMain
) where
import Control.Exception.Safe (MonadCatch)
import Control.Monad.IO.Class
import Data.Aeson (FromJSON (..))
import AWSLambda.Events.APIGateway
import AWSLambda.Events.KinesisEvent
import AWSLambda.Events.MessageAttribute
import AWSLambda.Events.Records
import AWSLambda.Events.S3Event
import AWSLambda.Events.SNSEvent
import AWSLambda.Events.SQSEvent
import AWSLambda.Handler (lambdaMain)
import Data.Aeson.Embedded (Embedded)
-- | Traverse all the SNS messages embedded in an SQS event
traverseSnsInSqs :: (FromJSON a, Applicative m) => (a -> m ()) -> SQSEvent (Embedded (SNSMessage (Embedded a))) -> m ()
traverseSnsInSqs = traverseSqs . traverseSnsMessage
-- | A specialised version of the 'lambdaMain' entry-point
-- for handling individual SNS messages embedded in an SQS event
snsInSqsMain :: (FromJSON a, MonadCatch m, MonadIO m) => (a -> m ()) -> m ()
snsInSqsMain = lambdaMain . traverseSnsInSqs
-- | Traverse S3 events embedded within SNS messages within an SQS event
traverseS3InSnsInSqs :: (Applicative m) => (S3EventNotification -> m ()) -> SQSEvent (Embedded (SNSMessage (Embedded S3Event))) -> m ()
traverseS3InSnsInSqs = traverseSnsInSqs . traverseRecords
-- | A specialised version of the 'lambdaMain' entry-point
-- for handling individual S3 event notifications embedded in
-- SNS messages embedded in an SQS event
s3InSnsInSqsMain :: (MonadCatch m, MonadIO m) => (S3EventNotification -> m ()) -> m ()
s3InSnsInSqsMain = lambdaMain . traverseS3InSnsInSqs