module Distribution.PackageDescription.Remote
where
import Control.Lens ((&), (.~), (^.), (^..))
import Data.Aeson.Lens (key, values, _Integral)
import Data.ByteString.Lazy.Char8 (unpack)
import Distribution.PackageDescription (GenericPackageDescription)
import Distribution.PackageDescription.Parse (ParseResult (..),
parsePackageDescription)
import Network.Wreq (defaults, get, getWith,
header, responseBody)
getPackage :: String -> Integer -> IO (ParseResult GenericPackageDescription)
getPackage pkg revision = do
res <- get uri
return $ parsePackageDescription (unpack (res ^. responseBody))
where
uri = "http://hackage.haskell.org/package/" ++ pkg ++ "/revision/" ++
show revision
getPackageLatest :: String -> IO (ParseResult GenericPackageDescription)
getPackageLatest pkg = do
revision <- getPackageLatestRevision pkg
getPackage pkg revision
getPackageRevisions :: String -> IO [Integer]
getPackageRevisions pkg = do
res <- getWith opt uri
return $ res ^.. responseBody . values . key "number" . _Integral
where
opt = defaults & header "Accept" .~ ["application/json"]
uri = "http://hackage.haskell.org/package/" ++ pkg ++ "/revisions/"
getPackageLatestRevision :: String -> IO Integer
getPackageLatestRevision pkg = do
revisions <- getPackageRevisions pkg
return (maximum revisions)