-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Core functionality and class for client function generation for servant APIs -- -- This library provides backend-agnostic generation of client functions. -- For more information, see the README. @package servant-client-core @version 0.13 module Servant.Client.Core.Internal.BaseUrl -- | URI scheme to use data Scheme -- | http:// Http :: Scheme -- | https:// Https :: Scheme -- | Simple data type to represent the target of HTTP requests for -- servant's automatically-generated clients. data BaseUrl BaseUrl :: Scheme -> String -> Int -> String -> BaseUrl -- | URI scheme to use [baseUrlScheme] :: BaseUrl -> Scheme -- | host (eg "haskell.org") [baseUrlHost] :: BaseUrl -> String -- | port (eg 80) [baseUrlPort] :: BaseUrl -> Int -- | path (eg "ab/c") [baseUrlPath] :: BaseUrl -> String showBaseUrl :: BaseUrl -> String data InvalidBaseUrlException InvalidBaseUrlException :: String -> InvalidBaseUrlException parseBaseUrl :: MonadThrow m => String -> m BaseUrl instance GHC.Show.Show Servant.Client.Core.Internal.BaseUrl.InvalidBaseUrlException instance GHC.Generics.Generic Servant.Client.Core.Internal.BaseUrl.BaseUrl instance GHC.Classes.Ord Servant.Client.Core.Internal.BaseUrl.BaseUrl instance GHC.Show.Show Servant.Client.Core.Internal.BaseUrl.BaseUrl instance GHC.Generics.Generic Servant.Client.Core.Internal.BaseUrl.Scheme instance GHC.Classes.Ord Servant.Client.Core.Internal.BaseUrl.Scheme instance GHC.Classes.Eq Servant.Client.Core.Internal.BaseUrl.Scheme instance GHC.Show.Show Servant.Client.Core.Internal.BaseUrl.Scheme instance GHC.Exception.Exception Servant.Client.Core.Internal.BaseUrl.InvalidBaseUrlException instance GHC.Classes.Eq Servant.Client.Core.Internal.BaseUrl.BaseUrl module Servant.Client.Core.Internal.Generic -- | This class allows us to match client structure with client functions -- produced with client without explicit pattern-matching. -- -- The client structure needs a Generic instance. -- -- Example: -- --
--   type API
--       = "foo" :> Capture "x" Int :> Get '[JSON] Int
--    :<|> "bar" :> QueryParam "a" Char :> QueryParam "b" String :> Post '[JSON] [Int]
--    :<|> Capture "nested" Int :> NestedAPI
--   
--   type NestedAPI
--       = Get '[JSON] String
--    :<|> "baz" :> QueryParam "c" Char :> Post '[JSON] ()
--   
--   data APIClient = APIClient
--     { getFoo         :: Int -> ClientM Int
--     , postBar        :: Maybe Char -> Maybe String -> ClientM [Int]
--     , mkNestedClient :: Int -> NestedClient
--     } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic APIClient
--   instance (Client API ~ client) => ClientLike client APIClient
--   
--   data NestedClient = NestedClient
--    { getString :: ClientM String
--    , postBaz   :: Maybe Char -> ClientM ()
--    } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic NestedClient
--   instance (Client NestedAPI ~ client) => ClientLike client NestedClient
--   
--   mkAPIClient :: APIClient
--   mkAPIClient = mkClient (client (Proxy :: Proxy API))
--   
-- -- By default, left-nested alternatives are expanded: -- --
--   type API1
--       = "foo" :> Capture "x" Int :> Get '[JSON] Int
--    :<|> "bar" :> QueryParam "a" Char :> Post '[JSON] String
--   
--   type API2
--       = "baz" :> QueryParam "c" Char :> Post '[JSON] ()
--   
--   type API = API1 :<|> API2
--   
--   data APIClient = APIClient
--     { getFoo  :: Int -> ClientM Int
--     , postBar :: Maybe Char -> ClientM String
--     , postBaz :: Maybe Char -> ClientM ()
--     } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic APIClient
--   instance (Client API ~ client) => ClientLike client APIClient
--   
--   mkAPIClient :: APIClient
--   mkAPIClient = mkClient (client (Proxy :: Proxy API))
--   
-- -- If you want to define client for API1 as a separate data -- structure, you can use genericMkClientP: -- --
--   data APIClient1 = APIClient1
--     { getFoo  :: Int -> ClientM Int
--     , postBar :: Maybe Char -> ClientM String
--     } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic APIClient1
--   instance (Client API1 ~ client) => ClientLike client APIClient1
--   
--   data APIClient = APIClient
--     { mkAPIClient1 :: APIClient1
--     , postBaz      :: Maybe Char -> ClientM ()
--     } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic APIClient
--   instance (Client API ~ client) => ClientLike client APIClient where
--     mkClient = genericMkClientP
--   
--   mkAPIClient :: APIClient
--   mkAPIClient = mkClient (client (Proxy :: Proxy API))
--   
class ClientLike client custom mkClient :: ClientLike client custom => client -> custom mkClient :: (ClientLike client custom, Generic custom, Code custom ~ '[xs], GClientList client '[], GClientLikeL (ClientList client '[]) xs) => client -> custom -- | Match client structure with client functions, regarding left-nested -- API clients as separate data structures. class GClientLikeP client xs gMkClientP :: GClientLikeP client xs => client -> NP I xs -- | Match client structure with client functions, expanding left-nested -- API clients in the same structure. class GClientLikeL (xs :: [*]) (ys :: [*]) gMkClientL :: GClientLikeL xs ys => NP I xs -> NP I ys class GClientList client (acc :: [*]) gClientList :: GClientList client acc => client -> NP I acc -> NP I (ClientList client acc) -- | Generate client structure from client type, expanding left-nested API -- (done by default). genericMkClientL :: (Generic custom, Code custom ~ '[xs], GClientList client '[], GClientLikeL (ClientList client '[]) xs) => client -> custom -- | Generate client structure from client type, regarding left-nested API -- clients as separate data structures. genericMkClientP :: (Generic custom, Code custom ~ '[xs], GClientLikeP client xs) => client -> custom instance Servant.Client.Core.Internal.Generic.ClientLike client custom => Servant.Client.Core.Internal.Generic.ClientLike (a -> client) (a -> custom) instance (Servant.Client.Core.Internal.Generic.GClientLikeP b (y : xs), Servant.Client.Core.Internal.Generic.ClientLike a x) => Servant.Client.Core.Internal.Generic.GClientLikeP (a Servant.API.Alternative.:<|> b) (x : y : xs) instance Servant.Client.Core.Internal.Generic.ClientLike a x => Servant.Client.Core.Internal.Generic.GClientLikeP a '[x] instance (Servant.Client.Core.Internal.Generic.ClientLike x y, Servant.Client.Core.Internal.Generic.GClientLikeL xs ys) => Servant.Client.Core.Internal.Generic.GClientLikeL (x : xs) (y : ys) instance (Servant.Client.Core.Internal.Generic.GClientList b acc, Servant.Client.Core.Internal.Generic.GClientList a (Servant.Client.Core.Internal.Generic.ClientList b acc)) => Servant.Client.Core.Internal.Generic.GClientList (a Servant.API.Alternative.:<|> b) acc instance Servant.Client.Core.Internal.Generic.ClientList client acc ~ (client : acc) => Servant.Client.Core.Internal.Generic.GClientList client acc instance Servant.Client.Core.Internal.Generic.GClientLikeL '[] '[] module Servant.Client.Core.Internal.Request -- | A type representing possible errors in a request -- -- Note that this type substantially changed in 0.12. data ServantError -- | The server returned an error response FailureResponse :: Response -> ServantError -- | The body could not be decoded at the expected type DecodeFailure :: Text -> Response -> ServantError -- | The content-type of the response is not supported UnsupportedContentType :: MediaType -> Response -> ServantError -- | The content-type header is invalid InvalidContentTypeHeader :: Response -> ServantError -- | There was a connection error, and no response was received ConnectionError :: Text -> ServantError data RequestF a Request :: a -> Seq QueryItem -> Maybe (RequestBody, MediaType) -> Seq MediaType -> Seq Header -> HttpVersion -> Method -> RequestF a [requestPath] :: RequestF a -> a [requestQueryString] :: RequestF a -> Seq QueryItem [requestBody] :: RequestF a -> Maybe (RequestBody, MediaType) [requestAccept] :: RequestF a -> Seq MediaType [requestHeaders] :: RequestF a -> Seq Header [requestHttpVersion] :: RequestF a -> HttpVersion [requestMethod] :: RequestF a -> Method type Request = RequestF Builder -- | The request body. Currently only lazy ByteStrings are supported. newtype RequestBody RequestBodyLBS :: ByteString -> RequestBody data GenResponse a Response :: Status -> Seq Header -> HttpVersion -> a -> GenResponse a [responseStatusCode] :: GenResponse a -> Status [responseHeaders] :: GenResponse a -> Seq Header [responseHttpVersion] :: GenResponse a -> HttpVersion [responseBody] :: GenResponse a -> a type Response = GenResponse ByteString newtype StreamingResponse StreamingResponse :: (forall a. (GenResponse (IO ByteString) -> IO a) -> IO a) -> StreamingResponse [runStreamingResponse] :: StreamingResponse -> forall a. (GenResponse (IO ByteString) -> IO a) -> IO a defaultRequest :: Request appendToPath :: Text -> Request -> Request appendToQueryString :: Text -> Maybe Text -> Request -> Request addHeader :: ToHttpApiData a => HeaderName -> a -> Request -> Request -- | Set body and media type of the request being constructed. -- -- The body is set to the given bytestring using the -- RequestBodyLBS constructor. setRequestBodyLBS :: ByteString -> MediaType -> Request -> Request -- | Set body and media type of the request being constructed. setRequestBody :: RequestBody -> MediaType -> Request -> Request instance GHC.Generics.Generic Servant.Client.Core.Internal.Request.ServantError instance GHC.Show.Show Servant.Client.Core.Internal.Request.ServantError instance GHC.Classes.Eq Servant.Client.Core.Internal.Request.ServantError instance Data.Traversable.Traversable Servant.Client.Core.Internal.Request.GenResponse instance Data.Foldable.Foldable Servant.Client.Core.Internal.Request.GenResponse instance GHC.Base.Functor Servant.Client.Core.Internal.Request.GenResponse instance GHC.Generics.Generic (Servant.Client.Core.Internal.Request.GenResponse a) instance GHC.Show.Show a => GHC.Show.Show (Servant.Client.Core.Internal.Request.GenResponse a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Servant.Client.Core.Internal.Request.GenResponse a) instance GHC.Generics.Generic (Servant.Client.Core.Internal.Request.RequestF a) instance GHC.Base.Functor Servant.Client.Core.Internal.Request.RequestF instance GHC.Show.Show a => GHC.Show.Show (Servant.Client.Core.Internal.Request.RequestF a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Servant.Client.Core.Internal.Request.RequestF a) instance GHC.Show.Show Servant.Client.Core.Internal.Request.RequestBody instance GHC.Read.Read Servant.Client.Core.Internal.Request.RequestBody instance GHC.Classes.Ord Servant.Client.Core.Internal.Request.RequestBody instance GHC.Classes.Eq Servant.Client.Core.Internal.Request.RequestBody instance GHC.Exception.Exception Servant.Client.Core.Internal.Request.ServantError -- | Basic Authentication for clients module Servant.Client.Core.Internal.BasicAuth -- | Authenticate a request using Basic Authentication basicAuthReq :: BasicAuthData -> Request -> Request -- | Authentication for clients module Servant.Client.Core.Internal.Auth -- | For a resource protected by authentication (e.g. AuthProtect), we need -- to provide the client with some data used to add authentication data -- to a request -- -- NOTE: THIS API IS EXPERIMENTAL AND SUBJECT TO CHANGE -- | For better type inference and to avoid usage of a data family, we -- newtype wrap the combination of some AuthClientData and a -- function to add authentication data to a request -- -- NOTE: THIS API IS EXPERIMENTAL AND SUBJECT TO CHANGE newtype AuthenticatedRequest a AuthenticatedRequest :: (AuthClientData a, AuthClientData a -> Request -> Request) -> AuthenticatedRequest a [unAuthReq] :: AuthenticatedRequest a -> (AuthClientData a, AuthClientData a -> Request -> Request) -- | Handy helper to avoid wrapping datatypes in tuples everywhere. -- -- NOTE: THIS API IS EXPERIMENTAL AND SUBJECT TO CHANGE mkAuthenticatedRequest :: AuthClientData a -> (AuthClientData a -> Request -> Request) -> AuthenticatedRequest a -- | Types for possible backends to run client-side Request queries module Servant.Client.Core.Internal.RunClient class (Monad m) => RunClient m -- | How to make a request. runRequest :: RunClient m => Request -> m Response streamingRequest :: RunClient m => Request -> m StreamingResponse throwServantError :: RunClient m => ServantError -> m a catchServantError :: RunClient m => m a -> (ServantError -> m a) -> m a checkContentTypeHeader :: RunClient m => Response -> m MediaType decodedAs :: forall ct a m. (MimeUnrender ct a, RunClient m) => Response -> Proxy ct -> m a module Servant.Client.Core.Internal.HasClient -- | clientIn allows you to produce operations to query an API from -- a client within a RunClient monad. -- --
--   type MyApi = "books" :> Get '[JSON] [Book] -- GET /books
--           :<|> "books" :> ReqBody '[JSON] Book :> Post '[JSON] Book -- POST /books
--   
--   myApi :: Proxy MyApi
--   myApi = Proxy
--   
--   clientM :: Proxy ClientM
--   clientM = Proxy
--   
--   getAllBooks :: ClientM [Book]
--   postNewBook :: Book -> ClientM Book
--   (getAllBooks :<|> postNewBook) = myApi `clientIn` clientM
--   
clientIn :: HasClient m api => Proxy api -> Proxy m -> Client m api -- | This class lets us define how each API combinator influences the -- creation of an HTTP request. -- -- Unless you are writing a new backend for servant-client-core -- or new combinators that you want to support client-generation, you can -- ignore this class. class RunClient m => HasClient m api where { type family Client (m :: * -> *) (api :: *) :: *; } clientWithRoute :: HasClient m api => Proxy m -> Proxy api -> Request -> Client m api -- | A client querying function for a :<|> b will -- actually hand you one function for querying a and another one -- for querying b, stitching them together with -- :<|>, which really is just like a pair. -- --
--   type MyApi = "books" :> Get '[JSON] [Book] -- GET /books
--           :<|> "books" :> ReqBody '[JSON] Book :> Post Book -- POST /books
--   
--   myApi :: Proxy MyApi
--   myApi = Proxy
--   
--   getAllBooks :: ClientM [Book]
--   postNewBook :: Book -> ClientM Book
--   (getAllBooks :<|> postNewBook) = client myApi
--   
-- | Singleton type representing a client for an empty API. data EmptyClient EmptyClient :: EmptyClient -- | The client for EmptyAPI is simply EmptyClient. -- --
--   type MyAPI = "books" :> Get '[JSON] [Book] -- GET /books
--           :<|> "nothing" :> EmptyAPI
--   
--   myApi :: Proxy MyApi
--   myApi = Proxy
--   
--   getAllBooks :: ClientM [Book]
--   (getAllBooks :<|> EmptyClient) = client myApi
--   
-- | If you use a Capture in one of your endpoints in your API, -- the corresponding querying function will automatically take an -- additional argument of the type specified by your Capture. -- That function will take care of inserting a textual representation of -- this value at the right place in the request path. -- -- You can control how values for this type are turned into text by -- specifying a ToHttpApiData instance for your type. -- -- Example: -- --
--   type MyApi = "books" :> Capture "isbn" Text :> Get '[JSON] Book
--   
--   myApi :: Proxy MyApi
--   myApi = Proxy
--   
--   getBook :: Text -> ClientM Book
--   getBook = client myApi
--   -- then you can just use "getBook" to query that endpoint
--   
-- | If you use a CaptureAll in one of your endpoints in your API, -- the corresponding querying function will automatically take an -- additional argument of a list of the type specified by your -- CaptureAll. That function will take care of inserting a textual -- representation of this value at the right place in the request path. -- -- You can control how these values are turned into text by specifying a -- ToHttpApiData instance of your type. -- -- Example: -- --
--   type MyAPI = "src" :> CaptureAll Text -> Get '[JSON] SourceFile
--   
--   myApi :: Proxy
--   myApi = Proxy
--   
-- --
--   getSourceFile :: [Text] -> ClientM SourceFile
--   getSourceFile = client myApi
--   -- then you can use "getSourceFile" to query that endpoint
--   
-- | If you use a Header in one of your endpoints in your API, the -- corresponding querying function will automatically take an additional -- argument of the type specified by your Header, wrapped in -- Maybe. -- -- That function will take care of encoding this argument as Text in the -- request headers. -- -- All you need is for your type to have a ToHttpApiData instance. -- -- Example: -- --
--   newtype Referer = Referer { referrer :: Text }
--     deriving (Eq, Show, Generic, ToHttpApiData)
--   
--              -- GET /view-my-referer
--   type MyApi = "view-my-referer" :> Header "Referer" Referer :> Get '[JSON] Referer
--   
--   myApi :: Proxy MyApi
--   myApi = Proxy
--   
--   viewReferer :: Maybe Referer -> ClientM Book
--   viewReferer = client myApi
--   -- then you can just use "viewRefer" to query that endpoint
--   -- specifying Nothing or e.g Just "http://haskell.org/" as arguments
--   
-- | Using a HttpVersion combinator in your API doesn't affect the -- client functions. -- | Ignore Summary in client functions. -- | Ignore Description in client functions. -- | If you use a QueryParam in one of your endpoints in your API, -- the corresponding querying function will automatically take an -- additional argument of the type specified by your QueryParam, -- enclosed in Maybe. -- -- If you give Nothing, nothing will be added to the query string. -- -- If you give a non-Nothing value, this function will take care -- of inserting a textual representation of this value in the query -- string. -- -- You can control how values for your type are turned into text by -- specifying a ToHttpApiData instance for your type. -- -- Example: -- --
--   type MyApi = "books" :> QueryParam "author" Text :> Get '[JSON] [Book]
--   
--   myApi :: Proxy MyApi
--   myApi = Proxy
--   
--   getBooksBy :: Maybe Text -> ClientM [Book]
--   getBooksBy = client myApi
--   -- then you can just use "getBooksBy" to query that endpoint.
--   -- 'getBooksBy Nothing' for all books
--   -- 'getBooksBy (Just "Isaac Asimov")' to get all books by Isaac Asimov
--   
-- | If you use a QueryParams in one of your endpoints in your API, -- the corresponding querying function will automatically take an -- additional argument, a list of values of the type specified by your -- QueryParams. -- -- If you give an empty list, nothing will be added to the query string. -- -- Otherwise, this function will take care of inserting a textual -- representation of your values in the query string, under the same -- query string parameter name. -- -- You can control how values for your type are turned into text by -- specifying a ToHttpApiData instance for your type. -- -- Example: -- --
--   type MyApi = "books" :> QueryParams "authors" Text :> Get '[JSON] [Book]
--   
--   myApi :: Proxy MyApi
--   myApi = Proxy
--   
--   getBooksBy :: [Text] -> ClientM [Book]
--   getBooksBy = client myApi
--   -- then you can just use "getBooksBy" to query that endpoint.
--   -- 'getBooksBy []' for all books
--   -- 'getBooksBy ["Isaac Asimov", "Robert A. Heinlein"]'
--   --   to get all books by Asimov and Heinlein
--   
-- | If you use a QueryFlag in one of your endpoints in your API, -- the corresponding querying function will automatically take an -- additional Bool argument. -- -- If you give False, nothing will be added to the query string. -- -- Otherwise, this function will insert a value-less query string -- parameter under the name associated to your QueryFlag. -- -- Example: -- --
--   type MyApi = "books" :> QueryFlag "published" :> Get '[JSON] [Book]
--   
--   myApi :: Proxy MyApi
--   myApi = Proxy
--   
--   getBooks :: Bool -> ClientM [Book]
--   getBooks = client myApi
--   -- then you can just use "getBooks" to query that endpoint.
--   -- 'getBooksBy False' for all books
--   -- 'getBooksBy True' to only get _already published_ books
--   
-- | Pick a Method and specify where the server you want to query -- is. You get back the full Response. -- | If you use a ReqBody in one of your endpoints in your API, -- the corresponding querying function will automatically take an -- additional argument of the type specified by your ReqBody. -- That function will take care of encoding this argument as JSON and of -- using it as the request body. -- -- All you need is for your type to have a ToJSON instance. -- -- Example: -- --
--   type MyApi = "books" :> ReqBody '[JSON] Book :> Post '[JSON] Book
--   
--   myApi :: Proxy MyApi
--   myApi = Proxy
--   
--   addBook :: Book -> ClientM Book
--   addBook = client myApi
--   -- then you can just use "addBook" to query that endpoint
--   
-- | Make the querying function append path to the request path. instance GHC.Enum.Enum Servant.Client.Core.Internal.HasClient.EmptyClient instance GHC.Enum.Bounded Servant.Client.Core.Internal.HasClient.EmptyClient instance GHC.Show.Show Servant.Client.Core.Internal.HasClient.EmptyClient instance GHC.Classes.Eq Servant.Client.Core.Internal.HasClient.EmptyClient instance Servant.Client.Core.Internal.RunClient.RunClient m => Servant.Client.Core.Internal.HasClient.HasClient m Servant.API.Empty.EmptyAPI instance (Servant.Client.Core.Internal.HasClient.HasClient m a, Servant.Client.Core.Internal.HasClient.HasClient m b) => Servant.Client.Core.Internal.HasClient.HasClient m (a Servant.API.Alternative.:<|> b) instance (GHC.TypeLits.KnownSymbol capture, Web.Internal.HttpApiData.ToHttpApiData a, Servant.Client.Core.Internal.HasClient.HasClient m api) => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.Capture.Capture' mods capture a Servant.API.Sub.:> api) instance (GHC.TypeLits.KnownSymbol capture, Web.Internal.HttpApiData.ToHttpApiData a, Servant.Client.Core.Internal.HasClient.HasClient m sublayout) => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.Capture.CaptureAll capture a Servant.API.Sub.:> sublayout) instance forall k1 (m :: * -> *) ct a (method :: k1) (cts' :: [*]) (cts :: [*]) (status :: GHC.Types.Nat). (Servant.Client.Core.Internal.RunClient.RunClient m, Servant.API.ContentTypes.MimeUnrender ct a, Servant.API.Verbs.ReflectMethod method, cts' ~ (ct : cts)) => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.Verbs.Verb method status cts' a) instance forall k1 (m :: * -> *) (method :: k1) (status :: GHC.Types.Nat) (cts :: [*]). (Servant.Client.Core.Internal.RunClient.RunClient m, Servant.API.Verbs.ReflectMethod method) => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.Verbs.Verb method status cts Servant.API.ContentTypes.NoContent) instance forall k1 (m :: * -> *) ct a (ls :: [*]) (method :: k1) (cts' :: [*]) (cts :: [*]) (status :: GHC.Types.Nat). (Servant.Client.Core.Internal.RunClient.RunClient m, Servant.API.ContentTypes.MimeUnrender ct a, Servant.API.ResponseHeaders.BuildHeadersTo ls, Servant.API.Verbs.ReflectMethod method, cts' ~ (ct : cts)) => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.Verbs.Verb method status cts' (Servant.API.ResponseHeaders.Headers ls a)) instance forall k1 (m :: * -> *) (ls :: [*]) (method :: k1) (status :: GHC.Types.Nat) (cts :: [*]). (Servant.Client.Core.Internal.RunClient.RunClient m, Servant.API.ResponseHeaders.BuildHeadersTo ls, Servant.API.Verbs.ReflectMethod method) => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.Verbs.Verb method status cts (Servant.API.ResponseHeaders.Headers ls Servant.API.ContentTypes.NoContent)) instance forall k1 (m :: * -> *) ct a (method :: k1) framing (f :: * -> *). (Servant.Client.Core.Internal.RunClient.RunClient m, Servant.API.ContentTypes.MimeUnrender ct a, Servant.API.Verbs.ReflectMethod method, Servant.API.Stream.FramingUnrender framing a, Servant.API.Stream.BuildFromStream a (f a)) => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.Stream.Stream method framing ct (f a)) instance (GHC.TypeLits.KnownSymbol sym, Web.Internal.HttpApiData.ToHttpApiData a, Servant.Client.Core.Internal.HasClient.HasClient m api, Data.Singletons.Bool.SBoolI (Servant.API.Modifiers.FoldRequired mods)) => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.Header.Header' mods sym a Servant.API.Sub.:> api) instance Servant.Client.Core.Internal.HasClient.HasClient m api => Servant.Client.Core.Internal.HasClient.HasClient m (Network.HTTP.Types.Version.HttpVersion Servant.API.Sub.:> api) instance Servant.Client.Core.Internal.HasClient.HasClient m api => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.Description.Summary desc Servant.API.Sub.:> api) instance Servant.Client.Core.Internal.HasClient.HasClient m api => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.Description.Description desc Servant.API.Sub.:> api) instance (GHC.TypeLits.KnownSymbol sym, Web.Internal.HttpApiData.ToHttpApiData a, Servant.Client.Core.Internal.HasClient.HasClient m api, Data.Singletons.Bool.SBoolI (Servant.API.Modifiers.FoldRequired mods)) => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.QueryParam.QueryParam' mods sym a Servant.API.Sub.:> api) instance (GHC.TypeLits.KnownSymbol sym, Web.Internal.HttpApiData.ToHttpApiData a, Servant.Client.Core.Internal.HasClient.HasClient m api) => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.QueryParam.QueryParams sym a Servant.API.Sub.:> api) instance (GHC.TypeLits.KnownSymbol sym, Servant.Client.Core.Internal.HasClient.HasClient m api) => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.QueryParam.QueryFlag sym Servant.API.Sub.:> api) instance Servant.Client.Core.Internal.RunClient.RunClient m => Servant.Client.Core.Internal.HasClient.HasClient m Servant.API.Raw.Raw instance (Servant.API.ContentTypes.MimeRender ct a, Servant.Client.Core.Internal.HasClient.HasClient m api) => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.ReqBody.ReqBody' mods (ct : cts) a Servant.API.Sub.:> api) instance (GHC.TypeLits.KnownSymbol path, Servant.Client.Core.Internal.HasClient.HasClient m api) => Servant.Client.Core.Internal.HasClient.HasClient m (path Servant.API.Sub.:> api) instance Servant.Client.Core.Internal.HasClient.HasClient m api => Servant.Client.Core.Internal.HasClient.HasClient m (Data.Vault.Lazy.Vault Servant.API.Sub.:> api) instance Servant.Client.Core.Internal.HasClient.HasClient m api => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.RemoteHost.RemoteHost Servant.API.Sub.:> api) instance Servant.Client.Core.Internal.HasClient.HasClient m api => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.IsSecure.IsSecure Servant.API.Sub.:> api) instance Servant.Client.Core.Internal.HasClient.HasClient m subapi => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.WithNamedContext.WithNamedContext name context subapi) instance forall k (m :: * -> *) api (tag :: k). Servant.Client.Core.Internal.HasClient.HasClient m api => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.Experimental.Auth.AuthProtect tag Servant.API.Sub.:> api) instance Servant.Client.Core.Internal.HasClient.HasClient m api => Servant.Client.Core.Internal.HasClient.HasClient m (Servant.API.BasicAuth.BasicAuth realm usr Servant.API.Sub.:> api) -- | This module provides backend-agnostic functionality for generating -- clients from servant APIs. By "backend," we mean something -- that concretely executes the request, such as: -- -- -- -- etc. -- -- Each backend is encapsulated in a monad that is an instance of the -- RunClient class. -- -- This library is primarily of interest to backend-writers and -- combinator-writers. For more information, see the README.md module Servant.Client.Core -- | clientIn allows you to produce operations to query an API from -- a client within a RunClient monad. -- --
--   type MyApi = "books" :> Get '[JSON] [Book] -- GET /books
--           :<|> "books" :> ReqBody '[JSON] Book :> Post '[JSON] Book -- POST /books
--   
--   myApi :: Proxy MyApi
--   myApi = Proxy
--   
--   clientM :: Proxy ClientM
--   clientM = Proxy
--   
--   getAllBooks :: ClientM [Book]
--   postNewBook :: Book -> ClientM Book
--   (getAllBooks :<|> postNewBook) = myApi `clientIn` clientM
--   
clientIn :: HasClient m api => Proxy api -> Proxy m -> Client m api -- | This class lets us define how each API combinator influences the -- creation of an HTTP request. -- -- Unless you are writing a new backend for servant-client-core -- or new combinators that you want to support client-generation, you can -- ignore this class. class RunClient m => HasClient m api where { type family Client (m :: * -> *) (api :: *) :: *; } clientWithRoute :: HasClient m api => Proxy m -> Proxy api -> Request -> Client m api type Request = RequestF Builder data RequestF a Request :: a -> Seq QueryItem -> Maybe (RequestBody, MediaType) -> Seq MediaType -> Seq Header -> HttpVersion -> Method -> RequestF a [requestPath] :: RequestF a -> a [requestQueryString] :: RequestF a -> Seq QueryItem [requestBody] :: RequestF a -> Maybe (RequestBody, MediaType) [requestAccept] :: RequestF a -> Seq MediaType [requestHeaders] :: RequestF a -> Seq Header [requestHttpVersion] :: RequestF a -> HttpVersion [requestMethod] :: RequestF a -> Method defaultRequest :: Request -- | The request body. Currently only lazy ByteStrings are supported. newtype RequestBody RequestBodyLBS :: ByteString -> RequestBody -- | Handy helper to avoid wrapping datatypes in tuples everywhere. -- -- NOTE: THIS API IS EXPERIMENTAL AND SUBJECT TO CHANGE mkAuthenticatedRequest :: AuthClientData a -> (AuthClientData a -> Request -> Request) -> AuthenticatedRequest a -- | Authenticate a request using Basic Authentication basicAuthReq :: BasicAuthData -> Request -> Request -- | For better type inference and to avoid usage of a data family, we -- newtype wrap the combination of some AuthClientData and a -- function to add authentication data to a request -- -- NOTE: THIS API IS EXPERIMENTAL AND SUBJECT TO CHANGE newtype AuthenticatedRequest a AuthenticatedRequest :: (AuthClientData a, AuthClientData a -> Request -> Request) -> AuthenticatedRequest a [unAuthReq] :: AuthenticatedRequest a -> (AuthClientData a, AuthClientData a -> Request -> Request) -- | For a resource protected by authentication (e.g. AuthProtect), we need -- to provide the client with some data used to add authentication data -- to a request -- -- NOTE: THIS API IS EXPERIMENTAL AND SUBJECT TO CHANGE -- | This class allows us to match client structure with client functions -- produced with client without explicit pattern-matching. -- -- The client structure needs a Generic instance. -- -- Example: -- --
--   type API
--       = "foo" :> Capture "x" Int :> Get '[JSON] Int
--    :<|> "bar" :> QueryParam "a" Char :> QueryParam "b" String :> Post '[JSON] [Int]
--    :<|> Capture "nested" Int :> NestedAPI
--   
--   type NestedAPI
--       = Get '[JSON] String
--    :<|> "baz" :> QueryParam "c" Char :> Post '[JSON] ()
--   
--   data APIClient = APIClient
--     { getFoo         :: Int -> ClientM Int
--     , postBar        :: Maybe Char -> Maybe String -> ClientM [Int]
--     , mkNestedClient :: Int -> NestedClient
--     } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic APIClient
--   instance (Client API ~ client) => ClientLike client APIClient
--   
--   data NestedClient = NestedClient
--    { getString :: ClientM String
--    , postBaz   :: Maybe Char -> ClientM ()
--    } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic NestedClient
--   instance (Client NestedAPI ~ client) => ClientLike client NestedClient
--   
--   mkAPIClient :: APIClient
--   mkAPIClient = mkClient (client (Proxy :: Proxy API))
--   
-- -- By default, left-nested alternatives are expanded: -- --
--   type API1
--       = "foo" :> Capture "x" Int :> Get '[JSON] Int
--    :<|> "bar" :> QueryParam "a" Char :> Post '[JSON] String
--   
--   type API2
--       = "baz" :> QueryParam "c" Char :> Post '[JSON] ()
--   
--   type API = API1 :<|> API2
--   
--   data APIClient = APIClient
--     { getFoo  :: Int -> ClientM Int
--     , postBar :: Maybe Char -> ClientM String
--     , postBaz :: Maybe Char -> ClientM ()
--     } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic APIClient
--   instance (Client API ~ client) => ClientLike client APIClient
--   
--   mkAPIClient :: APIClient
--   mkAPIClient = mkClient (client (Proxy :: Proxy API))
--   
-- -- If you want to define client for API1 as a separate data -- structure, you can use genericMkClientP: -- --
--   data APIClient1 = APIClient1
--     { getFoo  :: Int -> ClientM Int
--     , postBar :: Maybe Char -> ClientM String
--     } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic APIClient1
--   instance (Client API1 ~ client) => ClientLike client APIClient1
--   
--   data APIClient = APIClient
--     { mkAPIClient1 :: APIClient1
--     , postBaz      :: Maybe Char -> ClientM ()
--     } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic APIClient
--   instance (Client API ~ client) => ClientLike client APIClient where
--     mkClient = genericMkClientP
--   
--   mkAPIClient :: APIClient
--   mkAPIClient = mkClient (client (Proxy :: Proxy API))
--   
class ClientLike client custom mkClient :: ClientLike client custom => client -> custom mkClient :: (ClientLike client custom, Generic custom, Code custom ~ '[xs], GClientList client '[], GClientLikeL (ClientList client '[]) xs) => client -> custom -- | Generate client structure from client type, expanding left-nested API -- (done by default). genericMkClientL :: (Generic custom, Code custom ~ '[xs], GClientList client '[], GClientLikeL (ClientList client '[]) xs) => client -> custom -- | Generate client structure from client type, regarding left-nested API -- clients as separate data structures. genericMkClientP :: (Generic custom, Code custom ~ '[xs], GClientLikeP client xs) => client -> custom -- | A type representing possible errors in a request -- -- Note that this type substantially changed in 0.12. data ServantError -- | The server returned an error response FailureResponse :: Response -> ServantError -- | The body could not be decoded at the expected type DecodeFailure :: Text -> Response -> ServantError -- | The content-type of the response is not supported UnsupportedContentType :: MediaType -> Response -> ServantError -- | The content-type header is invalid InvalidContentTypeHeader :: Response -> ServantError -- | There was a connection error, and no response was received ConnectionError :: Text -> ServantError -- | Singleton type representing a client for an empty API. data EmptyClient EmptyClient :: EmptyClient type Response = GenResponse ByteString data GenResponse a Response :: Status -> Seq Header -> HttpVersion -> a -> GenResponse a [responseStatusCode] :: GenResponse a -> Status [responseHeaders] :: GenResponse a -> Seq Header [responseHttpVersion] :: GenResponse a -> HttpVersion [responseBody] :: GenResponse a -> a class (Monad m) => RunClient m -- | How to make a request. runRequest :: RunClient m => Request -> m Response streamingRequest :: RunClient m => Request -> m StreamingResponse throwServantError :: RunClient m => ServantError -> m a catchServantError :: RunClient m => m a -> (ServantError -> m a) -> m a newtype StreamingResponse StreamingResponse :: (forall a. (GenResponse (IO ByteString) -> IO a) -> IO a) -> StreamingResponse [runStreamingResponse] :: StreamingResponse -> forall a. (GenResponse (IO ByteString) -> IO a) -> IO a addHeader :: ToHttpApiData a => HeaderName -> a -> Request -> Request appendToQueryString :: Text -> Maybe Text -> Request -> Request appendToPath :: Text -> Request -> Request -- | Set body and media type of the request being constructed. -- -- The body is set to the given bytestring using the -- RequestBodyLBS constructor. setRequestBodyLBS :: ByteString -> MediaType -> Request -> Request -- | Set body and media type of the request being constructed. setRequestBody :: RequestBody -> MediaType -> Request -> Request -- | This module is a utility for servant-client-core backend -- writers. It contains all the functionality from -- servant-client-core that should be re-exported. module Servant.Client.Core.Reexport -- | This class lets us define how each API combinator influences the -- creation of an HTTP request. -- -- Unless you are writing a new backend for servant-client-core -- or new combinators that you want to support client-generation, you can -- ignore this class. class RunClient m => HasClient m api where { type family Client (m :: * -> *) (api :: *) :: *; } clientWithRoute :: HasClient m api => Proxy m -> Proxy api -> Request -> Client m api type Response = GenResponse ByteString data StreamingResponse data GenResponse a Response :: Status -> Seq Header -> HttpVersion -> a -> GenResponse a [responseStatusCode] :: GenResponse a -> Status [responseHeaders] :: GenResponse a -> Seq Header [responseHttpVersion] :: GenResponse a -> HttpVersion [responseBody] :: GenResponse a -> a -- | This class allows us to match client structure with client functions -- produced with client without explicit pattern-matching. -- -- The client structure needs a Generic instance. -- -- Example: -- --
--   type API
--       = "foo" :> Capture "x" Int :> Get '[JSON] Int
--    :<|> "bar" :> QueryParam "a" Char :> QueryParam "b" String :> Post '[JSON] [Int]
--    :<|> Capture "nested" Int :> NestedAPI
--   
--   type NestedAPI
--       = Get '[JSON] String
--    :<|> "baz" :> QueryParam "c" Char :> Post '[JSON] ()
--   
--   data APIClient = APIClient
--     { getFoo         :: Int -> ClientM Int
--     , postBar        :: Maybe Char -> Maybe String -> ClientM [Int]
--     , mkNestedClient :: Int -> NestedClient
--     } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic APIClient
--   instance (Client API ~ client) => ClientLike client APIClient
--   
--   data NestedClient = NestedClient
--    { getString :: ClientM String
--    , postBaz   :: Maybe Char -> ClientM ()
--    } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic NestedClient
--   instance (Client NestedAPI ~ client) => ClientLike client NestedClient
--   
--   mkAPIClient :: APIClient
--   mkAPIClient = mkClient (client (Proxy :: Proxy API))
--   
-- -- By default, left-nested alternatives are expanded: -- --
--   type API1
--       = "foo" :> Capture "x" Int :> Get '[JSON] Int
--    :<|> "bar" :> QueryParam "a" Char :> Post '[JSON] String
--   
--   type API2
--       = "baz" :> QueryParam "c" Char :> Post '[JSON] ()
--   
--   type API = API1 :<|> API2
--   
--   data APIClient = APIClient
--     { getFoo  :: Int -> ClientM Int
--     , postBar :: Maybe Char -> ClientM String
--     , postBaz :: Maybe Char -> ClientM ()
--     } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic APIClient
--   instance (Client API ~ client) => ClientLike client APIClient
--   
--   mkAPIClient :: APIClient
--   mkAPIClient = mkClient (client (Proxy :: Proxy API))
--   
-- -- If you want to define client for API1 as a separate data -- structure, you can use genericMkClientP: -- --
--   data APIClient1 = APIClient1
--     { getFoo  :: Int -> ClientM Int
--     , postBar :: Maybe Char -> ClientM String
--     } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic APIClient1
--   instance (Client API1 ~ client) => ClientLike client APIClient1
--   
--   data APIClient = APIClient
--     { mkAPIClient1 :: APIClient1
--     , postBaz      :: Maybe Char -> ClientM ()
--     } deriving GHC.Generic
--   
--   instance Generics.SOP.Generic APIClient
--   instance (Client API ~ client) => ClientLike client APIClient where
--     mkClient = genericMkClientP
--   
--   mkAPIClient :: APIClient
--   mkAPIClient = mkClient (client (Proxy :: Proxy API))
--   
class ClientLike client custom mkClient :: ClientLike client custom => client -> custom mkClient :: (ClientLike client custom, Generic custom, Code custom ~ '[xs], GClientList client '[], GClientLikeL (ClientList client '[]) xs) => client -> custom -- | Generate client structure from client type, expanding left-nested API -- (done by default). genericMkClientL :: (Generic custom, Code custom ~ '[xs], GClientList client '[], GClientLikeL (ClientList client '[]) xs) => client -> custom -- | Generate client structure from client type, regarding left-nested API -- clients as separate data structures. genericMkClientP :: (Generic custom, Code custom ~ '[xs], GClientLikeP client xs) => client -> custom -- | A type representing possible errors in a request -- -- Note that this type substantially changed in 0.12. data ServantError -- | The server returned an error response FailureResponse :: Response -> ServantError -- | The body could not be decoded at the expected type DecodeFailure :: Text -> Response -> ServantError -- | The content-type of the response is not supported UnsupportedContentType :: MediaType -> Response -> ServantError -- | The content-type header is invalid InvalidContentTypeHeader :: Response -> ServantError -- | There was a connection error, and no response was received ConnectionError :: Text -> ServantError -- | Singleton type representing a client for an empty API. data EmptyClient EmptyClient :: EmptyClient -- | Simple data type to represent the target of HTTP requests for -- servant's automatically-generated clients. data BaseUrl BaseUrl :: Scheme -> String -> Int -> String -> BaseUrl -- | URI scheme to use [baseUrlScheme] :: BaseUrl -> Scheme -- | host (eg "haskell.org") [baseUrlHost] :: BaseUrl -> String -- | port (eg 80) [baseUrlPort] :: BaseUrl -> Int -- | path (eg "ab/c") [baseUrlPath] :: BaseUrl -> String -- | URI scheme to use data Scheme -- | http:// Http :: Scheme -- | https:// Https :: Scheme showBaseUrl :: BaseUrl -> String parseBaseUrl :: MonadThrow m => String -> m BaseUrl data InvalidBaseUrlException