@@ -17,16 +17,15 @@
1717module Network.Google where
1818
1919import Control.Applicative
20+import Control.Exception.Lens (throwingM)
2021import Control.Monad
2122import Control.Monad.Base
2223import Control.Monad.Catch
23−import Control.Monad.IO.Class (MonadIO)
2424import Control.Monad.Reader
2525import qualified Control.Monad.RWS.Lazy as LRW
2626import qualified Control.Monad.RWS.Strict as RW
2727import qualified Control.Monad.State.Lazy as LS
2828import qualified Control.Monad.State.Strict as S
29−import Control.Monad.Trans.Class (lift)
3029import Control.Monad.Trans.Control
3130import Control.Monad.Trans.Except (ExceptT)
3231import Control.Monad.Trans.Identity (IdentityT)
@@ -35,8 +34,8 @@ import Control.Monad.Trans.Maybe (MaybeT)
3534import Control.Monad.Trans.Resource
3635import qualified Control.Monad.Writer.Lazy as LW
3736import qualified Control.Monad.Writer.Strict as W
38−import Network.Google.Auth
3937import Network.Google.Env
38+import Network.Google.Internal.HTTP
4039import Network.Google.Prelude
4140
4241newtype Google a = Google { unGoogle :: ReaderT Env (ResourceT IO) a }
@@ -94,11 +93,19 @@ instance (Monoid w, MonadGoogle m) => MonadGoogle (RW.RWST r w s m) where
9493instance (Monoid w, MonadGoogle m) => MonadGoogle (LRW.RWST r w s m) where
9594 liftGoogle = lift . liftGoogle
9695
97−runGoogle :: MonadResource m => Env -> Google a -> m a
98−runGoogle e m = liftResourceT $ runReaderT (unGoogle m) e -- (e ^. environment)
96+runGoogle :: (MonadResource m, HasEnv r) => r -> Google a -> m a
97+runGoogle e m = liftResourceT $ runReaderT (unGoogle m) (e ^. environment)
9998
100−send :: GoogleRequest a => a -> m (Rs a)
101−send = undefined
99+send :: (MonadGoogle m, GoogleRequest a) => a -> m (Rs a)
100+send x = liftGoogle $ do
101+ e <- ask
102+ r <- perform e x
103+ hoistError r
102104
103−-- download :: GoogleRequest (MediaDownload a) => a -> m (Rs (MediaDownload a))
104−-- download = send . MediaDownload
105+media :: (MonadGoogle m, GoogleRequest (MediaDownload a))
106+ => a
107+ -> m (Rs (MediaDownload a))
108+media = send . MediaDownload
109+
110+hoistError :: MonadThrow m => Either Error a -> m a
111+hoistError = either (throwingM _Error) return