module Trace.Hpc.Codecov.Curl ( postJson, readCoverageResult, PostResult (..) ) where
import Control.Applicative
import Control.Monad
import Data.Aeson
import Data.Aeson.Types (parseMaybe)
import qualified Data.ByteString.Lazy.Char8 as LBS
import Data.Maybe
import Network.Curl
import Trace.Hpc.Codecov.Types
parseResponse :: CurlResponse -> PostResult
parseResponse r = case respCurlCode r of
CurlOK -> PostSuccess (getField "url") (getField "wait_url")
_ -> PostFailure $ getField "message"
where getField fieldName = fromJust $ mGetField fieldName
mGetField fieldName = do
result <- decode $ LBS.pack (respBody r)
parseMaybe (.: fieldName) result
postJson :: String
-> URLString
-> Bool
-> IO PostResult
postJson jsonCoverage url printResponse = do
h <- initialize
setopt h (CurlPost True)
setopt h (CurlVerbose True)
setopt h (CurlURL url)
setopt h (CurlHttpHeaders ["Content-Type: application/json"])
setopt h (CurlPostFields [jsonCoverage])
r <- perform_with_response_ h
when printResponse $ putStrLn $ respBody r
return $ parseResponse r
extractCoverage :: String -> Maybe String
extractCoverage rBody = (++ "%") . show <$> (getField "coverage" :: Maybe Integer)
where getField fieldName = do
result <- decode $ LBS.pack rBody
parseMaybe (.: fieldName) result
readCoverageResult :: URLString
-> Bool
-> IO (Maybe String)
readCoverageResult url printResponse = do
response <- curlGetString url curlOptions
when printResponse $ putStrLn $ snd response
return $ case response of
(CurlOK, body) -> extractCoverage body
_ -> Nothing
where curlOptions = [
CurlTimeout 60,
CurlConnectTimeout 60,
CurlVerbose True,
CurlFollowLocation True]