antiope-sns-7.0.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.ByteString.Lazy as LBS
import qualified Data.Text.Encoding as Text
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"
instance ToJSON a => ToJSON (SnsMessage a) where
toJSON msg = object
[ "Type" .= type' msg
, "MessageId" .= messageId msg
, "TopicArn" .= topicArn msg
, "Subject" .= subject msg
, "Timestamp" .= timestamp msg
, "Message" .= (Text.decodeUtf8 . LBS.toStrict . encode . message) msg
]
decodeEscaped :: FromJSON b => Object -> Text -> Aeson.Parser b
decodeEscaped o t =
(o .: t) >>= (either fail pure . eitherDecodeStrict . Text.encodeUtf8)