packages feed

amazonka 1.0.1 → 1.1.0

raw patch · 8 files changed

+269/−374 lines, 8 filesdep −freedep ~amazonka-coredep ~bytestringdep ~conduitPVP ok

version bump matches the API change (PVP)

Dependencies removed: free

Dependency ranges changed: amazonka-core, bytestring, conduit, conduit-extra, directory, exceptions, http-client, http-conduit, ini, lens, mmorph, monad-control, mtl, resourcet, retry, text, time, transformers, transformers-base, transformers-compat

API changes (from Hackage documentation)

- Control.Monad.Trans.AWS: data Command r
- Control.Monad.Trans.AWS: execAWST :: (MonadCatch m, MonadResource m, HasEnv r) => (forall a. Either Error a -> m a) -> r -> AWST m b -> m b
- Control.Monad.Trans.AWS: hoistAWST :: (Monad m, Monad n) => (forall a. m a -> n a) -> AWST m b -> AWST n b
- Control.Monad.Trans.AWS: instance Alternative m => Alternative (AWST m)
- Control.Monad.Trans.AWS: instance Applicative (AWST m)
- Control.Monad.Trans.AWS: instance Functor (AWST m)
- Control.Monad.Trans.AWS: instance Monad (AWST m)
- Control.Monad.Trans.AWS: instance Monad m => MonadReader Env (AWST m)
- Control.Monad.Trans.AWS: instance MonadBase b m => MonadBase b (AWST m)
- Control.Monad.Trans.AWS: instance MonadBaseControl b m => MonadBaseControl b (AWST m)
- Control.Monad.Trans.AWS: instance MonadCatch m => MonadCatch (AWST m)
- Control.Monad.Trans.AWS: instance MonadError e m => MonadError e (AWST m)
- Control.Monad.Trans.AWS: instance MonadFree Command (AWST m)
- Control.Monad.Trans.AWS: instance MonadIO m => MonadIO (AWST m)
- Control.Monad.Trans.AWS: instance MonadPlus m => MonadPlus (AWST m)
- Control.Monad.Trans.AWS: instance MonadResource m => MonadResource (AWST m)
- Control.Monad.Trans.AWS: instance MonadState s m => MonadState s (AWST m)
- Control.Monad.Trans.AWS: instance MonadThrow m => MonadThrow (AWST m)
- Control.Monad.Trans.AWS: instance MonadTrans AWST
- Control.Monad.Trans.AWS: instance MonadWriter w m => MonadWriter w (AWST m)
- Network.AWS: data Command r
- Network.AWS: instance (Functor f, MonadAWS m) => MonadAWS (FreeT f m)
- Network.AWS: instance (Monoid w, MonadAWS m) => MonadAWS (RWST r w s m)
- Network.AWS: instance (Monoid w, MonadAWS m) => MonadAWS (WriterT w m)
- Network.AWS: instance MonadAWS AWS
- Network.AWS: instance MonadAWS m => MonadAWS (ContT r m)
- Network.AWS: instance MonadAWS m => MonadAWS (ExceptT e m)
- Network.AWS: instance MonadAWS m => MonadAWS (FT f m)
- Network.AWS: instance MonadAWS m => MonadAWS (IdentityT m)
- Network.AWS: instance MonadAWS m => MonadAWS (IterT m)
- Network.AWS: instance MonadAWS m => MonadAWS (ListT m)
- Network.AWS: instance MonadAWS m => MonadAWS (MaybeT m)
- Network.AWS: instance MonadAWS m => MonadAWS (ReaderT r m)
- Network.AWS: instance MonadAWS m => MonadAWS (StateT s m)
- Network.AWS.Auth: instance AsAuthError AuthError
- Network.AWS.Auth: instance AsAuthError SomeException
- Network.AWS.Auth: instance Eq Credentials
- Network.AWS.Auth: instance Exception AuthError
- Network.AWS.Auth: instance Show AuthError
- Network.AWS.Auth: instance Show Credentials
- Network.AWS.Auth: instance ToLog AuthError
- Network.AWS.Auth: instance ToLog Credentials
- Network.AWS.Auth: instance Typeable AuthError
- Network.AWS.EC2.Metadata: instance Eq Dynamic
- Network.AWS.EC2.Metadata: instance Eq Info
- Network.AWS.EC2.Metadata: instance Eq Interface
- Network.AWS.EC2.Metadata: instance Eq Mapping
- Network.AWS.EC2.Metadata: instance Eq Metadata
- Network.AWS.EC2.Metadata: instance Ord Dynamic
- Network.AWS.EC2.Metadata: instance Ord Info
- Network.AWS.EC2.Metadata: instance Ord Interface
- Network.AWS.EC2.Metadata: instance Ord Mapping
- Network.AWS.EC2.Metadata: instance Ord Metadata
- Network.AWS.EC2.Metadata: instance Show Dynamic
- Network.AWS.EC2.Metadata: instance Show Info
- Network.AWS.EC2.Metadata: instance Show Interface
- Network.AWS.EC2.Metadata: instance Show Mapping
- Network.AWS.EC2.Metadata: instance Show Metadata
- Network.AWS.EC2.Metadata: instance ToText Dynamic
- Network.AWS.EC2.Metadata: instance ToText Info
- Network.AWS.EC2.Metadata: instance ToText Interface
- Network.AWS.EC2.Metadata: instance ToText Mapping
- Network.AWS.EC2.Metadata: instance ToText Metadata
- Network.AWS.EC2.Metadata: instance Typeable Dynamic
- Network.AWS.EC2.Metadata: instance Typeable Info
- Network.AWS.EC2.Metadata: instance Typeable Interface
- Network.AWS.EC2.Metadata: instance Typeable Mapping
- Network.AWS.EC2.Metadata: instance Typeable Metadata
- Network.AWS.Env: _envAuth :: Env -> !Auth
- Network.AWS.Env: _envEC2 :: Env -> !(IORef (Maybe Bool))
- Network.AWS.Env: _envLogger :: Env -> !Logger
- Network.AWS.Env: _envManager :: Env -> !Manager
- Network.AWS.Env: _envRegion :: Env -> !Region
- Network.AWS.Env: _envRetryCheck :: Env -> !(Int -> HttpException -> IO Bool)
- Network.AWS.Env: _envRetryPolicy :: Env -> !(Maybe RetryPolicy)
- Network.AWS.Env: _envTimeout :: Env -> !(Maybe Seconds)
- Network.AWS.Env: instance HasEnv Env
- Network.AWS.Env: instance ToLog Env
- Network.AWS.Free: AwaitF :: Service s -> Wait a -> a -> (Rs a -> r) -> Command r
- Network.AWS.Free: CheckF :: (Bool -> r) -> Command r
- Network.AWS.Free: DynF :: Dynamic -> (ByteString -> r) -> Command r
- Network.AWS.Free: MetaF :: Metadata -> (ByteString -> r) -> Command r
- Network.AWS.Free: SendF :: Service s -> a -> (Rs a -> r) -> Command r
- Network.AWS.Free: SignF :: Service s -> UTCTime -> Seconds -> a -> (ClientRequest -> r) -> Command r
- Network.AWS.Free: UserF :: (Maybe ByteString -> r) -> Command r
- Network.AWS.Free: await :: (MonadFree Command m, AWSRequest a) => Wait a -> a -> m (Rs a)
- Network.AWS.Free: awaitWith :: (MonadFree Command m, AWSSigner (Sg s), AWSRequest a) => (Service (Sv a) -> Service s) -> Wait a -> a -> m (Rs a)
- Network.AWS.Free: data Command r
- Network.AWS.Free: dynamic :: MonadFree Command m => Dynamic -> m ByteString
- Network.AWS.Free: instance Functor Command
- Network.AWS.Free: isEC2 :: MonadFree Command m => m Bool
- Network.AWS.Free: metadata :: MonadFree Command m => Metadata -> m ByteString
- Network.AWS.Free: paginate :: (MonadFree Command m, AWSPager a) => a -> Source m (Rs a)
- Network.AWS.Free: paginateWith :: (MonadFree Command m, AWSSigner (Sg s), AWSPager a) => (Service (Sv a) -> Service s) -> a -> Source m (Rs a)
- Network.AWS.Free: presign :: (MonadFree Command m, AWSPresigner (Sg (Sv a)), AWSRequest a) => UTCTime -> Seconds -> a -> m ClientRequest
- Network.AWS.Free: presignURL :: (MonadFree Command m, AWSPresigner (Sg (Sv a)), AWSRequest a) => UTCTime -> Seconds -> a -> m ByteString
- Network.AWS.Free: presignWith :: (MonadFree Command m, AWSPresigner (Sg s), AWSRequest a) => (Service (Sv a) -> Service s) -> UTCTime -> Seconds -> a -> m ClientRequest
- Network.AWS.Free: send :: (MonadFree Command m, AWSRequest a) => a -> m (Rs a)
- Network.AWS.Free: sendWith :: (MonadFree Command m, AWSSigner (Sg s), AWSRequest a) => (Service (Sv a) -> Service s) -> a -> m (Rs a)
- Network.AWS.Free: userdata :: MonadFree Command m => m (Maybe ByteString)
+ Control.Monad.Trans.AWS: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance Control.Monad.Catch.MonadCatch m => Control.Monad.Catch.MonadCatch (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance Control.Monad.Catch.MonadThrow m => Control.Monad.Catch.MonadThrow (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance Control.Monad.Error.Class.MonadError e m => Control.Monad.Error.Class.MonadError e (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance Control.Monad.Morph.MFunctor Control.Monad.Trans.AWS.AWST
+ Control.Monad.Trans.AWS: instance Control.Monad.State.Class.MonadState s m => Control.Monad.State.Class.MonadState s (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance Control.Monad.Trans.Class.MonadTrans Control.Monad.Trans.AWS.AWST
+ Control.Monad.Trans.AWS: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance Control.Monad.Trans.Control.MonadTransControl Control.Monad.Trans.AWS.AWST
+ Control.Monad.Trans.AWS: instance Control.Monad.Trans.Resource.Internal.MonadResource m => Control.Monad.Trans.Resource.Internal.MonadResource (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance Control.Monad.Writer.Class.MonadWriter w m => Control.Monad.Writer.Class.MonadWriter w (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance GHC.Base.Alternative m => GHC.Base.Alternative (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance GHC.Base.Applicative m => GHC.Base.Applicative (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance GHC.Base.Functor m => GHC.Base.Functor (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance GHC.Base.Monad m => Control.Monad.Reader.Class.MonadReader Network.AWS.Env.Env (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance GHC.Base.Monad m => GHC.Base.Monad (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (Control.Monad.Trans.AWS.AWST m)
+ Control.Monad.Trans.AWS: type AWSConstraint r m = (MonadCatch m, MonadResource m, MonadReader r m, HasEnv r)
+ Network.AWS: instance (GHC.Base.Monoid w, Network.AWS.MonadAWS m) => Network.AWS.MonadAWS (Control.Monad.Trans.RWS.Lazy.RWST r w s m)
+ Network.AWS: instance (GHC.Base.Monoid w, Network.AWS.MonadAWS m) => Network.AWS.MonadAWS (Control.Monad.Trans.RWS.Strict.RWST r w s m)
+ Network.AWS: instance (GHC.Base.Monoid w, Network.AWS.MonadAWS m) => Network.AWS.MonadAWS (Control.Monad.Trans.Writer.Lazy.WriterT w m)
+ Network.AWS: instance (GHC.Base.Monoid w, Network.AWS.MonadAWS m) => Network.AWS.MonadAWS (Control.Monad.Trans.Writer.Strict.WriterT w m)
+ Network.AWS: instance Network.AWS.MonadAWS Network.AWS.AWS
+ Network.AWS: instance Network.AWS.MonadAWS m => Network.AWS.MonadAWS (Control.Monad.Trans.Cont.ContT r m)
+ Network.AWS: instance Network.AWS.MonadAWS m => Network.AWS.MonadAWS (Control.Monad.Trans.Except.ExceptT e m)
+ Network.AWS: instance Network.AWS.MonadAWS m => Network.AWS.MonadAWS (Control.Monad.Trans.Identity.IdentityT m)
+ Network.AWS: instance Network.AWS.MonadAWS m => Network.AWS.MonadAWS (Control.Monad.Trans.List.ListT m)
+ Network.AWS: instance Network.AWS.MonadAWS m => Network.AWS.MonadAWS (Control.Monad.Trans.Maybe.MaybeT m)
+ Network.AWS: instance Network.AWS.MonadAWS m => Network.AWS.MonadAWS (Control.Monad.Trans.Reader.ReaderT r m)
+ Network.AWS: instance Network.AWS.MonadAWS m => Network.AWS.MonadAWS (Control.Monad.Trans.State.Lazy.StateT s m)
+ Network.AWS: instance Network.AWS.MonadAWS m => Network.AWS.MonadAWS (Control.Monad.Trans.State.Strict.StateT s m)
+ Network.AWS.Auth: instance GHC.Classes.Eq Network.AWS.Auth.Credentials
+ Network.AWS.Auth: instance GHC.Exception.Exception Network.AWS.Auth.AuthError
+ Network.AWS.Auth: instance GHC.Show.Show Network.AWS.Auth.AuthError
+ Network.AWS.Auth: instance GHC.Show.Show Network.AWS.Auth.Credentials
+ Network.AWS.Auth: instance Network.AWS.Auth.AsAuthError GHC.Exception.SomeException
+ Network.AWS.Auth: instance Network.AWS.Auth.AsAuthError Network.AWS.Auth.AuthError
+ Network.AWS.Auth: instance Network.AWS.Data.Log.ToLog Network.AWS.Auth.AuthError
+ Network.AWS.Auth: instance Network.AWS.Data.Log.ToLog Network.AWS.Auth.Credentials
+ Network.AWS.EC2.Metadata: instance GHC.Classes.Eq Network.AWS.EC2.Metadata.Dynamic
+ Network.AWS.EC2.Metadata: instance GHC.Classes.Eq Network.AWS.EC2.Metadata.Info
+ Network.AWS.EC2.Metadata: instance GHC.Classes.Eq Network.AWS.EC2.Metadata.Interface
+ Network.AWS.EC2.Metadata: instance GHC.Classes.Eq Network.AWS.EC2.Metadata.Mapping
+ Network.AWS.EC2.Metadata: instance GHC.Classes.Eq Network.AWS.EC2.Metadata.Metadata
+ Network.AWS.EC2.Metadata: instance GHC.Classes.Ord Network.AWS.EC2.Metadata.Dynamic
+ Network.AWS.EC2.Metadata: instance GHC.Classes.Ord Network.AWS.EC2.Metadata.Info
+ Network.AWS.EC2.Metadata: instance GHC.Classes.Ord Network.AWS.EC2.Metadata.Interface
+ Network.AWS.EC2.Metadata: instance GHC.Classes.Ord Network.AWS.EC2.Metadata.Mapping
+ Network.AWS.EC2.Metadata: instance GHC.Classes.Ord Network.AWS.EC2.Metadata.Metadata
+ Network.AWS.EC2.Metadata: instance GHC.Show.Show Network.AWS.EC2.Metadata.Dynamic
+ Network.AWS.EC2.Metadata: instance GHC.Show.Show Network.AWS.EC2.Metadata.Info
+ Network.AWS.EC2.Metadata: instance GHC.Show.Show Network.AWS.EC2.Metadata.Interface
+ Network.AWS.EC2.Metadata: instance GHC.Show.Show Network.AWS.EC2.Metadata.Mapping
+ Network.AWS.EC2.Metadata: instance GHC.Show.Show Network.AWS.EC2.Metadata.Metadata
+ Network.AWS.EC2.Metadata: instance Network.AWS.Data.Text.ToText Network.AWS.EC2.Metadata.Dynamic
+ Network.AWS.EC2.Metadata: instance Network.AWS.Data.Text.ToText Network.AWS.EC2.Metadata.Info
+ Network.AWS.EC2.Metadata: instance Network.AWS.Data.Text.ToText Network.AWS.EC2.Metadata.Interface
+ Network.AWS.EC2.Metadata: instance Network.AWS.Data.Text.ToText Network.AWS.EC2.Metadata.Mapping
+ Network.AWS.EC2.Metadata: instance Network.AWS.Data.Text.ToText Network.AWS.EC2.Metadata.Metadata
+ Network.AWS.Env: [_envAuth] :: Env -> !Auth
+ Network.AWS.Env: [_envEC2] :: Env -> !(IORef (Maybe Bool))
+ Network.AWS.Env: [_envLogger] :: Env -> !Logger
+ Network.AWS.Env: [_envManager] :: Env -> !Manager
+ Network.AWS.Env: [_envRegion] :: Env -> !Region
+ Network.AWS.Env: [_envRetryCheck] :: Env -> !(Int -> HttpException -> IO Bool)
+ Network.AWS.Env: [_envRetryPolicy] :: Env -> !(Maybe RetryPolicy)
+ Network.AWS.Env: [_envTimeout] :: Env -> !(Maybe Seconds)
+ Network.AWS.Env: instance Network.AWS.Data.Log.ToLog Network.AWS.Env.Env
+ Network.AWS.Env: instance Network.AWS.Env.HasEnv Network.AWS.Env.Env
- Control.Monad.Trans.AWS: await :: (MonadFree Command m, AWSRequest a) => Wait a -> a -> m (Rs a)
+ Control.Monad.Trans.AWS: await :: (AWSConstraint r m, AWSRequest a) => Wait a -> a -> m ()
- Control.Monad.Trans.AWS: awaitWith :: (MonadFree Command m, AWSSigner (Sg s), AWSRequest a) => (Service (Sv a) -> Service s) -> Wait a -> a -> m (Rs a)
+ Control.Monad.Trans.AWS: awaitWith :: (AWSConstraint r m, AWSSigner (Sg s), AWSRequest a) => (Service (Sv a) -> Service s) -> Wait a -> a -> m ()
- Control.Monad.Trans.AWS: dynamic :: MonadFree Command m => Dynamic -> m ByteString
+ Control.Monad.Trans.AWS: dynamic :: (MonadIO m, MonadThrow m, MonadReader r m, HasEnv r) => Dynamic -> m ByteString
- Control.Monad.Trans.AWS: isEC2 :: MonadFree Command m => m Bool
+ Control.Monad.Trans.AWS: isEC2 :: (MonadIO m, MonadReader r m, HasEnv r) => m Bool
- Control.Monad.Trans.AWS: metadata :: MonadFree Command m => Metadata -> m ByteString
+ Control.Monad.Trans.AWS: metadata :: (MonadIO m, MonadThrow m, MonadReader r m, HasEnv r) => Metadata -> m ByteString
- Control.Monad.Trans.AWS: paginate :: (MonadFree Command m, AWSPager a) => a -> Source m (Rs a)
+ Control.Monad.Trans.AWS: paginate :: (AWSConstraint r m, AWSPager a) => a -> Source m (Rs a)
- Control.Monad.Trans.AWS: paginateWith :: (MonadFree Command m, AWSSigner (Sg s), AWSPager a) => (Service (Sv a) -> Service s) -> a -> Source m (Rs a)
+ Control.Monad.Trans.AWS: paginateWith :: (AWSConstraint r m, AWSSigner (Sg s), AWSPager a) => (Service (Sv a) -> Service s) -> a -> Source m (Rs a)
- Control.Monad.Trans.AWS: presign :: (MonadFree Command m, AWSPresigner (Sg (Sv a)), AWSRequest a) => UTCTime -> Seconds -> a -> m ClientRequest
+ Control.Monad.Trans.AWS: presign :: (MonadIO m, MonadReader r m, HasEnv r, AWSPresigner (Sg (Sv a)), AWSRequest a) => UTCTime -> Seconds -> a -> m ClientRequest
- Control.Monad.Trans.AWS: presignURL :: (MonadFree Command m, AWSPresigner (Sg (Sv a)), AWSRequest a) => UTCTime -> Seconds -> a -> m ByteString
+ Control.Monad.Trans.AWS: presignURL :: (MonadIO m, MonadReader r m, HasEnv r, AWSPresigner (Sg (Sv a)), AWSRequest a) => UTCTime -> Seconds -> a -> m ByteString
- Control.Monad.Trans.AWS: presignWith :: (MonadFree Command m, AWSPresigner (Sg s), AWSRequest a) => (Service (Sv a) -> Service s) -> UTCTime -> Seconds -> a -> m ClientRequest
+ Control.Monad.Trans.AWS: presignWith :: (MonadIO m, MonadReader r m, HasEnv r, AWSPresigner (Sg s), AWSRequest a) => (Service (Sv a) -> Service s) -> UTCTime -> Seconds -> a -> m ClientRequest
- Control.Monad.Trans.AWS: runAWST :: (MonadCatch m, MonadResource m, HasEnv r) => r -> AWST m a -> m a
+ Control.Monad.Trans.AWS: runAWST :: HasEnv r => r -> AWST m a -> m a
- Control.Monad.Trans.AWS: send :: (MonadFree Command m, AWSRequest a) => a -> m (Rs a)
+ Control.Monad.Trans.AWS: send :: (AWSConstraint r m, AWSRequest a) => a -> m (Rs a)
- Control.Monad.Trans.AWS: sendWith :: (MonadFree Command m, AWSSigner (Sg s), AWSRequest a) => (Service (Sv a) -> Service s) -> a -> m (Rs a)
+ Control.Monad.Trans.AWS: sendWith :: (AWSConstraint r m, AWSSigner (Sg s), AWSRequest a) => (Service (Sv a) -> Service s) -> a -> m (Rs a)
- Control.Monad.Trans.AWS: userdata :: MonadFree Command m => m (Maybe ByteString)
+ Control.Monad.Trans.AWS: userdata :: (MonadIO m, MonadCatch m, MonadReader r m, HasEnv r) => m (Maybe ByteString)
- Network.AWS: await :: (MonadAWS m, AWSRequest a) => Wait a -> a -> m (Rs a)
+ Network.AWS: await :: (MonadAWS m, AWSRequest a) => Wait a -> a -> m ()
- Network.AWS: runAWS :: (MonadCatch m, MonadResource m, HasEnv r) => r -> AWS a -> m a
+ Network.AWS: runAWS :: (MonadResource m, HasEnv r) => r -> AWS a -> m a
- Network.AWS: type AWS = AWST IO
+ Network.AWS: type AWS = AWST (ResourceT IO)
- Network.AWS.Auth: credFile :: MonadIO m => m FilePath
+ Network.AWS.Auth: credFile :: (MonadCatch m, MonadIO m) => m FilePath

Files

amazonka.cabal view
@@ -1,5 +1,5 @@ name:                  amazonka-version:               1.0.1+version:               1.1.0 synopsis:              Comprehensive Amazon Web Services SDK homepage:              https://github.com/brendanhay/amazonka license:               OtherLicense@@ -27,11 +27,6 @@     * "Network.AWS": The 'AWS' monad and 'MonadAWS' type class for automatically     lifting operations when embedded as a layer in a transformer stack.     .-    Both 'Control.Monad.Trans.AWS.AWST' and 'Network.AWS.AWS' provide functions-    that are built upon a 'MonadFree' 'Command' DSL defined in-    "Network.AWS.Free". This allows writing a custom interpreter (say, for-    mocking purposes) and defining your own AWS logic if desired.-    .     GHC 7.8.4 and higher is officially supported.  source-repository head@@ -51,7 +46,6 @@         , Network.AWS.Data         , Network.AWS.EC2.Metadata         , Network.AWS.Env-        , Network.AWS.Free         , Network.AWS.Presign      other-modules:@@ -60,14 +54,13 @@         , Network.AWS.Internal.Logger      build-depends:-          amazonka-core       == 1.0.1.*+          amazonka-core       == 1.1.0.*         , base                >= 4.7     && < 5         , bytestring          >= 0.9         , conduit             >= 1.1         , conduit-extra       >= 1.1         , directory           >= 1.2         , exceptions          >= 0.6-        , free                >= 4.5         , http-client         >= 0.4.9         , http-conduit        >= 2.1.4         , ini                 >= 0.2
src/Control/Monad/Trans/AWS.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE BangPatterns               #-}+{-# LANGUAGE ConstraintKinds            #-} {-# LANGUAGE FlexibleContexts           #-} {-# LANGUAGE FlexibleInstances          #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}@@ -7,7 +8,6 @@ {-# LANGUAGE RankNTypes                 #-} {-# LANGUAGE TypeFamilies               #-} {-# LANGUAGE UndecidableInstances       #-}-{-# LANGUAGE ViewPatterns               #-}  {-# OPTIONS_GHC -fno-warn-duplicate-exports #-} @@ -20,19 +20,17 @@ -- Portability : non-portable (GHC extensions) -- -- The 'AWST' transformer provides the environment required to perform AWS--- operations and constructs a 'Command' AST using 'MonadFree' which can then be--- interpreted using 'runAWST'. The transformer is intended to be used directly+-- operations. The transformer is intended to be used directly -- or embedded as a layer within a transformer stack. ----- "Network.AWS" contains a 'IO' specialised version of 'AWST' with a typeclass+-- "Network.AWS" contains an 'IO' specialised version of 'AWST' with a typeclass -- to assist in automatically lifting operations. module Control.Monad.Trans.AWS     (     -- * Running AWS Actions       AWST     , runAWST-    , execAWST-    , hoistAWST+    , AWSConstraint      -- * Authentication and Environment     , newEnv@@ -132,7 +130,6 @@     , newLogger      -- * Re-exported Types-    , Command     , RqBody     , RsBody     , module Network.AWS.Types@@ -147,31 +144,29 @@ import           Control.Exception.Lens import           Control.Monad.Base import           Control.Monad.Catch-import           Control.Monad.Error.Class       (MonadError (..))-import           Control.Monad.Morph             (hoist)+import           Control.Monad.Error.Class    (MonadError (..))+import           Control.Monad.Morph import           Control.Monad.Reader import           Control.Monad.State.Class import           Control.Monad.Trans.Control-import           Control.Monad.Trans.Free        (FreeF (Pure), FreeT (..))-import           Control.Monad.Trans.Free.Church import           Control.Monad.Trans.Resource import           Control.Monad.Writer.Class+import           Data.Conduit                 hiding (await) import           Data.IORef import           Network.AWS.Auth-import qualified Network.AWS.EC2.Metadata        as EC2+import qualified Network.AWS.EC2.Metadata     as EC2 import           Network.AWS.Env-import           Network.AWS.Free import           Network.AWS.Internal.Body import           Network.AWS.Internal.HTTP import           Network.AWS.Internal.Logger-import           Network.AWS.Pager               (AWSPager)-import           Network.AWS.Prelude             as AWS-import qualified Network.AWS.Presign             as Sign-import           Network.AWS.Types               hiding (LogLevel (..))-import           Network.AWS.Waiter              (Wait)+import           Network.AWS.Pager            (AWSPager (..))+import           Network.AWS.Prelude          as AWS+import qualified Network.AWS.Presign          as Sign+import           Network.AWS.Types            hiding (LogLevel (..))+import           Network.AWS.Waiter           (Wait)  -- | The 'AWST' transformer.-newtype AWST m a = AWST { unAWST :: FT Command (ReaderT Env m) a }+newtype AWST m a = AWST { unAWST :: ReaderT Env m a }     deriving         ( Functor         , Applicative@@ -179,7 +174,6 @@         , Monad         , MonadPlus         , MonadIO-        , MonadFree Command         , MonadReader Env         ) @@ -192,20 +186,20 @@ instance MonadBase b m => MonadBase b (AWST m) where     liftBase = liftBaseDefault -instance MonadBaseControl b m => MonadBaseControl b (AWST m) where-    type StM (AWST m) a =-         StM m (FreeF Command a (FreeT Command (ReaderT Env m) a))+instance MonadTransControl AWST where+    type StT AWST a = StT (ReaderT Env) a -    liftBaseWith f = AWST . toFT . FreeT . liftM Pure $-        liftBaseWith $ \runInBase ->-            f $ \k ->-                runInBase $-                    runFreeT (fromFT (unAWST k))+    liftWith = defaultLiftWith AWST unAWST+    restoreT = defaultRestoreT AWST -    restoreM = AWST . toFT . FreeT . restoreM+instance MonadBaseControl b m => MonadBaseControl b (AWST m) where+    type StM (AWST m) a = ComposeSt AWST m a +    liftBaseWith = defaultLiftBaseWith+    restoreM     = defaultRestoreM+ instance MonadTrans AWST where-    lift = AWST . lift . lift+    lift = AWST . lift  instance MonadResource m => MonadResource (AWST m) where     liftResourceT = lift . liftResourceT@@ -224,83 +218,194 @@     listen = AWST . listen . unAWST     pass   = AWST . pass   . unAWST +instance MFunctor AWST where+    hoist nat = AWST . hoist nat . unAWST+ -- | Run an 'AWST' action with the specified 'HasEnv' environment.--- Any outstanding HTTP responses' 'ResumableSource' will--- be closed when the 'ResourceT' computation is unwrapped with 'runResourceT'.+runAWST :: HasEnv r => r -> AWST m a -> m a+runAWST r (AWST m) = runReaderT m (r ^. environment)++-- | An alias for the constraints required to send requests,+-- which 'AWST' implicitly fulfils.+type AWSConstraint r m =+    ( MonadCatch     m+    , MonadResource  m+    , MonadReader  r m+    , HasEnv       r+    )++-- | Send a request, returning the associated response if successful. ----- Throws 'Error' during interpretation of the underlying 'MonadFree' 'Command' AST.+-- Throws 'Error'. ----- /See:/ 'runResourceT'.-runAWST :: (MonadCatch m, MonadResource m, HasEnv r) => r -> AWST m a -> m a-runAWST = execAWST hoistError+-- /See:/ 'sendWith'+send :: (AWSConstraint r m, AWSRequest a)+     => a+     -> m (Rs a)+send = sendWith id --- | Run an 'AWST' action with configurable 'Error' handling.+-- | A variant of 'send' that allows modifying the default 'Service' definition+-- used to configure the request. ----- Does not explictly throw 'Error's and instead uses the supplied lift function.-execAWST :: (MonadCatch m, MonadResource m, HasEnv r)-         => (forall a. Either Error a -> m a)-            -- ^ Lift an 'Error' into the base Monad.-         -> r-         -> AWST m b-         -> m b-execAWST f = innerAWST go+-- Throws 'Error'.+sendWith :: (AWSConstraint r m, AWSSigner (Sg s), AWSRequest a)+         => (Service (Sv a) -> Service s) -- ^ Modify the default service configuration.+         -> a                             -- ^ Request.+         -> m (Rs a)+sendWith f x = do+    e <- view environment+    r <- retrier e s rq (perform e s rq) >>= hoistError+    return (snd r)   where-    go (CheckF k) = do-        io <- view envEC2-        mp <- liftIO (readIORef io)-        case mp of-            Just p  -> k p-            Nothing -> do-                m  <- view envManager-                !r <- lift . f =<< tryT (EC2.isEC2 m)-                liftIO (atomicWriteIORef io (Just r))-                k r+    rq = request x+    s  = f (serviceOf x) -    go (DynF x k) = do-        m <- view envManager-        r <- lift . f =<< tryT (EC2.dynamic m x)-        k r+-- | Repeatedly send a request, automatically setting markers and+-- paginating over multiple responses while available.+--+-- Throws 'Error'.+--+-- /See:/ 'paginateWith'+paginate :: (AWSConstraint r m, AWSPager a)+         => a+         -> Source m (Rs a)+paginate = paginateWith id -    go (MetaF x k) = do-        m <- view envManager-        r <- lift . f =<< tryT (EC2.metadata m x)-        k r+-- | A variant of 'paginate' that allows modifying the default 'Service' definition+-- used to configure the request.+--+-- Throws 'Error'.+paginateWith :: (AWSConstraint r m, AWSSigner (Sg s), AWSPager a)+             => (Service (Sv a) -> Service s) -- ^ Modify the default service configuration.+             -> a                             -- ^ Initial request.+             -> Source m (Rs a)+paginateWith f = go+  where+    go !x = do+        !y <- sendWith f x+        yield y+        maybe (pure ())+              go+              (page x y) -    go (UserF k) = do-        m <- view envManager-        r <- lift . f =<< tryT (EC2.userdata m)-        k r+-- | Poll the API with the supplied request until a specific 'Wait' condition+-- is fulfilled.+--+-- Throws 'Error'.+--+-- /See:/ 'awaitWith'+await :: (AWSConstraint r m, AWSRequest a)+      => Wait a+      -> a+      -> m ()+await = awaitWith id -    go (SignF s ts ex x k) = do-        a <- view envAuth-        g <- view envRegion-        r <- Sign.presignWith (const s) a g ts ex x-        k r+-- | A variant of 'await' that allows modifying the default 'Service' definition+-- used to configure the request.+--+-- Throws 'Error'.+awaitWith :: (AWSConstraint r m, AWSSigner (Sg s), AWSRequest a)+          => (Service (Sv a) -> Service s) -- ^ Modify the default service configuration.+          -> Wait a                        -- ^ Polling, error and acceptance criteria.+          -> a                             -- ^ Request to poll with.+          -> m ()+awaitWith f w x = do+    e <- view environment+    waiter e w rq (perform e s rq) >>= hoistError . maybe (Right ()) Left+  where+    rq = request x+    s  = f (serviceOf x) -    go (SendF s (request -> x) k) = do-        e <- view environment-        r <- lift . f =<< retrier e s x (perform e s x)-        k (snd r)+-- | Presign an URL that is valid from the specified time until the+-- number of seconds expiry has elapsed.+--+-- /See:/ 'presign', 'presignWith'+presignURL :: ( MonadIO m+              , MonadReader r m+              , HasEnv r+              , AWSPresigner (Sg (Sv a))+              , AWSRequest a+              )+           => UTCTime     -- ^ Signing time.+           -> Seconds     -- ^ Expiry time.+           -> a           -- ^ Request to presign.+           -> m ByteString+presignURL ts ex x = do+    a <- view envAuth+    r <- view envRegion+    Sign.presignURL a r ts ex x -    go (AwaitF s w (request -> x) k) = do-        e <- view environment-        r <- lift . f =<< waiter e w x (perform e s x)-        k (snd r)+-- | Presign an HTTP request that is valid from the specified time until the+-- number of seconds expiry has elapsed.+--+-- /See:/ 'presignWith'+presign :: ( MonadIO m+           , MonadReader r m+           , HasEnv r+           , AWSPresigner (Sg (Sv a))+           , AWSRequest a+           )+        => UTCTime     -- ^ Signing time.+        -> Seconds     -- ^ Expiry time.+        -> a           -- ^ Request to presign.+        -> m ClientRequest+presign = presignWith id -    tryT m = either (Left . TransportError) Right <$> try m+-- | A variant of 'presign' that allows specifying the 'Service' definition+-- used to configure the request.+presignWith :: ( MonadIO m+               , MonadReader r m+               , HasEnv r+               , AWSPresigner (Sg s)+               , AWSRequest a+               )+            => (Service (Sv a) -> Service s) -- ^ Function to modify the service configuration.+            -> UTCTime                       -- ^ Signing time.+            -> Seconds                       -- ^ Expiry time.+            -> a                             -- ^ Request to presign.+            -> m ClientRequest+presignWith f ts ex x = do+    a <- view envAuth+    g <- view envRegion+    Sign.presignWith f a g ts ex x -innerAWST :: (Monad m, HasEnv r)-          => (Command (ReaderT Env m a) -> ReaderT Env m a)-          -> r-          -> AWST m a-          -> m a-innerAWST f e (AWST m) = runReaderT (f `iterT` m) (e ^. environment)+-- | Test whether the underlying host is running on EC2.+-- This is memoised and any external check occurs for the first invocation only.+isEC2 :: (MonadIO m, MonadReader r m, HasEnv r) => m Bool+isEC2 = do+    ref <- view envEC2+    mp  <- liftIO (readIORef ref)+    case mp of+        Just p  -> return p+        Nothing -> do+            m  <- view envManager+            !p <- EC2.isEC2 m+            liftIO (atomicWriteIORef ref (Just p))+            return p -hoistAWST :: (Monad m, Monad n)-          => (forall a. m a -> n a)-          -> AWST m b-          -> AWST n b-hoistAWST nat = AWST . hoistFT (hoist nat) . unAWST+-- | Retrieve the specified 'Dynamic' data.+--+-- Throws 'HttpException'.+dynamic :: (MonadIO m, MonadThrow m, MonadReader r m, HasEnv r)+        => EC2.Dynamic+        -> m ByteString+dynamic d = view envManager >>= flip EC2.dynamic d++-- | Retrieve the specified 'Metadata'.+--+-- Throws 'HttpException'.+metadata :: (MonadIO m, MonadThrow m, MonadReader r m, HasEnv r)+         => EC2.Metadata+         -> m ByteString+metadata m = view envManager >>= flip EC2.metadata m++-- | Retrieve the user data. Returns 'Nothing' if no user data is assigned+-- to the instance.+--+-- Throws 'HttpException'.+userdata :: (MonadIO m, MonadCatch m, MonadReader r m, HasEnv r)+         => m (Maybe ByteString)+userdata = view envManager >>= EC2.userdata  hoistError :: MonadThrow m => Either Error a -> m a hoistError = either (throwingM _Error) return
src/Network/AWS.hs view
@@ -121,7 +121,6 @@     , newLogger      -- * Re-exported Types-    , AWST.Command     , RqBody     , RsBody     , module Network.AWS.Types@@ -133,43 +132,40 @@     ) where  import           Control.Applicative-import           Control.Monad.Catch             (MonadCatch)-import           Control.Monad.Morph             (hoist)-import qualified Control.Monad.RWS.Lazy          as LRW-import qualified Control.Monad.RWS.Strict        as RW-import qualified Control.Monad.State.Lazy        as LS-import qualified Control.Monad.State.Strict      as S-import           Control.Monad.Trans.AWS         (AWST)-import qualified Control.Monad.Trans.AWS         as AWST-import           Control.Monad.Trans.Class       (lift)-import           Control.Monad.Trans.Cont        (ContT)-import           Control.Monad.Trans.Except      (ExceptT)-import           Control.Monad.Trans.Free        (FreeT)-import           Control.Monad.Trans.Free.Church (FT)-import           Control.Monad.Trans.Identity    (IdentityT)-import           Control.Monad.Trans.Iter        (IterT)-import           Control.Monad.Trans.List        (ListT)-import           Control.Monad.Trans.Maybe       (MaybeT)-import           Control.Monad.Trans.Reader      (ReaderT)+import           Control.Monad.Catch          (MonadCatch)+import           Control.Monad.Morph          (hoist)+import qualified Control.Monad.RWS.Lazy       as LRW+import qualified Control.Monad.RWS.Strict     as RW+import qualified Control.Monad.State.Lazy     as LS+import qualified Control.Monad.State.Strict   as S+import           Control.Monad.Trans.AWS      (AWST)+import qualified Control.Monad.Trans.AWS      as AWST+import           Control.Monad.Trans.Class    (lift)+import           Control.Monad.Trans.Cont     (ContT)+import           Control.Monad.Trans.Except   (ExceptT)+import           Control.Monad.Trans.Identity (IdentityT)+import           Control.Monad.Trans.List     (ListT)+import           Control.Monad.Trans.Maybe    (MaybeT)+import           Control.Monad.Trans.Reader   (ReaderT) import           Control.Monad.Trans.Resource-import qualified Control.Monad.Writer.Lazy       as LW-import qualified Control.Monad.Writer.Strict     as W-import           Data.Conduit                    (Source)+import qualified Control.Monad.Writer.Lazy    as LW+import qualified Control.Monad.Writer.Strict  as W+import           Data.Conduit                 (Source) import           Data.Monoid import           Network.AWS.Auth-import qualified Network.AWS.EC2.Metadata        as EC2-import           Network.AWS.Env                 (Env, HasEnv (..), newEnv)+import qualified Network.AWS.EC2.Metadata     as EC2+import           Network.AWS.Env              (Env, HasEnv (..), newEnv) import           Network.AWS.Internal.Body import           Network.AWS.Internal.Logger-import           Network.AWS.Pager               (AWSPager)+import           Network.AWS.Pager            (AWSPager) import           Network.AWS.Prelude-import           Network.AWS.Types               hiding (LogLevel (..))-import           Network.AWS.Waiter              (Wait)+import           Network.AWS.Types            hiding (LogLevel (..))+import           Network.AWS.Waiter           (Wait)  import           Prelude  -- | A specialisation of the 'AWST' transformer.-type AWS = AWST IO+type AWS = AWST (ResourceT IO)  -- | Monads in which 'AWS' actions may be embedded. class (Functor m, Applicative m, Monad m) => MonadAWS m where@@ -187,8 +183,6 @@ instance MonadAWS m => MonadAWS (ReaderT   r m) where liftAWS = lift . liftAWS instance MonadAWS m => MonadAWS (S.StateT  s m) where liftAWS = lift . liftAWS instance MonadAWS m => MonadAWS (LS.StateT s m) where liftAWS = lift . liftAWS-instance MonadAWS m => MonadAWS (IterT       m) where liftAWS = lift . liftAWS-instance MonadAWS m => MonadAWS (FT        f m) where liftAWS = lift . liftAWS  instance (Monoid w, MonadAWS m) => MonadAWS (W.WriterT w m) where     liftAWS = lift . liftAWS@@ -202,22 +196,15 @@ instance (Monoid w, MonadAWS m) => MonadAWS (LRW.RWST r w s m) where     liftAWS = lift . liftAWS -instance (Functor f, MonadAWS m) => MonadAWS (FreeT f m) where-    liftAWS = lift . liftAWS---- FIXME: verify the use of withInternalState to create a ResourceT here- -- | Run the 'AWS' monad. Any outstanding HTTP responses' 'ResumableSource' will -- be closed when the 'ResourceT' computation is unwrapped with 'runResourceT'. -- -- Throws 'Error', which will include 'HTTPExceptions', serialisation errors, -- or any particular errors returned by the respective AWS service. ----- /See:/ 'runAWST', 'runResourceT'.-runAWS :: (MonadCatch m, MonadResource m, HasEnv r) => r -> AWS a -> m a-runAWS e = liftResourceT-    . AWST.runAWST e-    . AWST.hoistAWST (withInternalState . const)+-- /See:/ 'AWST.runAWST', 'runResourceT'.+runAWS :: (MonadResource m, HasEnv r) => r -> AWS a -> m a+runAWS e = liftResourceT . AWST.runAWST e  -- | Scope an action within the specific 'Region'. within :: MonadAWS m => Region -> AWS a -> m a@@ -249,7 +236,7 @@ -- is fulfilled. -- -- /See:/ 'AWST.awaitWith'-await :: (MonadAWS m, AWSRequest a) => Wait a -> a -> m (Rs a)+await :: (MonadAWS m, AWSRequest a) => Wait a -> a -> m () await w = liftAWS . AWST.await w  -- | Presign an URL that is valid from the specified time until the
src/Network/AWS/Auth.hs view
@@ -67,6 +67,7 @@ import           Control.Monad.IO.Class import qualified Data.ByteString.Char8      as BS8 import qualified Data.ByteString.Lazy.Char8 as LBS8+import           Data.Char                  (isSpace) import qualified Data.Ini                   as INI import           Data.IORef import           Data.Monoid@@ -122,10 +123,15 @@ -- -- /Note:/ This does not match the default AWS SDK location of -- @%USERPROFILE%\.aws\credentials@ on Windows. (Sorry.)-credFile :: MonadIO m => m FilePath-credFile = (<> "/.aws/credentials") `liftM` liftIO getHomeDirectory--- TODO: probably should be using System.FilePath above.+credFile :: (MonadCatch m, MonadIO m) => m FilePath+credFile = catching_ _IOException dir err+  where+    dir = (++ p) `liftM` liftIO getHomeDirectory+    err = throwM $ MissingFileError ("$HOME" ++ p) +    -- TODO: probably should be using System.FilePath above.+    p = "/.aws/credentials"+ {- $credentials 'getAuth' is implemented using the following @from*@-styled functions below. Both 'fromKeys' and 'fromSession' can be used directly to avoid the 'MonadIO'@@ -265,7 +271,8 @@  -- | Retrieve authentication information via the specified 'Credentials' mechanism. ----- Throws 'AuthError' when environment variables or IAM profiles cannot be read.+-- Throws 'AuthError' when environment variables or IAM profiles cannot be read,+-- and credentials files are invalid or cannot be found. getAuth :: (Applicative m, MonadIO m, MonadCatch m)         => Manager         -> Credentials@@ -284,7 +291,10 @@             catching _MissingFileError fromFile $ \f -> do                 -- proceed, missing credentials file                 p <- isEC2 m-                unless p $ throwingM _MissingFileError f+                unless p $+                    -- not an EC2 instance, rethrow the previous error.+                    throwingM _MissingFileError f+                 -- proceed, check EC2 metadata for IAM information.                 fromProfile m  -- | Retrieve access key, secret key, and a session token from the default@@ -343,7 +353,7 @@ fromFilePath n f = do     p <- liftIO (doesFileExist f)     unless p $ throwM (MissingFileError f)-    i <- either (throwM . invalidErr) return =<< liftIO (INI.readIniFile f)+    i <- liftIO (INI.readIniFile f) >>= either (invalidErr Nothing) return     fmap Auth $ AuthEnv         <$> (req credAccessKey i    <&> AccessKey)         <*> (req credSecretKey i    <&> SecretKey)@@ -351,17 +361,22 @@         <*> pure Nothing   where     req k i =-        either (throwM . invalidErr)-               (return . Text.encodeUtf8)-               (INI.lookupValue n k i)+        case INI.lookupValue n k i of+            Left  e         -> invalidErr (Just k) e+            Right x+                | blank x   -> invalidErr (Just k) "cannot be a blank string."+                | otherwise -> return (Text.encodeUtf8 x)      opt k i = return $-        either (const Nothing)-               (Just . Text.encodeUtf8)-               (INI.lookupValue n k i)+        case INI.lookupValue n k i of+            Left  _ -> Nothing+            Right x -> Just (Text.encodeUtf8 x) -    invalidErr :: String -> AuthError-    invalidErr = InvalidFileError . Text.pack+    invalidErr Nothing  e = throwM $ InvalidFileError (Text.pack e)+    invalidErr (Just k) e = throwM $ InvalidFileError+        (Text.pack f <> ", key " <> k <> " " <> Text.pack e)++    blank x = Text.null x || Text.all isSpace x  -- | Retrieve the default IAM Profile from the local EC2 instance-data. --
src/Network/AWS/EC2/Metadata.hs view
@@ -18,11 +18,6 @@ -- -- It is intended to be used when you need to make metadata calls prior to -- initialisation of the 'Network.AWS.Env.Env'.--- If you wish to retrieve instance metadata during normal operations--- and are using either the 'Network.AWS.AWS' or 'Control.Monad.Trans.AWS.AWST'--- monads, then prefer one of the 'Control.Monad.Trans.AWS.metadata' related--- functions available there, as the functions in this module do not use the--- underlying 'MonadFree' 'Network.AWS.Free.Command' DSL. module Network.AWS.EC2.Metadata     (     -- * EC2 Instance Check
− src/Network/AWS/Free.hs
@@ -1,201 +0,0 @@-{-# LANGUAGE BangPatterns      #-}-{-# LANGUAGE CPP               #-}-{-# LANGUAGE FlexibleContexts  #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs             #-}-{-# LANGUAGE LambdaCase        #-}-{-# LANGUAGE RankNTypes        #-}---- |--- Module      : Network.AWS.Free--- Copyright   : (c) 2013-2015 Brendan Hay--- License     : Mozilla Public License, v. 2.0.--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>--- Stability   : provisional--- Portability : non-portable (GHC extensions)------ Defines the core AST, logic and interpreters for AWS behaviour.-module Network.AWS.Free where--import           Control.Applicative-import           Control.Monad.Reader-import           Control.Monad.Trans.Free.Church-import           Data.Conduit                    (Source, yield)-import           Network.AWS.EC2.Metadata        (Dynamic, Metadata)-import           Network.AWS.Pager-import           Network.AWS.Prelude-import           Network.AWS.Request             (requestURL)-import           Network.AWS.Types-import           Network.AWS.Waiter-#if MIN_VERSION_free(4,12,0)-#else-import           Control.Monad.Catch-import           Control.Monad.Trans.Free        (FreeT (..))-#endif--import           Prelude--data Command r where-    CheckF ::             (Bool             -> r) -> Command r-    DynF   :: Dynamic  -> (ByteString       -> r) -> Command r-    MetaF  :: Metadata -> (ByteString       -> r) -> Command r-    UserF  ::             (Maybe ByteString -> r) -> Command r--    SignF  :: (AWSPresigner (Sg s), AWSRequest a)-           => Service s-           -> UTCTime-           -> Seconds-           -> a-           -> (ClientRequest -> r)-           -> Command r--    SendF  :: (AWSSigner (Sg s), AWSRequest a)-           => Service s-           -> a-           -> (Rs a -> r)-           -> Command r--    AwaitF :: (AWSSigner (Sg s), AWSRequest a)-           => Service s-           -> Wait a-           -> a-           -> (Rs a -> r)-           -> Command r--instance Functor Command where-    fmap f = \case-        CheckF         k -> CheckF         (fmap f k)-        DynF         x k -> DynF         x (fmap f k)-        MetaF        x k -> MetaF        x (fmap f k)-        UserF          k -> UserF          (fmap f k)-        SignF  s t e x k -> SignF  s t e x (fmap f k)-        SendF  s     x k -> SendF  s     x (fmap f k)-        AwaitF s w   x k -> AwaitF s w   x (fmap f k)--#if MIN_VERSION_free(4,12,0)-#else-instance MonadThrow m => MonadThrow (FreeT Command m) where-    throwM = lift . throwM--instance MonadCatch m => MonadCatch (FreeT Command m) where-    catch (FreeT m) f = FreeT $-        liftM (fmap (`catch` f)) m `catch` (runFreeT . f)--instance MonadThrow m => MonadThrow (FT Command m) where-    throwM = lift . throwM--instance MonadCatch m => MonadCatch (FT Command m) where-    catch m f = toFT $ fromFT m `catch` (fromFT . f)-#endif---- | Send a request, returning the associated response if successful.------ /See:/ 'sendWith'-send :: (MonadFree Command m, AWSRequest a)-     => a-     -> m (Rs a)-send = sendWith id---- | A variant of 'send' that allows modifying the default 'Service' definition--- used to configure the request.-sendWith :: (MonadFree Command m, AWSSigner (Sg s), AWSRequest a)-         => (Service (Sv a) -> Service s) -- ^ Modify the default service configuration.-         -> a                             -- ^ Request.-         -> m (Rs a)-sendWith f x = liftF (SendF (f (serviceOf x)) x id)---- | Repeatedly send a request, automatically setting markers and--- paginating over multiple responses while available.------ /See:/ 'paginateWith'-paginate :: (MonadFree Command m, AWSPager a)-         => a-         -> Source m (Rs a)-paginate = paginateWith id---- | A variant of 'paginate' that allows modifying the default 'Service' definition--- used to configure the request.-paginateWith :: (MonadFree Command m, AWSSigner (Sg s), AWSPager a)-             => (Service (Sv a) -> Service s) -- ^ Modify the default service configuration.-             -> a                             -- ^ Initial request.-             -> Source m (Rs a)-paginateWith f rq = go rq-  where-    go !x = do-        !y <- lift $ liftF (SendF s x id)-        yield y-        maybe (pure ())-              go-              (page x y)--    !s = f (serviceOf rq)---- | Poll the API with the supplied request until a specific 'Wait' condition--- is fulfilled.------ /See:/ 'awaitWith'-await :: (MonadFree Command m, AWSRequest a)-      => Wait a-      -> a-      -> m (Rs a)-await = awaitWith id---- | A variant of 'await' that allows modifying the default 'Service' definition--- used to configure the request.-awaitWith :: (MonadFree Command m, AWSSigner (Sg s), AWSRequest a)-          => (Service (Sv a) -> Service s) -- ^ Modify the default service configuration.-          -> Wait a                        -- ^ Polling, error and acceptance criteria.-          -> a                             -- ^ Request to poll with.-          -> m (Rs a)-awaitWith f w x = liftF (AwaitF (f (serviceOf x)) w x id)---- | Presign an URL that is valid from the specified time until the--- number of seconds expiry has elapsed.------ /See:/ 'presign', 'presignWith'-presignURL :: (MonadFree Command m, AWSPresigner (Sg (Sv a)), AWSRequest a)-           => UTCTime     -- ^ Signing time.-           -> Seconds     -- ^ Expiry time.-           -> a           -- ^ Request to presign.-           -> m ByteString-presignURL ts ex = liftM requestURL . presign ts ex---- | Presign an HTTP request that is valid from the specified time until the--- number of seconds expiry has elapsed.------ /See:/ 'presignWith'-presign :: (MonadFree Command m, AWSPresigner (Sg (Sv a)), AWSRequest a)-        => UTCTime     -- ^ Signing time.-        -> Seconds     -- ^ Expiry time.-        -> a           -- ^ Request to presign.-        -> m ClientRequest-presign = presignWith id---- | A variant of 'presign' that allows specifying the 'Service' definition--- used to configure the request.-presignWith :: (MonadFree Command m, AWSPresigner (Sg s), AWSRequest a)-            => (Service (Sv a) -> Service s) -- ^ Function to modify the service configuration.-            -> UTCTime                       -- ^ Signing time.-            -> Seconds                       -- ^ Expiry time.-            -> a                             -- ^ Request to presign.-            -> m ClientRequest-presignWith f ts ex x = liftF (SignF (f (serviceOf x)) ts ex x id)---- | Test whether the underlying host is running on EC2.--- For 'IO' based interpretations of 'MonadFree' 'Command', this is memoised and--- any external check occurs for the first call only.-isEC2 :: MonadFree Command m => m Bool-isEC2 = liftF (CheckF id)---- | Retrieve the specified 'Dynamic' data.-dynamic :: MonadFree Command m => Dynamic -> m ByteString-dynamic d = liftF (DynF d id)---- | Retrieve the specified 'Metadata'.-metadata :: MonadFree Command m => Metadata -> m ByteString-metadata m = liftF (MetaF m id)---- | Retrieve the user data. Returns 'Nothing' if no user data is assigned--- to the instance.-userdata :: MonadFree Command m => m (Maybe ByteString)-userdata = liftF (UserF id)
src/Network/AWS/Internal/HTTP.hs view
@@ -101,7 +101,7 @@         . mconcat         . intersperse " "         $ [ "[Retry " <> build x <> "]"-          , " after "+          , "after"           , build (n + 1)           , "attempts."           ]@@ -113,16 +113,22 @@        -> Wait a        -> Request a        -> m (Either Error (Response a))-       -> m (Either Error (Response a))-waiter Env{..} w@Wait{..} rq = retrying policy check+       -> m (Maybe Error)+waiter Env{..} w@Wait{..} rq f = retrying policy check wait >>= exit   where     policy = limitRetries _waitAttempts           <> constantDelay (microseconds _waitDelay) -    check n rs = do-        let a = fromMaybe AcceptRetry (accept w rq rs)-        msg n a >> return (retry a)+    wait = do+        e <- f+        return (fromMaybe AcceptRetry (accept w rq e), e) +    exit (AcceptSuccess, _)      = return Nothing+    exit (_,             Left e) = return (Just e)+    exit (_,             _)      = return Nothing++    check n (a, _) = msg n a >> return (retry a)+     retry AcceptSuccess = False     retry AcceptFailure = False     retry AcceptRetry   = True@@ -132,7 +138,7 @@         . intersperse " "         $ [ "[Await " <> build _waitName <> "]"           , build a-          , " after "+          , "after"           , build (n + 1)           , "attempts."           ]
src/Network/AWS/Presign.hs view
@@ -13,11 +13,6 @@ -- -- It is intended for use directly with "Network.AWS.Auth" when only presigning -- and no other AWS actions are required.--- If you wish to presign requests and are using either the 'Network.AWS.AWS'--- or 'Control.Monad.Trans.AWS.AWST' monads, then prefer one of the relevant--- 'Control.Monad.Trans.AWS.presign'ing functions available there, as the--- functions in this module do not use the underlying 'MonadFree'--- 'Network.AWS.Free.Command' DSL. module Network.AWS.Presign where  import           Control.Lens