antiope-sns-6.4.0: src/Antiope/SNS/Messages.hs
{-# LANGUAGE DeriveGeneric #-}
module Antiope.SNS.Messages
( SnsMessage (..)
) where
import Data.Aeson as Aeson
import Data.Text (Text)
import Data.Time.Clock (UTCTime)
import GHC.Generics (Generic)
import qualified Data.Aeson.Types as Aeson
import qualified Data.Text.Encoding as T
data SnsMessage a = SnsMessage
{ type' :: !(Maybe Text)
, messageId :: !(Maybe Text)
, topicArn :: !(Maybe Text)
, subject :: !(Maybe Text)
, timestamp :: !(Maybe UTCTime)
, message :: !a
} deriving (Show, Eq, Generic)
instance FromJSON a => FromJSON (SnsMessage a) where
parseJSON = withObject "SnsMessage" $ \obj -> SnsMessage
<$> obj .:? "Type"
<*> obj .:? "MessageId"
<*> obj .:? "TopicArn"
<*> obj .:? "Subject"
<*> obj .:? "Timestamp"
<*> decodeEscaped obj "Message"
decodeEscaped :: FromJSON b => Object -> Text -> Aeson.Parser b
decodeEscaped o t =
(o .: t) >>= (either fail pure . eitherDecodeStrict . T.encodeUtf8)