aws-0.23: Aws/Iam/Internal.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TupleSections #-}
module Aws.Iam.Internal
( iamAction
, iamAction'
, markedIter
, markedIterResponse
-- * Re-exports
, (<>)
) where
import Aws.Core
import Aws.Iam.Core
import Control.Applicative
import Control.Arrow (second)
import Control.Monad
import Control.Monad.Trans.Resource (MonadThrow)
import Data.ByteString (ByteString)
import Data.Maybe
import Data.Monoid
import Prelude
import Data.Text (Text)
import qualified Data.Text as Text
import qualified Data.Text.Encoding as Text
import Text.XML.Cursor (($//))
import qualified Text.XML.Cursor as Cu
-- | Similar to 'iamSignQuery'. Accepts parameters in @Text@ form and UTF-8
-- encodes them. Accepts the @Action@ parameter separately since it's always
-- required.
iamAction
:: ByteString
-> [(ByteString, Text)]
-> IamConfiguration qt
-> SignatureData
-> SignedQuery
iamAction action = iamSignQuery
. (:) ("Action", action)
. map (second Text.encodeUtf8)
-- | Similar to 'iamAction'. Accepts parameter list with @Maybe@ parameters.
-- Ignores @Nothing@s.
iamAction'
:: ByteString
-> [Maybe (ByteString, Text)]
-> IamConfiguration qt
-> SignatureData
-> SignedQuery
iamAction' action = iamAction action . catMaybes
-- | Returns the parameters @Marker@ and @MaxItems@ that are present in all
-- IAM data pagination requests.
markedIter :: Maybe Text -> Maybe Integer -> [Maybe (ByteString, Text)]
markedIter marker maxItems
= [ ("Marker" ,) <$> marker
, ("MaxItems",) . encodeInteger <$> maxItems
]
where
encodeInteger = Text.pack . show
-- | Reads and returns the @IsTruncated@ and @Marker@ attributes present in
-- all IAM data pagination responses.
markedIterResponse
:: MonadThrow m
=> Cu.Cursor
-> m (Bool, Maybe Text)
markedIterResponse cursor = do
isTruncated <- (Text.toCaseFold "true" ==) `liftM` attr "IsTruncated"
marker <- if isTruncated
then Just `liftM` attr "Marker"
else return Nothing
return (isTruncated, marker)
where
attr name = force ("Missing " ++ Text.unpack name) $
cursor $// elContent name