-- | These are the fundamental types that are used for building
-- everything else.  Specifically, these types are used by the
-- Network.Mattermost.Types.Internal, but are not subject to the
-- cautions that as associated with the latter.

module Network.Mattermost.Types.Base where

import qualified Data.Aeson as A
import           Data.Text (Text)
import           Data.Time.Clock ( UTCTime )
import           Network.HTTP.Base (RequestMethod)

type Hostname = Text
type Port     = Int

-- | A 'Logger' is any function which responds to log events:
type Logger = LogEvent -> IO ()

-- | If there is a 'Logger' in the 'ConnectionData' struct, it will
--   be sporadically called with values of type 'LogEvent'.
data LogEvent = LogEvent
  { LogEvent -> String
logFunction  :: String
  , LogEvent -> LogEventType
logEventType :: LogEventType
  } deriving (LogEvent -> LogEvent -> Bool
(LogEvent -> LogEvent -> Bool)
-> (LogEvent -> LogEvent -> Bool) -> Eq LogEvent
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: LogEvent -> LogEvent -> Bool
$c/= :: LogEvent -> LogEvent -> Bool
== :: LogEvent -> LogEvent -> Bool
$c== :: LogEvent -> LogEvent -> Bool
Eq, Int -> LogEvent -> ShowS
[LogEvent] -> ShowS
LogEvent -> String
(Int -> LogEvent -> ShowS)
-> (LogEvent -> String) -> ([LogEvent] -> ShowS) -> Show LogEvent
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LogEvent] -> ShowS
$cshowList :: [LogEvent] -> ShowS
show :: LogEvent -> String
$cshow :: LogEvent -> String
showsPrec :: Int -> LogEvent -> ShowS
$cshowsPrec :: Int -> LogEvent -> ShowS
Show)

-- | A 'LogEventType' describes the particular event that happened
data LogEventType
  = HttpRequest RequestMethod String (Maybe String)
  | HttpResponse Int String (Maybe String)
  | WebSocketRequest A.Value
  | WebSocketResponse (Either String String)
  -- ^ Left means we got an exception trying to parse the response;
  -- Right means we succeeded and here it is.
  | WebSocketPing
  | WebSocketPong
    deriving (LogEventType -> LogEventType -> Bool
(LogEventType -> LogEventType -> Bool)
-> (LogEventType -> LogEventType -> Bool) -> Eq LogEventType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: LogEventType -> LogEventType -> Bool
$c/= :: LogEventType -> LogEventType -> Bool
== :: LogEventType -> LogEventType -> Bool
$c== :: LogEventType -> LogEventType -> Bool
Eq, Int -> LogEventType -> ShowS
[LogEventType] -> ShowS
LogEventType -> String
(Int -> LogEventType -> ShowS)
-> (LogEventType -> String)
-> ([LogEventType] -> ShowS)
-> Show LogEventType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LogEventType] -> ShowS
$cshowList :: [LogEventType] -> ShowS
show :: LogEventType -> String
$cshow :: LogEventType -> String
showsPrec :: Int -> LogEventType -> ShowS
$cshowsPrec :: Int -> LogEventType -> ShowS
Show)


-- | The time as provided by the Server.  This is a wrapper designed
-- to warn against naive comparisons to local times: the server's time
-- and local times are not necessarily synchronized.

newtype ServerTime = ServerTime { ServerTime -> UTCTime
withServerTime :: UTCTime }
    deriving (ServerTime -> ServerTime -> Bool
(ServerTime -> ServerTime -> Bool)
-> (ServerTime -> ServerTime -> Bool) -> Eq ServerTime
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ServerTime -> ServerTime -> Bool
$c/= :: ServerTime -> ServerTime -> Bool
== :: ServerTime -> ServerTime -> Bool
$c== :: ServerTime -> ServerTime -> Bool
Eq, Eq ServerTime
Eq ServerTime
-> (ServerTime -> ServerTime -> Ordering)
-> (ServerTime -> ServerTime -> Bool)
-> (ServerTime -> ServerTime -> Bool)
-> (ServerTime -> ServerTime -> Bool)
-> (ServerTime -> ServerTime -> Bool)
-> (ServerTime -> ServerTime -> ServerTime)
-> (ServerTime -> ServerTime -> ServerTime)
-> Ord ServerTime
ServerTime -> ServerTime -> Bool
ServerTime -> ServerTime -> Ordering
ServerTime -> ServerTime -> ServerTime
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
min :: ServerTime -> ServerTime -> ServerTime
$cmin :: ServerTime -> ServerTime -> ServerTime
max :: ServerTime -> ServerTime -> ServerTime
$cmax :: ServerTime -> ServerTime -> ServerTime
>= :: ServerTime -> ServerTime -> Bool
$c>= :: ServerTime -> ServerTime -> Bool
> :: ServerTime -> ServerTime -> Bool
$c> :: ServerTime -> ServerTime -> Bool
<= :: ServerTime -> ServerTime -> Bool
$c<= :: ServerTime -> ServerTime -> Bool
< :: ServerTime -> ServerTime -> Bool
$c< :: ServerTime -> ServerTime -> Bool
compare :: ServerTime -> ServerTime -> Ordering
$ccompare :: ServerTime -> ServerTime -> Ordering
$cp1Ord :: Eq ServerTime
Ord, ReadPrec [ServerTime]
ReadPrec ServerTime
Int -> ReadS ServerTime
ReadS [ServerTime]
(Int -> ReadS ServerTime)
-> ReadS [ServerTime]
-> ReadPrec ServerTime
-> ReadPrec [ServerTime]
-> Read ServerTime
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ServerTime]
$creadListPrec :: ReadPrec [ServerTime]
readPrec :: ReadPrec ServerTime
$creadPrec :: ReadPrec ServerTime
readList :: ReadS [ServerTime]
$creadList :: ReadS [ServerTime]
readsPrec :: Int -> ReadS ServerTime
$creadsPrec :: Int -> ReadS ServerTime
Read, Int -> ServerTime -> ShowS
[ServerTime] -> ShowS
ServerTime -> String
(Int -> ServerTime -> ShowS)
-> (ServerTime -> String)
-> ([ServerTime] -> ShowS)
-> Show ServerTime
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ServerTime] -> ShowS
$cshowList :: [ServerTime] -> ShowS
show :: ServerTime -> String
$cshow :: ServerTime -> String
showsPrec :: Int -> ServerTime -> ShowS
$cshowsPrec :: Int -> ServerTime -> ShowS
Show)