module Control.Monad.Freer.GitHub
  ( GitHub (..),
    runGitHub,
    sendGitHub,
  )
where

import Control.Monad.Freer
import Control.Monad.Freer.Error
import Control.Monad.IO.Class
import Data.Aeson
import GitHub hiding (Error)
import qualified GitHub as GH

data GitHub r where
  SendGHRequest :: FromJSON x => Request 'RW x -> GitHub x

runGitHub :: (Member (Error GH.Error) effs, MonadIO (Eff effs)) => Auth -> Eff (GitHub ': effs) ~> Eff effs
runGitHub auth =
  interpret
    ( \(SendGHRequest req) ->
        liftIO (executeRequest auth req)
          >>= either throwError pure
    )

sendGitHub :: (FromJSON x, Member GitHub effs) => Request 'RW x -> Eff effs x
sendGitHub req = send $ SendGHRequest req