packages feed

kitchen-sink-0.1.0.0: src/KitchenSink/Engine/Diagnostics.hs

{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}

module KitchenSink.Engine.Diagnostics (
    reportDiagnostics,
    hasFailures,
) where

import Data.Foldable (any)
import Data.Text qualified as Text
import System.IO (hPutStrLn, stderr)

import KitchenSink.Core.Build.Target (SourceLocation (..))
import KitchenSink.Layout.Base (Diagnostic (..), Severity (..))
import KitchenSink.Prelude

-- | One line per diagnostic on stderr, @path: warning: message@.
reportDiagnostics :: [Diagnostic] -> IO ()
reportDiagnostics = traverse_ (hPutStrLn stderr . render)
  where
    render :: Diagnostic -> String
    render d =
        mconcat
            [ case d.source of FileSource path -> path
            , ": "
            , case d.severity of
                Warning -> "warning"
                Failure -> "error"
            , ": "
            , Text.unpack d.message
            ]

hasFailures :: [Diagnostic] -> Bool
hasFailures = any ((== Failure) . (.severity))