{-# options_ghc -Wall #-} module Control.Monad.Log.Colors where import Control.Monad.Log import Data.String import System.Console.ANSI import Data.Text.Prettyprint.Doc -- | Apply 'SGR' codes to a string to modify its display attributes, resetting -- SGR codes afterward. wrapSGRCode :: (IsString a, Monoid a) => [SGR] -> a -> a wrapSGRCode codes t = mconcat [ fromString $ setSGRCode codes , t , fromString $ setSGRCode [Reset] ] -- | Mapping of 'Severity' levels to SGR styles severitySgr :: Severity -> [SGR] severitySgr = \case Emergency -> [ SetColor Background Vivid Red , SetColor Foreground Vivid Black , SetConsoleIntensity BoldIntensity ] Alert -> [ SetColor Foreground Vivid Red , SetConsoleIntensity BoldIntensity ] Critical -> [ SetColor Foreground Vivid Red , SetConsoleIntensity BoldIntensity ] Error -> [ SetColor Foreground Dull Red ] Warning -> [ SetColor Foreground Vivid Yellow ] Notice -> [ SetColor Foreground Vivid Blue ] Informational -> [] Debug -> [ SetColor Foreground Dull Green ] -- | Color based on severity with a custom mapping of severity to SGR styles colorizeWith :: (Monoid msg, IsString msg) => (Severity -> [SGR]) -> WithSeverity msg -> WithSeverity msg colorizeWith f (WithSeverity sev msg) = WithSeverity sev $ wrapSGRCode (f sev) msg -- | Color based on severity with the default mapping of severity to SGR styles colorize :: (Monoid msg, IsString msg) => WithSeverity msg -> WithSeverity msg colorize = colorizeWith severitySgr renderWithColor :: (Monoid msg, IsString msg, Pretty msg) => WithSeverity msg -> Doc ann renderWithColor = renderWithSeverity pretty . colorize