module Aws.Sns.Commands.ListTopics
( ListTopicsNextToken
, ListTopics(..)
, ListTopicsResponse(..)
, ListTopicsErrors(..)
) where
import Aws.Core
import Aws.General
import Aws.Sns.Core
import Control.Applicative
import Control.Monad
import Control.Monad.Trans.Resource (throwM)
import Data.Maybe
import Data.Monoid
import Data.String
import qualified Data.Text as T
import Data.Typeable
import Text.XML.Cursor (($//), (&/))
import qualified Text.XML.Cursor as CU
listTopicsAction :: SnsAction
listTopicsAction = SnsActionListTopics
newtype ListTopicsNextToken = ListTopicsNextToken { listTopicsNextTokenText :: T.Text }
deriving (Show, Read, Eq, Ord, Monoid, IsString)
data ListTopics = ListTopics
{ listTopicsNextToken :: !(Maybe ListTopicsNextToken)
}
deriving (Show, Read, Eq, Ord, Typeable)
data ListTopicsResponse = ListTopicsResponse
{ listTopicsResponseNextToken :: !(Maybe ListTopicsNextToken)
, listTopicsResponseTopics :: ![Arn]
}
deriving (Show, Read, Eq, Ord, Typeable)
instance ResponseConsumer r ListTopicsResponse where
type ResponseMetadata ListTopicsResponse = SnsMetadata
responseConsumer _ = snsXmlResponseConsumer p
where
p el = ListTopicsResponse (nextToken el) <$> arns el
arns el = do
let t = el
$// CU.laxElement "ListTopicsResult"
&/ CU.laxElement "Topics"
&/ CU.laxElement "member"
&/ CU.laxElement "TopicArn"
&/ CU.content
forM t $ \i -> case fromText i of
Right a -> return a
Left e -> throwM $ SnsResponseDecodeError
$ "failed to parse topic ARN (" <> i <> "): " <> (T.pack . show) e
nextToken el = fmap ListTopicsNextToken . listToMaybe $ el
$// CU.laxElement "ListTopicsResult"
&/ CU.laxElement "NextToken"
&/ CU.content
instance SignQuery ListTopics where
type ServiceConfiguration ListTopics = SnsConfiguration
signQuery ListTopics{..} = snsSignQuery SnsQuery
{ snsQueryMethod = Get
, snsQueryAction = listTopicsAction
, snsQueryParameters = case listTopicsNextToken of
Nothing -> []
Just _ -> [("NextToken", listTopicsNextTokenText <$> listTopicsNextToken)]
, snsQueryBody = Nothing
}
instance Transaction ListTopics ListTopicsResponse
instance AsMemoryResponse ListTopicsResponse where
type MemoryResponse ListTopicsResponse = ListTopicsResponse
loadToMemory = return
instance ListResponse ListTopicsResponse Arn where
listResponse (ListTopicsResponse _ arns) = arns
instance IteratedTransaction ListTopics ListTopicsResponse where
nextIteratedRequest _ ListTopicsResponse{..} =
ListTopics listTopicsResponseNextToken <$ listTopicsResponseNextToken
data ListTopicsErrors
= ListTopicsAuthorizationError
| ListTopicsInternalError
| ListTopicsInvalidParameter
deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)