module Database.Bolt.Exception
    ( internalErr
    , transportErr
    , protocolErr
    , authFail
    , reqFail
    , reqIgnore
    ) where

import           Control.Exception
import           Data.Text           (Text)
import           Database.Bolt.Types

data BoltException = AuthenticationFailure Text
                   | RequestFailure Object Text
                   | RequestIgnored Object Text
                   | InternalError Text
                   | TransportError Text
                   | ProtocolError Text
    deriving (Show)

instance Exception BoltException

authFail :: Text -> IO a
authFail = throwIO . AuthenticationFailure

reqFail :: Object -> Text -> IO a
reqFail meta = throwIO . RequestFailure meta

reqIgnore :: Object -> Text -> IO a
reqIgnore meta = throwIO . RequestIgnored meta

internalErr :: Text -> IO a
internalErr = throwIO . InternalError

transportErr :: Text -> IO a
transportErr = throwIO . TransportError

protocolErr :: Text -> IO a
protocolErr = throwIO . ProtocolError