module Data.Boltzmann.Internal.Logging
( Log(..)
, info
, warn
, warn'
, hint
, hint'
, fail
, fail'
) where
import Prelude hiding (log, fail)
import Data.Time.Clock
import Data.Time.LocalTime
import Data.Time.Format
import System.IO
import System.Exit
import System.Console.Pretty
getTime :: IO String
getTime = do
now <- getCurrentTime
timeZone <- getCurrentTimeZone
let t = utcToLocalTime timeZone now
return $ formatTime defaultTimeLocale "%d-%m-%Y %H:%M:%S" t
data Level = Info
| Warning
| Hint
| Error
instance Show Level where
show Info = "INFO"
show Warning = "WARN"
show Hint = "HINT"
show Error = "ERR"
lvlColor :: Level -> Color
lvlColor Info = Blue
lvlColor Warning = Yellow
lvlColor Hint = Green
lvlColor Error = Red
brackets :: IO a -> IO ()
brackets m = hPutStr stderr "[" >> m >> hPutStr stderr "] "
parens :: IO a -> IO ()
parens m = hPutStr stderr "(" >> m >> hPutStr stderr ") "
data Log = Log { lvl :: Level
, msg :: String
}
printLabel :: Log -> IO ()
printLabel log = do
inColor <- supportsPretty
let label = show (lvl log)
let format = style Bold . color (lvlColor $ lvl log)
let x = if inColor then format label
else label
hPutStr stderr x
printTime :: String -> IO ()
printTime time = do
inColor <- supportsPretty
let format = style Italic
let x = if inColor then format time
else time
hPutStr stderr x
report :: Log -> IO ()
report log = do
time <- getTime
brackets $ printLabel log
parens $ printTime time
hPutStrLn stderr $ msg log
info :: String -> IO ()
info s = report Log { lvl = Info, msg = s }
warn :: String -> IO ()
warn s = report Log { lvl = Warning, msg = s }
hint :: String -> IO ()
hint s = report Log { lvl = Hint , msg = s }
hint' :: String -> IO a
hint' s = do
report Log { lvl = Hint , msg = s }
exitWith (ExitFailure 1)
warn' :: String -> IO a
warn' s = do
report Log { lvl = Warning, msg = s }
exitWith (ExitFailure 1)
fail :: String -> IO ()
fail s = report Log { lvl = Error, msg = s }
fail' :: String -> IO a
fail' s = do
report Log { lvl = Error, msg = s }
exitWith (ExitFailure 1)