packages feed

aws-mfa-credentials-0.1.0.0: AwsMfaCredentials/Interpreters/AWS.hs

{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE FlexibleContexts    #-}
{-# LANGUAGE GADTs               #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications    #-}
{-# LANGUAGE TypeOperators       #-}
module AwsMfaCredentials.Interpreters.AWS where

import AwsMfaCredentials.Effects.AWS (AWS(..))
import Control.Lens.Operators ((^.))
import Control.Monad.Freer (Eff, Member, handleRelay, send)
import Control.Monad.Freer.Exception (Exc, throwError)
import qualified Network.AWS as Amazonka
import Network.AWS.STS.GetSessionToken
  (gstrsCredentials, gstrsResponseStatus)

newtype AWSResponseFailure = AWSResponseFailure Int

-- | Run an AWS effect in the Amazonka AWS monad.
runInAWSMonad :: forall r a . ( Member Amazonka.AWS r
                              , Member (Exc AWSResponseFailure) r
                              )
              => Eff (AWS ': r) a -> Eff r a
runInAWSMonad = handleRelay pure bind
  where
    bind :: AWS x
         -> (x -> Eff r a)
         -> Eff r a
    bind (GetSessionToken req) cont = do
      res <- send @Amazonka.AWS . Amazonka.send $ req
      case res ^. gstrsCredentials of
        Just creds -> cont creds
        Nothing ->
          throwError . AWSResponseFailure $ res ^. gstrsResponseStatus