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)
data Scheme =
Http
| Https
deriving (Show, Eq, Ord, Generic)
instance Hashable Scheme where
hashWithSalt s Http = hashWithSalt s (0 :: Int)
hashWithSalt s Https = hashWithSalt s (1 :: Int)
data BaseUrl = BaseUrl
{ baseUrlScheme :: Scheme
, baseUrlHost :: String
, baseUrlPort :: Int
} deriving (Show, Eq, Ord, Generic)
instance Hashable BaseUrl where
hashWithSalt s (BaseUrl sc h p) = hashWithSalt s (sc, h, p)