module Test.WebDriver.Commands.Logs.Common (
Browser(..)
, detectBrowserFromDriver
, LogType
, LogEntry(..)
, LogLevel(..)
) where
import Data.Aeson as A
import Data.Aeson.Types (typeMismatch)
import Data.Maybe
import Data.Text (Text)
import Test.WebDriver.Types
data Browser =
BrowserChrome
| BrowserFirefox
| BrowserSelenium
deriving (Browser -> Browser -> Bool
(Browser -> Browser -> Bool)
-> (Browser -> Browser -> Bool) -> Eq Browser
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Browser -> Browser -> Bool
== :: Browser -> Browser -> Bool
$c/= :: Browser -> Browser -> Bool
/= :: Browser -> Browser -> Bool
Eq, Int -> Browser -> ShowS
[Browser] -> ShowS
Browser -> String
(Int -> Browser -> ShowS)
-> (Browser -> String) -> ([Browser] -> ShowS) -> Show Browser
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Browser -> ShowS
showsPrec :: Int -> Browser -> ShowS
$cshow :: Browser -> String
show :: Browser -> String
$cshowList :: [Browser] -> ShowS
showList :: [Browser] -> ShowS
Show)
detectBrowserFromDriver :: DriverConfig -> Maybe Browser
detectBrowserFromDriver :: DriverConfig -> Maybe Browser
detectBrowserFromDriver DriverConfig
driverConfig = case DriverConfig
driverConfig of
DriverConfigSeleniumJar { driverConfigSubDrivers :: DriverConfig -> [DriverConfig]
driverConfigSubDrivers = [DriverConfig]
subDrivers } ->
case [DriverConfig]
subDrivers of
(DriverConfig
subDriver:[DriverConfig]
_) -> DriverConfig -> Maybe Browser
detectBrowserFromDriver DriverConfig
subDriver
[] -> Browser -> Maybe Browser
forall a. a -> Maybe a
Just Browser
BrowserSelenium
DriverConfigGeckodriver {} -> Browser -> Maybe Browser
forall a. a -> Maybe a
Just Browser
BrowserFirefox
DriverConfigChromedriver {} -> Browser -> Maybe Browser
forall a. a -> Maybe a
Just Browser
BrowserChrome
data LogEntry = LogEntry {
LogEntry -> Integer
logTime :: Integer
, LogEntry -> LogLevel
logLevel :: LogLevel
, LogEntry -> Text
logMsg :: Text
}
deriving (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, Eq LogEntry
Eq LogEntry =>
(LogEntry -> LogEntry -> Ordering)
-> (LogEntry -> LogEntry -> Bool)
-> (LogEntry -> LogEntry -> Bool)
-> (LogEntry -> LogEntry -> Bool)
-> (LogEntry -> LogEntry -> Bool)
-> (LogEntry -> LogEntry -> LogEntry)
-> (LogEntry -> LogEntry -> LogEntry)
-> Ord LogEntry
LogEntry -> LogEntry -> Bool
LogEntry -> LogEntry -> Ordering
LogEntry -> LogEntry -> LogEntry
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 :: LogEntry -> LogEntry -> Ordering
compare :: LogEntry -> LogEntry -> Ordering
$c< :: LogEntry -> LogEntry -> Bool
< :: LogEntry -> LogEntry -> Bool
$c<= :: LogEntry -> LogEntry -> Bool
<= :: LogEntry -> LogEntry -> Bool
$c> :: LogEntry -> LogEntry -> Bool
> :: LogEntry -> LogEntry -> Bool
$c>= :: LogEntry -> LogEntry -> Bool
>= :: LogEntry -> LogEntry -> Bool
$cmax :: LogEntry -> LogEntry -> LogEntry
max :: LogEntry -> LogEntry -> LogEntry
$cmin :: LogEntry -> LogEntry -> LogEntry
min :: LogEntry -> LogEntry -> LogEntry
Ord, Int -> LogEntry -> ShowS
[LogEntry] -> ShowS
LogEntry -> String
(Int -> LogEntry -> ShowS)
-> (LogEntry -> String) -> ([LogEntry] -> ShowS) -> Show LogEntry
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LogEntry -> ShowS
showsPrec :: Int -> LogEntry -> ShowS
$cshow :: LogEntry -> String
show :: LogEntry -> String
$cshowList :: [LogEntry] -> ShowS
showList :: [LogEntry] -> ShowS
Show, ReadPrec [LogEntry]
ReadPrec LogEntry
Int -> ReadS LogEntry
ReadS [LogEntry]
(Int -> ReadS LogEntry)
-> ReadS [LogEntry]
-> ReadPrec LogEntry
-> ReadPrec [LogEntry]
-> Read LogEntry
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS LogEntry
readsPrec :: Int -> ReadS LogEntry
$creadList :: ReadS [LogEntry]
readList :: ReadS [LogEntry]
$creadPrec :: ReadPrec LogEntry
readPrec :: ReadPrec LogEntry
$creadListPrec :: ReadPrec [LogEntry]
readListPrec :: ReadPrec [LogEntry]
Read)
instance FromJSON LogEntry where
parseJSON :: Value -> Parser LogEntry
parseJSON (Object Object
o) =
Integer -> LogLevel -> Text -> LogEntry
LogEntry (Integer -> LogLevel -> Text -> LogEntry)
-> Parser Integer -> Parser (LogLevel -> Text -> LogEntry)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"timestamp"
Parser (LogLevel -> Text -> LogEntry)
-> Parser LogLevel -> Parser (Text -> LogEntry)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser LogLevel
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"level"
Parser (Text -> LogEntry) -> Parser Text -> Parser LogEntry
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"" (Maybe Text -> Text) -> Parser (Maybe Text) -> Parser Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"message")
parseJSON Value
v = String -> Value -> Parser LogEntry
forall a. String -> Value -> Parser a
typeMismatch String
"LogEntry" Value
v
instance ToJSON LogEntry where
toJSON :: LogEntry -> Value
toJSON (LogEntry {Integer
Text
LogLevel
logTime :: LogEntry -> Integer
logLevel :: LogEntry -> LogLevel
logMsg :: LogEntry -> Text
logTime :: Integer
logLevel :: LogLevel
logMsg :: Text
..}) = [Pair] -> Value
A.object [
(Key
"timestamp", Scientific -> Value
A.Number (Integer -> Scientific
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
logTime))
, (Key
"level", LogLevel -> Value
forall a. ToJSON a => a -> Value
toJSON LogLevel
logLevel)
, (Key
"message", Text -> Value
A.String Text
logMsg)
]
type LogType = String
data LogLevel =
LogOff
| LogSevere
| LogWarning
| LogInfo
| LogConfig
| LogFine
| LogFiner
| LogFinest
| LogDebug
| LogAll
deriving (LogLevel -> LogLevel -> Bool
(LogLevel -> LogLevel -> Bool)
-> (LogLevel -> LogLevel -> Bool) -> Eq LogLevel
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LogLevel -> LogLevel -> Bool
== :: LogLevel -> LogLevel -> Bool
$c/= :: LogLevel -> LogLevel -> Bool
/= :: LogLevel -> LogLevel -> Bool
Eq, Int -> LogLevel -> ShowS
[LogLevel] -> ShowS
LogLevel -> String
(Int -> LogLevel -> ShowS)
-> (LogLevel -> String) -> ([LogLevel] -> ShowS) -> Show LogLevel
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LogLevel -> ShowS
showsPrec :: Int -> LogLevel -> ShowS
$cshow :: LogLevel -> String
show :: LogLevel -> String
$cshowList :: [LogLevel] -> ShowS
showList :: [LogLevel] -> ShowS
Show, ReadPrec [LogLevel]
ReadPrec LogLevel
Int -> ReadS LogLevel
ReadS [LogLevel]
(Int -> ReadS LogLevel)
-> ReadS [LogLevel]
-> ReadPrec LogLevel
-> ReadPrec [LogLevel]
-> Read LogLevel
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS LogLevel
readsPrec :: Int -> ReadS LogLevel
$creadList :: ReadS [LogLevel]
readList :: ReadS [LogLevel]
$creadPrec :: ReadPrec LogLevel
readPrec :: ReadPrec LogLevel
$creadListPrec :: ReadPrec [LogLevel]
readListPrec :: ReadPrec [LogLevel]
Read, Eq LogLevel
Eq LogLevel =>
(LogLevel -> LogLevel -> Ordering)
-> (LogLevel -> LogLevel -> Bool)
-> (LogLevel -> LogLevel -> Bool)
-> (LogLevel -> LogLevel -> Bool)
-> (LogLevel -> LogLevel -> Bool)
-> (LogLevel -> LogLevel -> LogLevel)
-> (LogLevel -> LogLevel -> LogLevel)
-> Ord LogLevel
LogLevel -> LogLevel -> Bool
LogLevel -> LogLevel -> Ordering
LogLevel -> LogLevel -> LogLevel
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 :: LogLevel -> LogLevel -> Ordering
compare :: LogLevel -> LogLevel -> Ordering
$c< :: LogLevel -> LogLevel -> Bool
< :: LogLevel -> LogLevel -> Bool
$c<= :: LogLevel -> LogLevel -> Bool
<= :: LogLevel -> LogLevel -> Bool
$c> :: LogLevel -> LogLevel -> Bool
> :: LogLevel -> LogLevel -> Bool
$c>= :: LogLevel -> LogLevel -> Bool
>= :: LogLevel -> LogLevel -> Bool
$cmax :: LogLevel -> LogLevel -> LogLevel
max :: LogLevel -> LogLevel -> LogLevel
$cmin :: LogLevel -> LogLevel -> LogLevel
min :: LogLevel -> LogLevel -> LogLevel
Ord, LogLevel
LogLevel -> LogLevel -> Bounded LogLevel
forall a. a -> a -> Bounded a
$cminBound :: LogLevel
minBound :: LogLevel
$cmaxBound :: LogLevel
maxBound :: LogLevel
Bounded, Int -> LogLevel
LogLevel -> Int
LogLevel -> [LogLevel]
LogLevel -> LogLevel
LogLevel -> LogLevel -> [LogLevel]
LogLevel -> LogLevel -> LogLevel -> [LogLevel]
(LogLevel -> LogLevel)
-> (LogLevel -> LogLevel)
-> (Int -> LogLevel)
-> (LogLevel -> Int)
-> (LogLevel -> [LogLevel])
-> (LogLevel -> LogLevel -> [LogLevel])
-> (LogLevel -> LogLevel -> [LogLevel])
-> (LogLevel -> LogLevel -> LogLevel -> [LogLevel])
-> Enum LogLevel
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 :: LogLevel -> LogLevel
succ :: LogLevel -> LogLevel
$cpred :: LogLevel -> LogLevel
pred :: LogLevel -> LogLevel
$ctoEnum :: Int -> LogLevel
toEnum :: Int -> LogLevel
$cfromEnum :: LogLevel -> Int
fromEnum :: LogLevel -> Int
$cenumFrom :: LogLevel -> [LogLevel]
enumFrom :: LogLevel -> [LogLevel]
$cenumFromThen :: LogLevel -> LogLevel -> [LogLevel]
enumFromThen :: LogLevel -> LogLevel -> [LogLevel]
$cenumFromTo :: LogLevel -> LogLevel -> [LogLevel]
enumFromTo :: LogLevel -> LogLevel -> [LogLevel]
$cenumFromThenTo :: LogLevel -> LogLevel -> LogLevel -> [LogLevel]
enumFromThenTo :: LogLevel -> LogLevel -> LogLevel -> [LogLevel]
Enum)
instance ToJSON LogLevel where
toJSON :: LogLevel -> Value
toJSON LogLevel
p= Text -> Value
String (Text -> Value) -> Text -> Value
forall a b. (a -> b) -> a -> b
$ case LogLevel
p of
LogLevel
LogOff -> Text
"OFF"
LogLevel
LogSevere -> Text
"SEVERE"
LogLevel
LogWarning -> Text
"WARNING"
LogLevel
LogInfo -> Text
"INFO"
LogLevel
LogConfig -> Text
"CONFIG"
LogLevel
LogFine -> Text
"FINE"
LogLevel
LogFiner -> Text
"FINER"
LogLevel
LogFinest -> Text
"FINEST"
LogLevel
LogDebug -> Text
"DEBUG"
LogLevel
LogAll -> Text
"ALL"
instance FromJSON LogLevel where
parseJSON :: Value -> Parser LogLevel
parseJSON (String Text
s) = case Text
s of
Text
"OFF" -> LogLevel -> Parser LogLevel
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return LogLevel
LogOff
Text
"SEVERE" -> LogLevel -> Parser LogLevel
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return LogLevel
LogSevere
Text
"WARNING" -> LogLevel -> Parser LogLevel
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return LogLevel
LogWarning
Text
"INFO" -> LogLevel -> Parser LogLevel
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return LogLevel
LogInfo
Text
"CONFIG" -> LogLevel -> Parser LogLevel
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return LogLevel
LogConfig
Text
"FINE" -> LogLevel -> Parser LogLevel
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return LogLevel
LogFine
Text
"FINER" -> LogLevel -> Parser LogLevel
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return LogLevel
LogFiner
Text
"FINEST" -> LogLevel -> Parser LogLevel
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return LogLevel
LogFinest
Text
"DEBUG" -> LogLevel -> Parser LogLevel
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return LogLevel
LogDebug
Text
"ALL" -> LogLevel -> Parser LogLevel
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return LogLevel
LogAll
Text
_ -> String -> Parser LogLevel
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Invalid logging preference: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
s)
parseJSON Value
other = String -> Value -> Parser LogLevel
forall a. String -> Value -> Parser a
typeMismatch String
"LogLevel" Value
other