{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}
module AWSLambda.Events.SQSEvent where
import Control.Lens
import Data.Aeson (FromJSON (..), genericParseJSON)
import Data.Aeson.Casing (aesonPrefix, camelCase)
import Data.Aeson.Embedded
import Data.Aeson.TextValue
import Data.ByteString (ByteString)
import Data.HashMap.Strict (HashMap)
import Data.Text (Text)
import GHC.Generics (Generic)
import Network.AWS.Data.Base64
import Network.AWS.Data.Text (FromText)
import qualified Network.AWS.Types as AWS
import AWSLambda.Events.MessageAttribute
import AWSLambda.Events.Records
data SQSMessage body = SQSMessage
{ _sqsmMessageId :: !Text
, _sqsmReceiptHandle :: !Text
, _sqsmBody :: !(TextValue body)
, _sqsmAttributes :: !(HashMap Text Text)
, _sqsmMessageAttributes :: !(HashMap Text MessageAttribute)
, _sqsmMd5OfBody :: !Text
, _sqsmEventSource :: !Text
, _sqsmEventSourceARN :: !Text
, _sqsmAwsRegion :: !AWS.Region
} deriving (Show, Eq, Generic)
instance FromText message => FromJSON (SQSMessage message) where
parseJSON = genericParseJSON $ aesonPrefix camelCase
$(makeLenses ''SQSMessage)
type SQSEvent body = RecordsEvent (SQSMessage body)
sqsMessages :: Traversal (SQSEvent message) (SQSEvent message') message message'
sqsMessages = reRecords . traverse . sqsmBody . unTextValue
sqsEmbedded :: Traversal (SQSEvent (Embedded v)) (SQSEvent (Embedded v')) v v'
sqsEmbedded = sqsMessages . unEmbed
sqsBinary :: Traversal' (SQSEvent Base64) ByteString
sqsBinary = sqsMessages . _Base64