module Hack.Contrib.Hub where
import Hack
import Hack.Utils
import Prelude hiding ((.), (^), (>), (+))
import MPS
import Hack.Constants
import Text.Printf
import System.Posix.Process (getProcessID)
import System.Time
import Data.Maybe (fromMaybe, fromJust)
import Text.PrettyPrint.ANSI.Leijen
data Severity =
Debug
| Info
| Warn
| Error
| Fatal
| Unknown
deriving (Show, Eq)
hint :: Severity -> String
hint = show > slice 0 1
type Formatter = Severity -> CalendarTime -> Int -> String -> String -> String
type Logger = String -> Severity -> IO ()
hub :: Stream -> Formatter -> String -> Logger
hub stream formatter program = \message severity ->
do
time <- now
pid <- getProcessID ^ from_i
stream $ formatter severity time pid program message
simple_logger :: Maybe Stream -> Maybe Formatter -> String -> Env -> Logger
simple_logger l f program env = do
let stream = l.fromMaybe (env.hack_errors)
let formatter = f.fromMaybe simple_formatter
hub stream formatter program
simple_formatter :: Formatter
simple_formatter severity time pid program message =
printf line_format h t pid l program s
where
time_format = "%Y-%m-%d %H:%M:%S"
line_format = "%s [%s $%d] %5s | %s: %s\n"
h = severity.hint
t = time.format_time time_format
l = severity.show.upper
s = colorize severity message
colorize :: Severity -> String -> String
colorize severity message = color severity (text message) .show
where
level_color =
[ ( Debug , blue )
, ( Info , white )
, ( Warn , yellow )
, ( Error , red )
, ( Fatal , red )
, ( Unknown , green )
]
just_lookup s xs = xs.lookup s .fromJust
color severity = level_color.lookup severity .fromMaybe green