module Client.EventLoop.Errors
( exceptionToLines
) where
import Control.Exception (SomeException, Exception(displayException, fromException))
import Data.List.NonEmpty (NonEmpty(..))
import OpenSSL.Session (ConnectionAbruptlyTerminated, ProtocolError(ProtocolError))
import Hookup (ConnectionFailure(..))
exceptionToLines ::
SomeException ->
NonEmpty String
exceptionToLines :: SomeException -> NonEmpty String
exceptionToLines
= NonEmpty String -> NonEmpty String
indentMessages
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeException -> NonEmpty String
exceptionToLines'
indentMessages :: NonEmpty String -> NonEmpty String
indentMessages :: NonEmpty String -> NonEmpty String
indentMessages (String
x :| [String]
xs) = String
x forall a. a -> [a] -> NonEmpty a
:| forall a b. (a -> b) -> [a] -> [b]
map (String
"⋯ "forall a. [a] -> [a] -> [a]
++) [String]
xs
exceptionToLines' ::
SomeException ->
NonEmpty String
exceptionToLines' :: SomeException -> NonEmpty String
exceptionToLines' SomeException
ex
| Just ConnectionFailure
err <- forall e. Exception e => SomeException -> Maybe e
fromException SomeException
ex = ConnectionFailure -> NonEmpty String
explainHookupError ConnectionFailure
err
| Just ConnectionAbruptlyTerminated
_ <- forall e. Exception e => SomeException -> Maybe e
fromException SomeException
ex :: Maybe ConnectionAbruptlyTerminated =
String
"Connection abruptly terminated" forall a. a -> [a] -> NonEmpty a
:| []
| Just (ProtocolError String
e) <- forall e. Exception e => SomeException -> Maybe e
fromException SomeException
ex =
(String
"TLS protocol error: " forall a. [a] -> [a] -> [a]
++ String
e) forall a. a -> [a] -> NonEmpty a
:| []
| Just IOError
ioe <- forall e. Exception e => SomeException -> Maybe e
fromException SomeException
ex =
IOError -> String
explainIOError IOError
ioe forall a. a -> [a] -> NonEmpty a
:| []
| Bool
otherwise = forall e. Exception e => e -> String
displayException SomeException
ex forall a. a -> [a] -> NonEmpty a
:| []
explainIOError :: IOError -> String
explainIOError :: IOError -> String
explainIOError IOError
ioe = String
"IO error: " forall a. [a] -> [a] -> [a]
++ forall e. Exception e => e -> String
displayException IOError
ioe
explainHookupError :: ConnectionFailure -> NonEmpty String
explainHookupError :: ConnectionFailure -> NonEmpty String
explainHookupError ConnectionFailure
e =
case ConnectionFailure
e of
ConnectionFailure [ConnectError]
exs ->
String
"Connect failed" forall a. a -> [a] -> NonEmpty a
:| forall a b. (a -> b) -> [a] -> [b]
map forall e. Exception e => e -> String
displayException [ConnectError]
exs
ConnectionFailure
LineTooLong ->
String
"IRC message too long" forall a. a -> [a] -> NonEmpty a
:| []
ConnectionFailure
LineTruncated ->
String
"IRC message incomplete" forall a. a -> [a] -> NonEmpty a
:| []
ConnectionFailure
_ -> forall e. Exception e => e -> String
displayException ConnectionFailure
e forall a. a -> [a] -> NonEmpty a
:| []