servant-haxl-client-0.2.0.0: src/Servant/Haxl/Client/Types.hs
{-# LANGUAGE DeriveGeneric #-}
module Servant.Haxl.Client.Types
( ServantError(..)
, ServantConnectionError
, Req(..)
, WantedStatusCodes(..)
, Scheme(..)
, BaseUrl(..)
) where
import Control.Exception
import Data.ByteString.Lazy
import Data.Hashable
import Data.Text
import GHC.Generics
import Network.HTTP.Media
import Network.HTTP.Types
import Servant.Haxl.Client.Internal.Error
data ServantError
= FailureResponse
{ responseStatus :: Status
, responseContentType :: MediaType
, responseBody :: ByteString
}
| DecodeFailure
{ decodeError :: String
, responseContentType :: MediaType
, responseBody :: ByteString
}
| UnsupportedContentType
{ responseContentType :: MediaType
, responseBody :: ByteString
}
| ConnectionError
{ connectionError :: ServantConnectionError
}
| InvalidContentTypeHeader
{ responseContentTypeHeader :: ByteString
, responseBody :: ByteString
}
deriving (Show)
instance Exception ServantError where
data Req = Req
{ reqPath :: String
, qs :: QueryText
, reqBody :: Maybe (ByteString, MediaType)
, reqAccept :: [MediaType]
, headers :: [(String, Text)]
} deriving (Show, Eq, Ord, Generic)
instance Hashable Req where
hashWithSalt s (Req p q b a h) = hashWithSalt s (p, q, bHash, aHash, h)
where
hashMediaType m = hashWithSalt s (show m)
bHash = fmap (fmap hashMediaType) b
aHash = fmap hashMediaType a
data WantedStatusCodes = AllCodes | SelectCodes [Int]
deriving (Show, Eq, Ord, Generic)
instance Hashable WantedStatusCodes where
hashWithSalt s AllCodes = hashWithSalt s (0::Int)
hashWithSalt s (SelectCodes codes) = hashWithSalt s (1::Int, codes)
-- | URI scheme to use
data Scheme =
Http -- ^ http://
| Https -- ^ https://
deriving (Show, Eq, Ord, Generic)
instance Hashable Scheme where
hashWithSalt s Http = hashWithSalt s (0 :: Int)
hashWithSalt s Https = hashWithSalt s (1 :: Int)
-- | Simple data type to represent the target of HTTP requests
-- for servant's automatically-generated clients.
data BaseUrl = BaseUrl
{ baseUrlScheme :: Scheme -- ^ URI scheme to use
, baseUrlHost :: String -- ^ host (eg "haskell.org")
, baseUrlPort :: Int -- ^ port (eg 80)
} deriving (Show, Eq, Ord, Generic)
instance Hashable BaseUrl where
hashWithSalt s (BaseUrl sc h p) = hashWithSalt s (sc, h, p)