{- |
Module      :  Servant.Checked.Exceptions.Internal.Verbs

Copyright   :  Dennis Gosnell 2017
License     :  BSD3

Maintainer  :  Dennis Gosnell (cdep.illabout@gmail.com)
Stability   :  experimental
Portability :  unknown

This module defines the 'Throws' and 'Throwing' types.
-}

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}

module Servant.Checked.Exceptions.Internal.Verbs where


import Data.Typeable (Typeable)
import GHC.Generics (Generic)
import GHC.TypeLits (Nat)
import Network.HTTP.Types (StdMethod(DELETE, GET, PATCH, POST, PUT))

data VerbWithErr
    (method :: k1)
    (successStatusCode :: Nat)
    (contentTypes :: [*])
    (es :: [*])
    a
  deriving (Generic, Typeable)

type GetWithErr    = VerbWithErr 'GET    200
type PostWithErr   = VerbWithErr 'POST   200
type PutWithErr    = VerbWithErr 'PUT    200
type DeleteWithErr = VerbWithErr 'DELETE 200
type PatchWithErr  = VerbWithErr 'PATCH  200

type PostCreatedWithErr = VerbWithErr 'POST 201

type GetAcceptedWithErr    = VerbWithErr 'GET 202
type PostAcceptedWithErr   = VerbWithErr 'POST 202
type DeleteAcceptedWithErr = VerbWithErr 'DELETE 202
type PatchAcceptedWithErr  = VerbWithErr 'PATCH 202
type PutAcceptedWithErr    = VerbWithErr 'PUT 202

type GetNonAuthoritativeWithErr    = VerbWithErr 'GET 203
type PostNonAuthoritativeWithErr   = VerbWithErr 'POST 203
type DeleteNonAuthoritativeWithErr = VerbWithErr 'DELETE 203
type PatchNonAuthoritativeWithErr  = VerbWithErr 'PATCH 203
type PutNonAuthoritativeWithErr    = VerbWithErr 'PUT 203

type GetNoContentWithErr    = VerbWithErr 'GET 204
type PostNoContentWithErr   = VerbWithErr 'POST 204
type DeleteNoContentWithErr = VerbWithErr 'DELETE 204
type PatchNoContentWithErr  = VerbWithErr 'PATCH 204
type PutNoContentWithErr    = VerbWithErr 'PUT 204

type GetResetContentWithErr    = VerbWithErr 'GET 205
type PostResetContentWithErr   = VerbWithErr 'POST 205
type DeleteResetContentWithErr = VerbWithErr 'DELETE 205
type PatchResetContentWithErr  = VerbWithErr 'PATCH 205
type PutResetContentWithErr    = VerbWithErr 'PUT 205

type GetPartialContentWithErr = VerbWithErr 'GET 206