module Effectful.Zoo.Amazonka.Api.Send
  ( sendAws,
    askAwsEnv,
    localAwsEnv,
    lazySendAws,
  ) where

import Amazonka qualified as AWS
import Effectful
import Effectful.Dispatch.Dynamic
import Effectful.Error.Static
import Effectful.Resource
import Effectful.Zoo.Amazonka.Data.AwsEnv
import Effectful.Zoo.Amazonka.Data.AwsError
import Effectful.Zoo.Amazonka.Data.AwsLogEntry
import Effectful.Zoo.Amazonka.Data.AwsRequest
import Effectful.Zoo.Amazonka.Data.AwsResponse
import Effectful.Zoo.Amazonka.Dynamic
import Effectful.Zoo.Core
import Effectful.Zoo.DataLog.Api
import Effectful.Zoo.DataLog.Dynamic
import Effectful.Zoo.Lazy.Dynamic
import GHC.Stack qualified as GHC
import HaskellWorks.Prelude

sendAwsInternal :: forall a r. ()
  => AwsRequest a
  => HasCallStack
  => r <: Amazonka
  => r <: Error AwsError
  => Typeable (AwsResponse a)
  => Typeable a
  => a
  -> Eff r (AwsResponse a)
sendAwsInternal :: forall a (r :: [Effect]).
(AwsRequest a, HasCallStack, r <: Amazonka, r <: Error AwsError,
 Typeable (AwsResponse a), Typeable a) =>
a -> Eff r (AwsResponse a)
sendAwsInternal a
req =
  Amazonka (Eff r) (Either AwsError (AwsResponse a))
-> Eff r (Either AwsError (AwsResponse a))
forall (e :: Effect) (es :: [Effect]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (a -> Amazonka (Eff r) (Either AwsError (AwsResponse a))
forall a1 (a :: * -> *).
(HasCallStack, AwsRequest a1, Typeable a1,
 Typeable (AwsResponse a1)) =>
a1 -> Amazonka a (Either AwsError (AwsResponse a1))
SendAws a
req)
    Eff r (Either AwsError (AwsResponse a))
-> (Eff r (Either AwsError (AwsResponse a))
    -> Eff r (AwsResponse a))
-> Eff r (AwsResponse a)
forall a b. a -> (a -> b) -> b
& (AwsError -> Eff r (AwsResponse a))
-> Eff r (Either AwsError (AwsResponse a)) -> Eff r (AwsResponse a)
forall e a (m :: * -> *).
Monad m =>
(e -> m a) -> m (Either e a) -> m a
onLeftM AwsError -> Eff r (AwsResponse a)
forall e (es :: [Effect]) a.
(HasCallStack, Error e :> es, Show e) =>
e -> Eff es a
throwError

askAwsEnv :: ()
  => HasCallStack
  => r <: Amazonka
  => Eff r AwsEnv
askAwsEnv :: forall (r :: [Effect]).
(HasCallStack, r <: Amazonka) =>
Eff r AwsEnv
askAwsEnv =
  Amazonka (Eff r) AwsEnv -> Eff r AwsEnv
forall (e :: Effect) (es :: [Effect]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send Amazonka (Eff r) AwsEnv
forall (a :: * -> *). Amazonka a AwsEnv
AskAwsEnv

localAwsEnv :: ()
  => HasCallStack
  => r <: Amazonka
  => (AwsEnv -> AwsEnv)
  -> Eff r a
  -> Eff r a
localAwsEnv :: forall (r :: [Effect]) a.
(HasCallStack, r <: Amazonka) =>
(AwsEnv -> AwsEnv) -> Eff r a -> Eff r a
localAwsEnv AwsEnv -> AwsEnv
f Eff r a
m =
  Amazonka (Eff r) a -> Eff r a
forall (e :: Effect) (es :: [Effect]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send ((AwsEnv -> AwsEnv) -> Eff r a -> Amazonka (Eff r) a
forall (a :: * -> *) b. (AwsEnv -> AwsEnv) -> a b -> Amazonka a b
LocalAwsEnv AwsEnv -> AwsEnv
f Eff r a
m)

sendAws :: forall a r. ()
  => HasCallStack
  => AwsRequest a
  => r <: Amazonka
  => r <: DataLog AwsLogEntry
  => r <: Error AwsError
  => r <: IOE
  => Typeable (AwsResponse a)
  => Typeable a
  => a
  -> Eff r (AwsResponse a)
sendAws :: forall a (r :: [Effect]).
(HasCallStack, AwsRequest a, r <: Amazonka,
 r <: DataLog AwsLogEntry, r <: Error AwsError, r <: IOE,
 Typeable (AwsResponse a), Typeable a) =>
a -> Eff r (AwsResponse a)
sendAws a
req = (HasCallStack => Eff r (AwsResponse a)) -> Eff r (AwsResponse a)
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => Eff r (AwsResponse a)) -> Eff r (AwsResponse a))
-> (HasCallStack => Eff r (AwsResponse a)) -> Eff r (AwsResponse a)
forall a b. (a -> b) -> a -> b
$ do
  AwsEnv
envAws0 <- Eff r AwsEnv
forall (r :: [Effect]).
(HasCallStack, r <: Amazonka) =>
Eff r AwsEnv
askAwsEnv

  AwsEnv
envAws1 <- UnliftStrategy
-> ((forall {r}. Eff r r -> IO r) -> IO AwsEnv) -> Eff r AwsEnv
forall (es :: [Effect]) a.
(HasCallStack, IOE :> es) =>
UnliftStrategy
-> ((forall r. Eff es r -> IO r) -> IO a) -> Eff es a
withEffToIO (Persistence -> Limit -> UnliftStrategy
ConcUnlift Persistence
Persistent Limit
Unlimited) (((forall {r}. Eff r r -> IO r) -> IO AwsEnv) -> Eff r AwsEnv)
-> ((forall {r}. Eff r r -> IO r) -> IO AwsEnv) -> Eff r AwsEnv
forall a b. (a -> b) -> a -> b
$ \forall {r}. Eff r r -> IO r
effToIO ->
    AwsEnv -> IO AwsEnv
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AwsEnv -> IO AwsEnv) -> AwsEnv -> IO AwsEnv
forall a b. (a -> b) -> a -> b
$ AwsEnv
envAws0
      { AWS.logger = \LogLevel
logLevel ByteStringBuilder
builder ->
          Eff r () -> IO ()
forall {r}. Eff r r -> IO r
effToIO (Eff r () -> IO ()) -> Eff r () -> IO ()
forall a b. (a -> b) -> a -> b
$ AwsLogEntry -> Eff r ()
forall (r :: [Effect]) i.
(HasCallStack, r <: DataLog i) =>
i -> Eff r ()
dataLog (AwsLogEntry -> Eff r ()) -> AwsLogEntry -> Eff r ()
forall a b. (a -> b) -> a -> b
$ CallStack -> LogLevel -> ByteStringBuilder -> AwsLogEntry
AwsLogEntry CallStack
HasCallStack => CallStack
GHC.callStack LogLevel
logLevel ByteStringBuilder
builder
      }

  (AwsEnv -> AwsEnv)
-> Eff r (AwsResponse a) -> Eff r (AwsResponse a)
forall (r :: [Effect]) a.
(HasCallStack, r <: Amazonka) =>
(AwsEnv -> AwsEnv) -> Eff r a -> Eff r a
localAwsEnv (AwsEnv -> AwsEnv -> AwsEnv
forall a b. a -> b -> a
const AwsEnv
envAws1) (Eff r (AwsResponse a) -> Eff r (AwsResponse a))
-> Eff r (AwsResponse a) -> Eff r (AwsResponse a)
forall a b. (a -> b) -> a -> b
$
    a -> Eff r (AwsResponse a)
forall a (r :: [Effect]).
(AwsRequest a, HasCallStack, r <: Amazonka, r <: Error AwsError,
 Typeable (AwsResponse a), Typeable a) =>
a -> Eff r (AwsResponse a)
sendAwsInternal a
req

lazySendAws :: forall a r. ()
  => HasCallStack
  => AwsRequest a
  => r <: DataLog AwsLogEntry
  => r <: Error AwsError
  => r <: IOE
  => r <: Lazy AwsEnv
  => r <: Resource
  => Typeable (AwsResponse a)
  => Typeable a
  => a
  -> Eff r (AwsResponse a)
lazySendAws :: forall a (r :: [Effect]).
(HasCallStack, AwsRequest a, r <: DataLog AwsLogEntry,
 r <: Error AwsError, r <: IOE, r <: Lazy AwsEnv, r <: Resource,
 Typeable (AwsResponse a), Typeable a) =>
a -> Eff r (AwsResponse a)
lazySendAws a
req = (HasCallStack => Eff r (AwsResponse a)) -> Eff r (AwsResponse a)
forall a. HasCallStack => (HasCallStack => a) -> a
GHC.withFrozenCallStack ((HasCallStack => Eff r (AwsResponse a)) -> Eff r (AwsResponse a))
-> (HasCallStack => Eff r (AwsResponse a)) -> Eff r (AwsResponse a)
forall a b. (a -> b) -> a -> b
$ do
  AwsEnv
awsEnv <- Eff r AwsEnv
forall (r :: [Effect]) i. (r <: Lazy i) => Eff r i
lazyAsk
  AwsEnv
-> Eff (Amazonka : r) (AwsResponse a) -> Eff r (AwsResponse a)
forall a (r :: [Effect]).
(r <: IOE, r <: Resource) =>
AwsEnv -> Eff (Amazonka : r) a -> Eff r a
runAmazonka AwsEnv
awsEnv (a -> Eff (Amazonka : r) (AwsResponse a)
forall a (r :: [Effect]).
(HasCallStack, AwsRequest a, r <: Amazonka,
 r <: DataLog AwsLogEntry, r <: Error AwsError, r <: IOE,
 Typeable (AwsResponse a), Typeable a) =>
a -> Eff r (AwsResponse a)
sendAws a
req)