{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module OpenAPI.Generate.Log where
import Autodocodec
import Data.List (intersperse)
import Data.Text (Text)
import qualified Data.Text as T
data LogSeverity
= TraceSeverity
| InfoSeverity
| WarningSeverity
| ErrorSeverity
deriving (LogSeverity -> LogSeverity -> Bool
(LogSeverity -> LogSeverity -> Bool)
-> (LogSeverity -> LogSeverity -> Bool) -> Eq LogSeverity
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LogSeverity -> LogSeverity -> Bool
== :: LogSeverity -> LogSeverity -> Bool
$c/= :: LogSeverity -> LogSeverity -> Bool
/= :: LogSeverity -> LogSeverity -> Bool
Eq, Eq LogSeverity
Eq LogSeverity =>
(LogSeverity -> LogSeverity -> Ordering)
-> (LogSeverity -> LogSeverity -> Bool)
-> (LogSeverity -> LogSeverity -> Bool)
-> (LogSeverity -> LogSeverity -> Bool)
-> (LogSeverity -> LogSeverity -> Bool)
-> (LogSeverity -> LogSeverity -> LogSeverity)
-> (LogSeverity -> LogSeverity -> LogSeverity)
-> Ord LogSeverity
LogSeverity -> LogSeverity -> Bool
LogSeverity -> LogSeverity -> Ordering
LogSeverity -> LogSeverity -> LogSeverity
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: LogSeverity -> LogSeverity -> Ordering
compare :: LogSeverity -> LogSeverity -> Ordering
$c< :: LogSeverity -> LogSeverity -> Bool
< :: LogSeverity -> LogSeverity -> Bool
$c<= :: LogSeverity -> LogSeverity -> Bool
<= :: LogSeverity -> LogSeverity -> Bool
$c> :: LogSeverity -> LogSeverity -> Bool
> :: LogSeverity -> LogSeverity -> Bool
$c>= :: LogSeverity -> LogSeverity -> Bool
>= :: LogSeverity -> LogSeverity -> Bool
$cmax :: LogSeverity -> LogSeverity -> LogSeverity
max :: LogSeverity -> LogSeverity -> LogSeverity
$cmin :: LogSeverity -> LogSeverity -> LogSeverity
min :: LogSeverity -> LogSeverity -> LogSeverity
Ord, LogSeverity
LogSeverity -> LogSeverity -> Bounded LogSeverity
forall a. a -> a -> Bounded a
$cminBound :: LogSeverity
minBound :: LogSeverity
$cmaxBound :: LogSeverity
maxBound :: LogSeverity
Bounded, Int -> LogSeverity
LogSeverity -> Int
LogSeverity -> [LogSeverity]
LogSeverity -> LogSeverity
LogSeverity -> LogSeverity -> [LogSeverity]
LogSeverity -> LogSeverity -> LogSeverity -> [LogSeverity]
(LogSeverity -> LogSeverity)
-> (LogSeverity -> LogSeverity)
-> (Int -> LogSeverity)
-> (LogSeverity -> Int)
-> (LogSeverity -> [LogSeverity])
-> (LogSeverity -> LogSeverity -> [LogSeverity])
-> (LogSeverity -> LogSeverity -> [LogSeverity])
-> (LogSeverity -> LogSeverity -> LogSeverity -> [LogSeverity])
-> Enum LogSeverity
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: LogSeverity -> LogSeverity
succ :: LogSeverity -> LogSeverity
$cpred :: LogSeverity -> LogSeverity
pred :: LogSeverity -> LogSeverity
$ctoEnum :: Int -> LogSeverity
toEnum :: Int -> LogSeverity
$cfromEnum :: LogSeverity -> Int
fromEnum :: LogSeverity -> Int
$cenumFrom :: LogSeverity -> [LogSeverity]
enumFrom :: LogSeverity -> [LogSeverity]
$cenumFromThen :: LogSeverity -> LogSeverity -> [LogSeverity]
enumFromThen :: LogSeverity -> LogSeverity -> [LogSeverity]
$cenumFromTo :: LogSeverity -> LogSeverity -> [LogSeverity]
enumFromTo :: LogSeverity -> LogSeverity -> [LogSeverity]
$cenumFromThenTo :: LogSeverity -> LogSeverity -> LogSeverity -> [LogSeverity]
enumFromThenTo :: LogSeverity -> LogSeverity -> LogSeverity -> [LogSeverity]
Enum)
instance Show LogSeverity where
show :: LogSeverity -> [Char]
show LogSeverity
ErrorSeverity = [Char]
"ERROR"
show LogSeverity
WarningSeverity = [Char]
"WARN"
show LogSeverity
InfoSeverity = [Char]
"INFO"
show LogSeverity
TraceSeverity = [Char]
"TRACE"
instance Read LogSeverity where
readsPrec :: Int -> ReadS LogSeverity
readsPrec Int
_ (Char
'E' : Char
'R' : Char
'R' : Char
'O' : Char
'R' : [Char]
rest) = [(LogSeverity
ErrorSeverity, [Char]
rest)]
readsPrec Int
_ (Char
'W' : Char
'A' : Char
'R' : Char
'N' : [Char]
rest) = [(LogSeverity
WarningSeverity, [Char]
rest)]
readsPrec Int
_ (Char
'I' : Char
'N' : Char
'F' : Char
'O' : [Char]
rest) = [(LogSeverity
InfoSeverity, [Char]
rest)]
readsPrec Int
_ (Char
'T' : Char
'R' : Char
'A' : Char
'C' : Char
'E' : [Char]
rest) = [(LogSeverity
TraceSeverity, [Char]
rest)]
readsPrec Int
_ [Char]
_ = []
instance HasCodec LogSeverity where
codec :: JSONCodec LogSeverity
codec = JSONCodec LogSeverity
forall enum.
(Show enum, Eq enum, Enum enum, Bounded enum) =>
JSONCodec enum
shownBoundedEnumCodec
data LogEntry = LogEntry
{ LogEntry -> [Text]
logEntryPath :: [Text],
LogEntry -> LogSeverity
logEntrySeverity :: LogSeverity,
LogEntry -> Text
logEntryMessage :: Text
}
deriving (Int -> LogEntry -> ShowS
[LogEntry] -> ShowS
LogEntry -> [Char]
(Int -> LogEntry -> ShowS)
-> (LogEntry -> [Char]) -> ([LogEntry] -> ShowS) -> Show LogEntry
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LogEntry -> ShowS
showsPrec :: Int -> LogEntry -> ShowS
$cshow :: LogEntry -> [Char]
show :: LogEntry -> [Char]
$cshowList :: [LogEntry] -> ShowS
showList :: [LogEntry] -> ShowS
Show, LogEntry -> LogEntry -> Bool
(LogEntry -> LogEntry -> Bool)
-> (LogEntry -> LogEntry -> Bool) -> Eq LogEntry
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LogEntry -> LogEntry -> Bool
== :: LogEntry -> LogEntry -> Bool
$c/= :: LogEntry -> LogEntry -> Bool
/= :: LogEntry -> LogEntry -> Bool
Eq)
type LogEntries = [LogEntry]
filterAndTransformLogs :: LogSeverity -> LogEntries -> [Text]
filterAndTransformLogs :: LogSeverity -> [LogEntry] -> [Text]
filterAndTransformLogs LogSeverity
minimumLogLevel = [LogEntry] -> [Text]
transformLogs ([LogEntry] -> [Text])
-> ([LogEntry] -> [LogEntry]) -> [LogEntry] -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LogSeverity -> [LogEntry] -> [LogEntry]
filterLogs LogSeverity
minimumLogLevel
filterLogs :: LogSeverity -> LogEntries -> LogEntries
filterLogs :: LogSeverity -> [LogEntry] -> [LogEntry]
filterLogs LogSeverity
minimumLogLevel = (LogEntry -> Bool) -> [LogEntry] -> [LogEntry]
forall a. (a -> Bool) -> [a] -> [a]
filter ((LogEntry -> Bool) -> [LogEntry] -> [LogEntry])
-> (LogEntry -> Bool) -> [LogEntry] -> [LogEntry]
forall a b. (a -> b) -> a -> b
$ (LogSeverity -> LogSeverity -> Bool
forall a. Ord a => a -> a -> Bool
>= LogSeverity
minimumLogLevel) (LogSeverity -> Bool)
-> (LogEntry -> LogSeverity) -> LogEntry -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LogEntry -> LogSeverity
logEntrySeverity
transformLogs :: LogEntries -> [Text]
transformLogs :: [LogEntry] -> [Text]
transformLogs =
(LogEntry -> Text) -> [LogEntry] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
( \LogEntry {[Text]
Text
LogSeverity
logEntryPath :: LogEntry -> [Text]
logEntrySeverity :: LogEntry -> LogSeverity
logEntryMessage :: LogEntry -> Text
logEntryPath :: [Text]
logEntrySeverity :: LogSeverity
logEntryMessage :: Text
..} ->
Int -> Char -> Text -> Text
T.justifyLeft Int
5 Char
' ' ([Char] -> Text
T.pack ([Char] -> Text) -> [Char] -> Text
forall a b. (a -> b) -> a -> b
$ LogSeverity -> [Char]
forall a. Show a => a -> [Char]
show LogSeverity
logEntrySeverity) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" (" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> [Text] -> Text
transformPath [Text]
logEntryPath Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"): " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
logEntryMessage
)
transformPath :: [Text] -> Text
transformPath :: [Text] -> Text
transformPath = [Text] -> Text
forall a. Monoid a => [a] -> a
mconcat ([Text] -> Text) -> ([Text] -> [Text]) -> [Text] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
intersperse Text
"."