{-# 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