module Network.QUIC.Types.Exception where

import qualified Network.TLS as TLS
import qualified UnliftIO.Exception as E

import Network.QUIC.Imports
import Network.QUIC.Types.Error
import Network.QUIC.Types.Frame
import Network.QUIC.Types.Packet

-- | User level exceptions for QUIC.
data QUICException
    = ConnectionIsClosed -- NoError
    | TransportErrorIsReceived TransportError ReasonPhrase
    | TransportErrorIsSent TransportError ReasonPhrase
    | ApplicationProtocolErrorIsReceived ApplicationProtocolError ReasonPhrase
    | ApplicationProtocolErrorIsSent ApplicationProtocolError ReasonPhrase
    | ConnectionIsTimeout String
    | ConnectionIsReset
    | StreamIsClosed
    | HandshakeFailed TLS.AlertDescription -- failed in my side
    | VersionIsUnknown Word32
    | NoVersionIsSpecified
    | VersionNegotiationFailed
    | BadThingHappen E.SomeException
    deriving (Int -> QUICException -> ShowS
[QUICException] -> ShowS
QUICException -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [QUICException] -> ShowS
$cshowList :: [QUICException] -> ShowS
show :: QUICException -> String
$cshow :: QUICException -> String
showsPrec :: Int -> QUICException -> ShowS
$cshowsPrec :: Int -> QUICException -> ShowS
Show)

instance E.Exception QUICException

data InternalControl
    = MustNotReached
    | ExitConnection
    | WrongTransportParameter
    | WrongVersionInformation
    | BreakForever
    deriving (InternalControl -> InternalControl -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: InternalControl -> InternalControl -> Bool
$c/= :: InternalControl -> InternalControl -> Bool
== :: InternalControl -> InternalControl -> Bool
$c== :: InternalControl -> InternalControl -> Bool
Eq, Int -> InternalControl -> ShowS
[InternalControl] -> ShowS
InternalControl -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InternalControl] -> ShowS
$cshowList :: [InternalControl] -> ShowS
show :: InternalControl -> String
$cshow :: InternalControl -> String
showsPrec :: Int -> InternalControl -> ShowS
$cshowsPrec :: Int -> InternalControl -> ShowS
Show)

instance E.Exception InternalControl

newtype NextVersion = NextVersion VersionInfo deriving (Int -> NextVersion -> ShowS
[NextVersion] -> ShowS
NextVersion -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NextVersion] -> ShowS
$cshowList :: [NextVersion] -> ShowS
show :: NextVersion -> String
$cshow :: NextVersion -> String
showsPrec :: Int -> NextVersion -> ShowS
$cshowsPrec :: Int -> NextVersion -> ShowS
Show)

instance E.Exception NextVersion

data Abort
    = Abort ApplicationProtocolError ReasonPhrase
    | VerNego VersionInfo
    deriving (Int -> Abort -> ShowS
[Abort] -> ShowS
Abort -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Abort] -> ShowS
$cshowList :: [Abort] -> ShowS
show :: Abort -> String
$cshow :: Abort -> String
showsPrec :: Int -> Abort -> ShowS
$cshowsPrec :: Int -> Abort -> ShowS
Show)

instance E.Exception Abort where
    fromException :: SomeException -> Maybe Abort
fromException = forall e. Exception e => SomeException -> Maybe e
E.asyncExceptionFromException
    toException :: Abort -> SomeException
toException = forall e. Exception e => e -> SomeException
E.asyncExceptionToException