module Distribution.Hackage.API where

import Data.Proxy
import Distribution.Hackage.Types
import Distribution.PackageDescription
import Network.HTTP.Client (Manager)
import Network.HTTP.Client.TLS
import Servant.API
import Servant.Client

getPackages :: ClientM [Package]
getVersions :: Package -> ClientM Versions
getRevisions :: Package -> ClientM [Revision]
getCabalFile :: Package -> ClientM GenericPackageDescription
getCabalFile' :: Package -> Int -> ClientM GenericPackageDescription
ClientM [Package]
getPackages :<|> Package -> ClientM Versions
getVersions :<|> Package -> ClientM [Revision]
getRevisions :<|> Package -> ClientM GenericPackageDescription
getCabalFile :<|> Package -> Int -> ClientM GenericPackageDescription
getCabalFile' = Proxy HackageAPI -> Client ClientM HackageAPI
forall api.
HasClient ClientM api =>
Proxy api -> Client ClientM api
client (Proxy HackageAPI
forall k (t :: k). Proxy t
Proxy @HackageAPI)

runClient :: Manager -> ClientM a -> IO (Either ClientError a)
runClient :: Manager -> ClientM a -> IO (Either ClientError a)
runClient Manager
manager ClientM a
m = do
  BaseUrl
url <- String -> IO BaseUrl
forall (m :: Type -> Type). MonadThrow m => String -> m BaseUrl
parseBaseUrl String
"https://hackage.haskell.org/"
  let env :: ClientEnv
env = Manager -> BaseUrl -> ClientEnv
mkClientEnv Manager
manager BaseUrl
url
  ClientM a -> ClientEnv -> IO (Either ClientError a)
forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM ClientM a
m ClientEnv
env

runClient' :: ClientM a -> IO (Either ClientError a)
runClient' :: ClientM a -> IO (Either ClientError a)
runClient' ClientM a
m = IO Manager
forall (m :: Type -> Type). MonadIO m => m Manager
newTlsManager IO Manager
-> (Manager -> IO (Either ClientError a))
-> IO (Either ClientError a)
forall (m :: Type -> Type) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Manager -> ClientM a -> IO (Either ClientError a))
-> ClientM a -> Manager -> IO (Either ClientError a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip Manager -> ClientM a -> IO (Either ClientError a)
forall a. Manager -> ClientM a -> IO (Either ClientError a)
runClient ClientM a
m