packages feed

minion-0.1.0.0: src/Web/Minion/Error.hs

module Web.Minion.Error (MonadThrow (..), module Web.Minion.Error) where

import Control.Exception
import Control.Monad.Catch (MonadThrow (..))
import Data.ByteString qualified as Bytes
import Data.ByteString.Lazy qualified as Bytes.Lazy
import Network.HTTP.Types qualified as Http
import Network.Wai qualified as Wai

data NoMatch = NoMatch
  deriving (Show, Exception)

type ErrorBuilder = Wai.Request -> Http.Status -> Bytes.Lazy.ByteString -> ServerError

type TextToError = Bytes.Lazy.ByteString -> ServerError

data SomethingWentWrong = SomethingWentWrong
  deriving (Show, Exception)

data ErrorBuilders = ErrorBuilders
  { headerErrorBuilder :: ErrorBuilder
  , queryParamsErrorBuilder :: ErrorBuilder
  , captureErrorBuilder :: ErrorBuilder
  , bodyErrorBuilder :: ErrorBuilder
  }

data ServerError = ServerError
  { code :: Http.Status
  , headers :: [Http.Header]
  , body :: Bytes.Lazy.ByteString
  }
  deriving (Show, Exception)

codeOf :: ServerError -> Http.Status
codeOf ServerError{..} = code

redirect :: (MonadThrow m) => Bytes.ByteString -> m a
redirect url = throwM $ found{headers = [("Location", url)]}

err300 :: ServerError
err300 = ServerError Http.status300 [] mempty

err301 :: ServerError
err301 = ServerError Http.status301 [] mempty

err302 :: ServerError
err302 = ServerError Http.status302 [] mempty

err303 :: ServerError
err303 = ServerError Http.status303 [] mempty

err304 :: ServerError
err304 = ServerError Http.status304 [] mempty

err305 :: ServerError
err305 = ServerError Http.status305 [] mempty

err307 :: ServerError
err307 = ServerError Http.status307 [] mempty

err400 :: ServerError
err400 = ServerError Http.status400 [] mempty

err401 :: ServerError
err401 = ServerError Http.status401 [] mempty

err402 :: ServerError
err402 = ServerError Http.status402 [] mempty

err403 :: ServerError
err403 = ServerError Http.status403 [] mempty

err404 :: ServerError
err404 = ServerError Http.status404 [] mempty

err405 :: ServerError
err405 = ServerError Http.status405 [] mempty

err406 :: ServerError
err406 = ServerError Http.status406 [] mempty

err407 :: ServerError
err407 = ServerError Http.status407 [] mempty

err409 :: ServerError
err409 = ServerError Http.status409 [] mempty

err410 :: ServerError
err410 = ServerError Http.status410 [] mempty

err411 :: ServerError
err411 = ServerError Http.status411 [] mempty

err412 :: ServerError
err412 = ServerError Http.status412 [] mempty

err413 :: ServerError
err413 = ServerError Http.status413 [] mempty

err414 :: ServerError
err414 = ServerError Http.status414 [] mempty

err415 :: ServerError
err415 = ServerError Http.status415 [] mempty

err416 :: ServerError
err416 = ServerError Http.status416 [] mempty

err417 :: ServerError
err417 = ServerError Http.status417 [] mempty

err418 :: ServerError
err418 = ServerError Http.status418 [] mempty

err422 :: ServerError
err422 = ServerError Http.status422 [] mempty

err500 :: ServerError
err500 = ServerError Http.status500 [] mempty

err501 :: ServerError
err501 = ServerError Http.status501 [] mempty

err502 :: ServerError
err502 = ServerError Http.status502 [] mempty

err503 :: ServerError
err503 = ServerError Http.status503 [] mempty

err504 :: ServerError
err504 = ServerError Http.status504 [] mempty

err505 :: ServerError
err505 = ServerError Http.status505 [] mempty

multipleChoices :: ServerError
multipleChoices = err300

movedPermanently :: ServerError
movedPermanently = err301

found :: ServerError
found = err302

seeOther :: ServerError
seeOther = err303

notModified :: ServerError
notModified = err304

useProxy :: ServerError
useProxy = err305

temporaryRedirect :: ServerError
temporaryRedirect = err307

badRequest :: ServerError
badRequest = err400

unauthorized :: ServerError
unauthorized = err401

paymentRequired :: ServerError
paymentRequired = err402

forbidden :: ServerError
forbidden = err403

notFound :: ServerError
notFound = err404

methodNotAllowed :: ServerError
methodNotAllowed = err405

notAcceptable :: ServerError
notAcceptable = err406

proxyAuthenticationRequired :: ServerError
proxyAuthenticationRequired = err407

conflict :: ServerError
conflict = err409

gone :: ServerError
gone = err410

lengthRequired :: ServerError
lengthRequired = err411

preconditionFailed :: ServerError
preconditionFailed = err412

requestEntityTooLarge :: ServerError
requestEntityTooLarge = err413

requestURITooLong :: ServerError
requestURITooLong = err414

unsupportedMediaType :: ServerError
unsupportedMediaType = err415

requestedRangeNotSatisfiable :: ServerError
requestedRangeNotSatisfiable = err416

expectationFailed :: ServerError
expectationFailed = err417

teapot :: ServerError
teapot = err418

unprocessableEntity :: ServerError
unprocessableEntity = err422

internalServerError :: ServerError
internalServerError = err500

notImplemented :: ServerError
notImplemented = err501

badGateway :: ServerError
badGateway = err502

serviceUnavailable :: ServerError
serviceUnavailable = err503

gatewayTimeout :: ServerError
gatewayTimeout = err504

httpVersionNotSupported :: ServerError
httpVersionNotSupported = err505