{-# LANGUAGE PatternSynonyms #-}

module Network.QUIC.Types.Error where

import qualified Network.TLS as TLS
import Network.TLS.QUIC

-- | Transport errors of QUIC.
newtype TransportError = TransportError Int deriving (TransportError -> TransportError -> Bool
(TransportError -> TransportError -> Bool)
-> (TransportError -> TransportError -> Bool) -> Eq TransportError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TransportError -> TransportError -> Bool
$c/= :: TransportError -> TransportError -> Bool
== :: TransportError -> TransportError -> Bool
$c== :: TransportError -> TransportError -> Bool
Eq, Int -> TransportError -> ShowS
[TransportError] -> ShowS
TransportError -> String
(Int -> TransportError -> ShowS)
-> (TransportError -> String)
-> ([TransportError] -> ShowS)
-> Show TransportError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransportError] -> ShowS
$cshowList :: [TransportError] -> ShowS
show :: TransportError -> String
$cshow :: TransportError -> String
showsPrec :: Int -> TransportError -> ShowS
$cshowsPrec :: Int -> TransportError -> ShowS
Show)

pattern NoError                 :: TransportError
pattern $bNoError :: TransportError
$mNoError :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
NoError                  = TransportError  0x0

pattern InternalError           :: TransportError
pattern $bInternalError :: TransportError
$mInternalError :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
InternalError            = TransportError  0x1

pattern ConnectionRefused       :: TransportError
pattern $bConnectionRefused :: TransportError
$mConnectionRefused :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
ConnectionRefused        = TransportError  0x2

pattern FlowControlError        :: TransportError
pattern $bFlowControlError :: TransportError
$mFlowControlError :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
FlowControlError         = TransportError  0x3

pattern StreamLimitError        :: TransportError
pattern $bStreamLimitError :: TransportError
$mStreamLimitError :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
StreamLimitError         = TransportError  0x4

pattern StreamStateError        :: TransportError
pattern $bStreamStateError :: TransportError
$mStreamStateError :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
StreamStateError         = TransportError  0x5

pattern FinalSizeError          :: TransportError
pattern $bFinalSizeError :: TransportError
$mFinalSizeError :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
FinalSizeError           = TransportError  0x6

pattern FrameEncodingError      :: TransportError
pattern $bFrameEncodingError :: TransportError
$mFrameEncodingError :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
FrameEncodingError       = TransportError  0x7

pattern TransportParameterError :: TransportError
pattern $bTransportParameterError :: TransportError
$mTransportParameterError :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
TransportParameterError  = TransportError  0x8

pattern ConnectionIdLimitError  :: TransportError
pattern $bConnectionIdLimitError :: TransportError
$mConnectionIdLimitError :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
ConnectionIdLimitError   = TransportError  0x9

pattern ProtocolViolation       :: TransportError
pattern $bProtocolViolation :: TransportError
$mProtocolViolation :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
ProtocolViolation        = TransportError  0xa

pattern InvalidToken            :: TransportError
pattern $bInvalidToken :: TransportError
$mInvalidToken :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
InvalidToken             = TransportError  0xb

pattern ApplicationError        :: TransportError
pattern $bApplicationError :: TransportError
$mApplicationError :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
ApplicationError         = TransportError  0xc

pattern CryptoBufferExceeded    :: TransportError
pattern $bCryptoBufferExceeded :: TransportError
$mCryptoBufferExceeded :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
CryptoBufferExceeded     = TransportError  0xd

pattern KeyUpdateError          :: TransportError
pattern $bKeyUpdateError :: TransportError
$mKeyUpdateError :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
KeyUpdateError           = TransportError  0xe

pattern AeadLimitReached        :: TransportError
pattern $bAeadLimitReached :: TransportError
$mAeadLimitReached :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
AeadLimitReached         = TransportError  0xf

pattern NoViablePath            :: TransportError
pattern $bNoViablePath :: TransportError
$mNoViablePath :: forall r. TransportError -> (Void# -> r) -> (Void# -> r) -> r
NoViablePath             = TransportError 0x10

-- | Converting a TLS alert to a corresponding transport error.
cryptoError :: TLS.AlertDescription -> TransportError
cryptoError :: AlertDescription -> TransportError
cryptoError AlertDescription
ad = Int -> TransportError
TransportError Int
ec
  where
    ec :: Int
ec = Int
0x100 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (AlertDescription -> Word8
fromAlertDescription AlertDescription
ad)

-- | Application protocol errors of QUIC.
newtype ApplicationProtocolError = ApplicationProtocolError Int deriving (ApplicationProtocolError -> ApplicationProtocolError -> Bool
(ApplicationProtocolError -> ApplicationProtocolError -> Bool)
-> (ApplicationProtocolError -> ApplicationProtocolError -> Bool)
-> Eq ApplicationProtocolError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ApplicationProtocolError -> ApplicationProtocolError -> Bool
$c/= :: ApplicationProtocolError -> ApplicationProtocolError -> Bool
== :: ApplicationProtocolError -> ApplicationProtocolError -> Bool
$c== :: ApplicationProtocolError -> ApplicationProtocolError -> Bool
Eq, Int -> ApplicationProtocolError -> ShowS
[ApplicationProtocolError] -> ShowS
ApplicationProtocolError -> String
(Int -> ApplicationProtocolError -> ShowS)
-> (ApplicationProtocolError -> String)
-> ([ApplicationProtocolError] -> ShowS)
-> Show ApplicationProtocolError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ApplicationProtocolError] -> ShowS
$cshowList :: [ApplicationProtocolError] -> ShowS
show :: ApplicationProtocolError -> String
$cshow :: ApplicationProtocolError -> String
showsPrec :: Int -> ApplicationProtocolError -> ShowS
$cshowsPrec :: Int -> ApplicationProtocolError -> ShowS
Show)