{-# LINE 1 "src/System/Socket/Internal/Exception.hsc" #-}
{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving #-}
--------------------------------------------------------------------------------
-- |
-- Module      :  System.Socket.Internal.Exception
-- Copyright   :  (c) Lars Petersen 2015
-- License     :  MIT
--
-- Maintainer  :  info@lars-petersen.net
-- Stability   :  experimental
--------------------------------------------------------------------------------
module System.Socket.Internal.Exception
  ( SocketException (..)
  , eOk
  , eInterrupted
  , eBadFileDescriptor
  , ePermissionDenied
  , eInvalid
  , ePipe
  , eWouldBlock
  , eAgain
  , eNotSocket
  , eDestinationAddressRequired
  , eMessageSize
  , eProtocolType
  , eNoProtocolOption
  , eProtocolNotSupported
  , eSocketTypeNotSupported
  , eOperationNotSupported
  , eProtocolFamilyNotSupported
  , eAddressFamilyNotSupported
  , eAddressInUse
  , eAddressNotAvailable
  , eNetworkDown
  , eNetworkUnreachable
  , eNetworkReset
  , eConnectionAborted
  , eConnectionReset
  , eNoBufferSpace
  , eIsConnected
  , eNotConnected
  , eShutdown
  , eTooManyReferences
  , eTimedOut
  , eConnectionRefused
  , eHostDown
  , eHostUnreachable
  , eAlready
  , eInProgress
  ) where

import Control.Exception
import Data.Typeable
import Foreign.C.Types



-- | Contains the error code that can be matched against.
--
--   Hint: Use guards or @MultiWayIf@ to match against specific exceptions:
--
--   > if | e == eAddressInUse -> ...
--   >    | e == eAddressNotAvailable -> ...
--   >    | otherwise -> ...
newtype SocketException
      = SocketException CInt
  deriving (Typeable, Eq, Ord)

instance Exception SocketException

instance Show SocketException where
  show e
    | e == eOk                           = "eOk"
    | e == eInterrupted                  = "eInterrupted"
    | e == eBadFileDescriptor            = "eBadFileDescriptor"
    | e == ePermissionDenied             = "ePermissionDenied"
    | e == eInvalid                      = "eInvalid"
    | e == ePipe                         = "ePipe"
    | e == eWouldBlock                   = "eWouldBlock"
    | e == eAgain                        = "eAgain"
    | e == eNotSocket                    = "eNotSocket"
    | e == eDestinationAddressRequired   = "eDestinationAddressRequired"
    | e == eMessageSize                  = "eMessageSize"
    | e == eProtocolType                 = "eProtocolType"
    | e == eNoProtocolOption             = "eNoProtocolOption"
    | e == eProtocolNotSupported         = "eProtocolNotSupported"
    | e == eSocketTypeNotSupported       = "eSocketTypeNotSupported"
    | e == eOperationNotSupported        = "eOperationNotSupported"
    | e == eProtocolFamilyNotSupported   = "eProtocolFamilyNotSupported"
    | e == eAddressFamilyNotSupported    = "eAddressFamilyNotSupported"
    | e == eAddressInUse                 = "eAddressInUse"
    | e == eAddressNotAvailable          = "eAddressNotAvailable"
    | e == eNetworkDown                  = "eNetworkDown"
    | e == eNetworkUnreachable           = "eNetworkUnreachable"
    | e == eNetworkReset                 = "eNetworkReset"
    | e == eConnectionAborted            = "eConnectionAborted"
    | e == eConnectionReset              = "eConnectionReset"
    | e == eNoBufferSpace                = "eNoBufferSpace"
    | e == eIsConnected                  = "eIsConnected"
    | e == eNotConnected                 = "eNotConnected"
    | e == eShutdown                     = "eShutdown"
    | e == eTooManyReferences            = "eTooManyReferences"
    | e == eTimedOut                     = "eTimedOut"
    | e == eConnectionRefused            = "eConnectionRefused"
    | e == eHostDown                     = "eHostDown"
    | e == eHostUnreachable              = "eHostUnreachable"
    | e == eAlready                      = "eAlready"
    | e == eInProgress                   = "eInProgress"
    | otherwise                          = let SocketException n = e
                                           in "SocketException " ++ show n

-- | No error.
eOk                         :: SocketException
eOk                          = SocketException (0)
{-# LINE 114 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Interrupted system call.
--
--   NOTE: This exception shall not be thrown by any public operation in this
--   library, but is handled internally.
eInterrupted                :: SocketException
eInterrupted                 = SocketException (4)
{-# LINE 121 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Bad file descriptor.
eBadFileDescriptor          :: SocketException
eBadFileDescriptor           = SocketException (9)
{-# LINE 125 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Permission denied.
ePermissionDenied           :: SocketException
ePermissionDenied            = SocketException (13)
{-# LINE 129 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Invalid argument.
eInvalid                    :: SocketException
eInvalid                     = SocketException (22)
{-# LINE 133 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Broken pipe.
ePipe                       :: SocketException
ePipe                        = SocketException (32)
{-# LINE 137 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Resource temporarily unavailable.
--
--   NOTE: This exception shall not be thrown by any public operation in this
--   library, but is handled internally.
eWouldBlock                 :: SocketException
eWouldBlock                  = SocketException (11)
{-# LINE 144 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Resource temporarily unavailable.
eAgain                      :: SocketException
eAgain                       = SocketException (11)
{-# LINE 148 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Socket operation on non-socket.
--
--  NOTE: This should be ruled out by the type system.
eNotSocket                  :: SocketException
eNotSocket                   = SocketException (88)
{-# LINE 154 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Destination address required.
eDestinationAddressRequired :: SocketException
eDestinationAddressRequired  = SocketException (89)
{-# LINE 158 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Message too long.
eMessageSize                :: SocketException
eMessageSize                 = SocketException (90)
{-# LINE 162 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Protocol wrong type for socket.

--  NOTE: This should be ruled out by the type system.
eProtocolType               :: SocketException
eProtocolType                = SocketException (91)
{-# LINE 168 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Protocol not available.
eNoProtocolOption           :: SocketException
eNoProtocolOption            = SocketException (92)
{-# LINE 172 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Protocol not supported.
eProtocolNotSupported       :: SocketException
eProtocolNotSupported        = SocketException (93)
{-# LINE 176 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Socket type not supported.
eSocketTypeNotSupported     :: SocketException
eSocketTypeNotSupported      = SocketException (94)
{-# LINE 180 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Operation not supported.
eOperationNotSupported      :: SocketException
eOperationNotSupported       = SocketException (95)
{-# LINE 184 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Protocol family not supported.
eProtocolFamilyNotSupported :: SocketException
eProtocolFamilyNotSupported  = SocketException (96)
{-# LINE 188 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Address family not supported by protocol.
eAddressFamilyNotSupported  :: SocketException
eAddressFamilyNotSupported   = SocketException (97)
{-# LINE 192 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Address already in use.
eAddressInUse               :: SocketException
eAddressInUse                = SocketException (98)
{-# LINE 196 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Cannot assign requested address.
eAddressNotAvailable        :: SocketException
eAddressNotAvailable         = SocketException (99)
{-# LINE 200 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Network is down.
eNetworkDown                :: SocketException
eNetworkDown                 = SocketException (100)
{-# LINE 204 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Network is unreachable.
eNetworkUnreachable         :: SocketException
eNetworkUnreachable          = SocketException (101)
{-# LINE 208 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Network dropped connection on reset.
eNetworkReset               :: SocketException
eNetworkReset                = SocketException (102)
{-# LINE 212 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Software caused connection abort.
eConnectionAborted          :: SocketException
eConnectionAborted           = SocketException (103)
{-# LINE 216 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Connection reset by peer.
eConnectionReset            :: SocketException
eConnectionReset             = SocketException (104)
{-# LINE 220 "src/System/Socket/Internal/Exception.hsc" #-}

-- | No buffer space available.
eNoBufferSpace              :: SocketException
eNoBufferSpace               = SocketException (105)
{-# LINE 224 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Transport endpoint is already connected.
eIsConnected                :: SocketException
eIsConnected                 = SocketException (106)
{-# LINE 228 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Transport endpoint is not connected.
eNotConnected               :: SocketException
eNotConnected                = SocketException (107)
{-# LINE 232 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Cannot send after transport endpoint shutdown.
eShutdown                   :: SocketException
eShutdown                    = SocketException (108)
{-# LINE 236 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Too many references: cannot splice.
eTooManyReferences          :: SocketException
eTooManyReferences           = SocketException (109)
{-# LINE 240 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Connection timed out.
eTimedOut                   :: SocketException
eTimedOut                    = SocketException (110)
{-# LINE 244 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Connection refused.
eConnectionRefused          :: SocketException
eConnectionRefused           = SocketException (111)
{-# LINE 248 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Host is down.
eHostDown                   :: SocketException
eHostDown                    = SocketException (112)
{-# LINE 252 "src/System/Socket/Internal/Exception.hsc" #-}

-- | No route to host.
eHostUnreachable            :: SocketException
eHostUnreachable             = SocketException (113)
{-# LINE 256 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Operation already in progress.
--
--   NOTE: This exception shall not be thrown by any public operation in this
--   library, but is handled internally.
eAlready                    :: SocketException
eAlready                     = SocketException (114)
{-# LINE 263 "src/System/Socket/Internal/Exception.hsc" #-}

-- | Operation now in progress
eInProgress                 :: SocketException
eInProgress                  = SocketException (115)
{-# LINE 267 "src/System/Socket/Internal/Exception.hsc" #-}