content: module Main where
  
  import           Control.Monad.Trans.Free       (FreeF(..), FreeT(..))
  import           Network.Http.Client            (Connection)
  import           Web.Stripe.Client              (StripeConfig(..), StripeError(..))
  import           Web.Stripe.Client.HttpStreams  (withConnection, callAPI)
  import           Web.Stripe.Test.AllTests       (allTests)
  import           Web.Stripe.Test.Prelude        (Stripe, StripeRequestF(..))
  
  main :: IO ()
  main = allTests runStripe
  
  runStripe :: StripeConfig
            -> Stripe a
            -> IO (Either StripeError a)
  runStripe config stripe =
    withConnection $ \conn ->
      runStripe' conn config stripe
  
  runStripe' :: Connection
             -> StripeConfig
             -> Stripe a
             -> IO (Either StripeError a)
  runStripe' conn config (FreeT m) =
    do f <- m
       case f of
         (Pure a) -> return (Right a)
         (Free (StripeRequestF req decode')) ->
           do r <- callAPI conn decode' config req
              case r of
                (Left e) ->  return (Left e)
                (Right next) -> runStripe' conn config next
  