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