{-# LANGUAGE OverloadedStrings #-} module Jenga.HTTP where import Control.Monad (when, void) import Data.Aeson (eitherDecode') import Network.HTTP.Client.Conduit import Network.HTTP.Types.Header (hAccept) import Network.HTTP.Types.Status (status200) import Jenga.PackageList newtype StackResolver = StackResolver String deriving (Eq, Show) stackageUrl :: String stackageUrl = "https://www.stackage.org/" -- Should use an ErrorT here. getStackageResolverPkgList :: StackResolver -> IO (Either String PackageList) getStackageResolverPkgList (StackResolver sr) = do -- TODO: swap out for something that doesn't `fail`. request <- parseRequest $ stackageUrl ++ sr withManager $ do response <- httpLbs $ request { requestHeaders = (hAccept, "application/json") : requestHeaders request } when (responseStatus response /= status200) $ void . error $ "getStackageResolverPkgList: status " ++ show (responseStatus response) pure $ eitherDecode' (responseBody response)