{-# LANGUAGE OverloadedStrings, TypeSynonymInstances, FlexibleInstances, ExistentialQuantification, TypeFamilies, GeneralizedNewtypeDeriving, StandaloneDeriving, MultiParamTypeClasses, UndecidableInstances, AllowAmbiguousTypes, ScopedTypeVariables, FunctionalDependencies, FlexibleContexts, ConstraintKinds #-}
module System.Log.Heavy.Level
(
Level (..),
levelToLogLevel, logLevelToLevel,
parseLevel,
trace_level, debug_level, info_level, warn_level, error_level, fatal_level,
disable_logging
) where
import Control.Monad.Logger (LogLevel (..))
import qualified Data.Text as T
import qualified System.Posix.Syslog as Syslog
data Level = Level {
Level -> Text
levelName :: T.Text
, Level -> Int
levelInt :: Int
, Level -> Priority
levelToPriority :: Syslog.Priority
} deriving (Level -> Level -> Bool
(Level -> Level -> Bool) -> (Level -> Level -> Bool) -> Eq Level
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Level -> Level -> Bool
$c/= :: Level -> Level -> Bool
== :: Level -> Level -> Bool
$c== :: Level -> Level -> Bool
Eq)
instance Show Level where
show :: Level -> String
show Level
l = Text -> String
T.unpack (Level -> Text
levelName Level
l)
instance Ord Level where
compare :: Level -> Level -> Ordering
compare Level
l1 Level
l2 = Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Level -> Int
levelInt Level
l1) (Level -> Int
levelInt Level
l2)
trace_level :: Level
trace_level :: Level
trace_level = Text -> Int -> Priority -> Level
Level Text
"TRACE" Int
600 Priority
Syslog.Debug
debug_level :: Level
debug_level :: Level
debug_level = Text -> Int -> Priority -> Level
Level Text
"DEBUG" Int
500 Priority
Syslog.Debug
info_level :: Level
info_level :: Level
info_level = Text -> Int -> Priority -> Level
Level Text
"INFO" Int
400 Priority
Syslog.Info
warn_level :: Level
warn_level :: Level
warn_level = Text -> Int -> Priority -> Level
Level Text
"WARN" Int
300 Priority
Syslog.Warning
error_level :: Level
error_level :: Level
error_level = Text -> Int -> Priority -> Level
Level Text
"ERROR" Int
200 Priority
Syslog.Error
fatal_level :: Level
fatal_level :: Level
fatal_level = Text -> Int -> Priority -> Level
Level Text
"FATAL" Int
100 Priority
Syslog.Emergency
disable_logging :: Level
disable_logging :: Level
disable_logging = Text -> Int -> Priority -> Level
Level Text
"DISABLED" Int
0 Priority
Syslog.Emergency
levelToLogLevel :: Level -> LogLevel
levelToLogLevel :: Level -> LogLevel
levelToLogLevel Level
l =
case Level -> Text
levelName Level
l of
Text
"DEBUG" -> LogLevel
LevelDebug
Text
"INFO" -> LogLevel
LevelInfo
Text
"WARN" -> LogLevel
LevelWarn
Text
"ERROR" -> LogLevel
LevelError
Text
name -> Text -> LogLevel
LevelOther Text
name
logLevelToLevel :: LogLevel -> Level
logLevelToLevel :: LogLevel -> Level
logLevelToLevel LogLevel
LevelDebug = Level
debug_level
logLevelToLevel LogLevel
LevelInfo = Level
info_level
logLevelToLevel LogLevel
LevelWarn = Level
warn_level
logLevelToLevel LogLevel
LevelError = Level
error_level
logLevelToLevel (LevelOther Text
name) = Text -> Int -> Priority -> Level
Level Text
name Int
210 Priority
Syslog.Alert
parseLevel :: [Level]
-> T.Text
-> Maybe Level
parseLevel :: [Level] -> Text -> Maybe Level
parseLevel [Level]
knownLevels Text
str = [Level] -> Maybe Level
go [Level]
knownLevels
where
go :: [Level] -> Maybe Level
go [] = Maybe Level
forall a. Maybe a
Nothing
go (Level
l:[Level]
ls)
| Text -> Text
T.toCaseFold (Level -> Text
levelName Level
l) Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
needle = Level -> Maybe Level
forall a. a -> Maybe a
Just Level
l
| Bool
otherwise = [Level] -> Maybe Level
go [Level]
ls
needle :: Text
needle = Text -> Text
T.toCaseFold Text
str