{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}
{-# LANGUAGE TemplateHaskell   #-}

{-|
Module: AWSLambda.Events.KinesisEvent
Description: Types for Kinesis Lambda events

Based on https://github.com/aws/aws-lambda-dotnet/tree/master/Libraries/src/Amazon.Lambda.KinesisEvents
-}
module AWSLambda.Events.KinesisEvent where

import           Control.Lens.TH
import           Data.Aeson                (FromJSON (..), withObject, (.:))
import           Data.Aeson.Casing         (aesonDrop, camelCase)
import           Data.Aeson.TH             (deriveFromJSON)
import           Data.Text                 (Text)
import           Network.AWS.Data.Base64   (Base64 (..))
import qualified Network.AWS.Kinesis.Types as Kinesis
import qualified Network.AWS.Types         as AWS

import           AWSLambda.Events.Records

data KinesisRecord = KinesisRecord
  { KinesisRecord -> Record
_krRecord               :: !Kinesis.Record
  , KinesisRecord -> Text
_krKinesisSchemaVersion :: !Text
  } deriving (KinesisRecord -> KinesisRecord -> Bool
(KinesisRecord -> KinesisRecord -> Bool)
-> (KinesisRecord -> KinesisRecord -> Bool) -> Eq KinesisRecord
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KinesisRecord -> KinesisRecord -> Bool
$c/= :: KinesisRecord -> KinesisRecord -> Bool
== :: KinesisRecord -> KinesisRecord -> Bool
$c== :: KinesisRecord -> KinesisRecord -> Bool
Eq, Int -> KinesisRecord -> ShowS
[KinesisRecord] -> ShowS
KinesisRecord -> String
(Int -> KinesisRecord -> ShowS)
-> (KinesisRecord -> String)
-> ([KinesisRecord] -> ShowS)
-> Show KinesisRecord
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KinesisRecord] -> ShowS
$cshowList :: [KinesisRecord] -> ShowS
show :: KinesisRecord -> String
$cshow :: KinesisRecord -> String
showsPrec :: Int -> KinesisRecord -> ShowS
$cshowsPrec :: Int -> KinesisRecord -> ShowS
Show)

instance FromJSON KinesisRecord where
  parseJSON :: Value -> Parser KinesisRecord
parseJSON =
    String
-> (Object -> Parser KinesisRecord)
-> Value
-> Parser KinesisRecord
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"KinesisRecord" ((Object -> Parser KinesisRecord) -> Value -> Parser KinesisRecord)
-> (Object -> Parser KinesisRecord)
-> Value
-> Parser KinesisRecord
forall a b. (a -> b) -> a -> b
$
    \Object
o -> do
      Text
_krKinesisSchemaVersion <- Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"kinesisSchemaVersion"
      Base64
dataBase64 <- Object
o Object -> Text -> Parser Base64
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"data"
      Record
_krRecord <-
        Text -> ByteString -> Text -> Record
Kinesis.record (Text -> ByteString -> Text -> Record)
-> Parser Text -> Parser (ByteString -> Text -> Record)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"sequenceNumber") Parser (ByteString -> Text -> Record)
-> Parser ByteString -> Parser (Text -> Record)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ByteString -> Parser ByteString
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Base64 -> ByteString
unBase64 Base64
dataBase64) Parser (Text -> Record) -> Parser Text -> Parser Record
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
        (Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"partitionKey")
      KinesisRecord -> Parser KinesisRecord
forall (m :: * -> *) a. Monad m => a -> m a
return KinesisRecord :: Record -> Text -> KinesisRecord
KinesisRecord {Text
Record
_krRecord :: Record
_krKinesisSchemaVersion :: Text
_krKinesisSchemaVersion :: Text
_krRecord :: Record
..}
$(makeLenses ''KinesisRecord)

data KinesisEventRecord = KinesisEventRecord
  { KinesisEventRecord -> KinesisRecord
_kerKinesis           :: !KinesisRecord
  , KinesisEventRecord -> Text
_kerEventSource       :: !Text
  , KinesisEventRecord -> Text
_kerEventID           :: !Text
  , KinesisEventRecord -> Text
_kerInvokeIdentityArn :: !Text
  , KinesisEventRecord -> Text
_kerEventVersion      :: !Text
  , KinesisEventRecord -> Text
_kerEventName         :: !Text
  , KinesisEventRecord -> Text
_kerEventSourceARN    :: !Text
  , KinesisEventRecord -> Region
_kerAwsRegion         :: !AWS.Region
  } deriving (KinesisEventRecord -> KinesisEventRecord -> Bool
(KinesisEventRecord -> KinesisEventRecord -> Bool)
-> (KinesisEventRecord -> KinesisEventRecord -> Bool)
-> Eq KinesisEventRecord
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KinesisEventRecord -> KinesisEventRecord -> Bool
$c/= :: KinesisEventRecord -> KinesisEventRecord -> Bool
== :: KinesisEventRecord -> KinesisEventRecord -> Bool
$c== :: KinesisEventRecord -> KinesisEventRecord -> Bool
Eq, Int -> KinesisEventRecord -> ShowS
[KinesisEventRecord] -> ShowS
KinesisEventRecord -> String
(Int -> KinesisEventRecord -> ShowS)
-> (KinesisEventRecord -> String)
-> ([KinesisEventRecord] -> ShowS)
-> Show KinesisEventRecord
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KinesisEventRecord] -> ShowS
$cshowList :: [KinesisEventRecord] -> ShowS
show :: KinesisEventRecord -> String
$cshow :: KinesisEventRecord -> String
showsPrec :: Int -> KinesisEventRecord -> ShowS
$cshowsPrec :: Int -> KinesisEventRecord -> ShowS
Show)
$(deriveFromJSON (aesonDrop 4 camelCase) ''KinesisEventRecord)
$(makeLenses ''KinesisEventRecord)

type KinesisEvent = RecordsEvent KinesisEventRecord