module Aws.Sns.Commands.Subscribe
( Subscribe(..)
, SubscribeResponse(..)
, SubscribeErrors(..)
) where
import Aws.Core
import Aws.General
import Aws.Sns.Core
import Data.Traversable as TR
import Control.Applicative
import Control.Monad.Trans.Resource (throwM)
import Data.Maybe
import Data.Monoid
import qualified Data.Text as T
import Data.Typeable
import Text.XML.Cursor (($//), (&/))
import qualified Text.XML.Cursor as CU
subscribeAction :: SnsAction
subscribeAction = SnsActionSubscribe
data Subscribe = Subscribe
{ subscribeEndpoint :: !(Maybe SnsEndpoint)
, subscribeProtocol :: !SnsProtocol
, subscribeTopicArn :: !Arn
}
deriving (Show, Read, Eq, Ord, Typeable)
data SubscribeResponse = SubscribeResponse
{ subscribeResSubscriptionArn :: !(Maybe Arn)
}
deriving (Show, Read, Eq, Ord, Typeable)
instance ResponseConsumer r SubscribeResponse where
type ResponseMetadata SubscribeResponse = SnsMetadata
responseConsumer _ = snsXmlResponseConsumer p
where
p el = SubscribeResponse <$> arn el
arn el = do
let t = listToMaybe . filter (/= "pending confirmation") $ el
$// CU.laxElement "SubscribeResult"
&/ CU.laxElement "SubscriptionArn"
&/ CU.content
TR.forM t $ \t_ -> case fromText t_ of
Right a -> return a
Left e -> throwM $ SnsResponseDecodeError $
"failed to parse subscription ARN (" <> t_ <> "): " <> (T.pack . show) e
instance SignQuery Subscribe where
type ServiceConfiguration Subscribe = SnsConfiguration
signQuery Subscribe{..} = snsSignQuery SnsQuery
{ snsQueryMethod = Get
, snsQueryAction = subscribeAction
, snsQueryParameters = catMaybes
[ ("Endpoint",) . Just <$> subscribeEndpoint
, Just ("Protocol", Just . toText $ subscribeProtocol)
, Just ("TopicArn", Just . toText $ subscribeTopicArn)
]
, snsQueryBody = Nothing
}
instance Transaction Subscribe SubscribeResponse
instance AsMemoryResponse SubscribeResponse where
type MemoryResponse SubscribeResponse = SubscribeResponse
loadToMemory = return
data SubscribeErrors
= SubscribeAuthorizationError
| SubscribeInternalError
| SubscribeInvalidParameter
| SubscribeNotFound
| SubscribeTopicLimitExceeded
deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)