packages feed

hpc-codecov-0.5.0.0: src/Trace/Hpc/Codecov/Report.hs

-- |
-- Module:     Trace.Hpc.Codecov.Report
-- Copyright:  (c) 2022 8c6794b6
-- License:    BSD3
-- Maintainer: 8c6794b6 <8c6794b6@gmail.com>
--
-- Generate Codecov report data.

module Trace.Hpc.Codecov.Report
  ( -- * Types
    Report(..)
  , CoverageEntry(..)
  , Format(..)
  , LineHits
  , Hit(..)
  , FunctionHits
  , BranchHits

    -- * Functions
  , genReport
  , genCoverageEntries
  , emitCoverage
  ) where

-- base
import Control.Monad                  (when)
import System.IO                      (IOMode (..), hPutStrLn, stderr,
                                       stdout, withFile)

-- bytestring
import Data.ByteString.Builder        (hPutBuilder)

-- Internal
import Trace.Hpc.Codecov.Report.Emit
import Trace.Hpc.Codecov.Report.Entry


-- ------------------------------------------------------------------------
--
-- Exported
--
-- ------------------------------------------------------------------------

-- | Generate report data from options.
genReport :: Report -> IO ()
genReport rpt = do
  let mb_out = reportOutFile rpt
      oname = maybe "stdout" show mb_out
      say = when (reportVerbose rpt) . hPutStrLn stderr
  entries <- genCoverageEntries rpt
  say ("Writing report to " ++ oname)
  emitCoverage (reportFormat rpt) mb_out entries
  say "Done"

-- | Generate test coverage entries.
genCoverageEntries :: Report -> IO [CoverageEntry]
genCoverageEntries rpt = readTixFile rpt (reportTix rpt) >>= tixToCoverage rpt

-- | Emit simple coverage data.
emitCoverage
  :: Format
  -- ^ Format of the report.
  --
  -- @since 0.4.0.0
  -> Maybe FilePath
  -- ^ 'Just' output file name, or 'Nothing' for 'stdout'.
  -> [CoverageEntry]
  -- ^ Coverage entries to write.
  -> IO ()
emitCoverage fmt mb_outfile entries = wrap emit
  where
    wrap = maybe ($ stdout) (`withFile` WriteMode) mb_outfile
    emit = flip hPutBuilder (builder entries)
    builder = case fmt of
      Codecov   -> buildCodecov
      Lcov      -> buildLcov
      Cobertura -> buildCobertura