| Copyright | Dennis Gosnell 2017 |
|---|---|
| License | BSD3 |
| Maintainer | Dennis Gosnell (cdep.illabout@gmail.com) Krasjet (nil.krjst@gmail.com) |
| Safe Haskell | None |
| Language | Haskell2010 |
Servant.RawM
Contents
Description
This module defines the RawM type that allows you to embed a WAI
Application in your Servant API.
It is similar to Raw provided by Servant, but there is one big
difference. RawM allows you to use monadic effects to create the
Application.
What does this look like in practice? The following is an example of using
RawM:
import Servant.RawM.Server type Api = "serve-directory-example" :>RawMserverRoot ::ServerTApi (ReaderTFilePathIO) serverRoot = rawEndpoint rawEndpoint ::ReaderTFilePathIOApplicationrawEndpoint = do filePath <-askserveDirectoryWebAppfilePath apiProxy ::ProxyApi apiProxy =Proxyapp :: FilePath ->Applicationapp filePath =serveapiProxy apiServer where apiServer ::ServerApi apiServer =hoistServerapiProxy transformation serverRoot transformation ::ReaderTFilePathIOa ->Handlera transformation readerT =liftIO$runReaderTreaderT filePath
Notice how the above rawEndpoint handler is able to get the filePath from
the ReaderT. Using Servant's default
Raw type, rawEndpoint would have to be written like the
following:
type Api' = "serve-directory-example" :>RawserverRoot' ::ServerTApi' (ReaderTFilePathIO) serverRoot' = rawEndpoint' rawEndpoint' ::Tagged(ReaderTFilePathIO)ApplicationrawEndpoint' = ...
rawEndpoint' does not have access to the ReaderT monad,
so there is no way to get the directory path.
RawM solves this problem by allowing the Application to be
produced monadically.
There is an example in the source code repository that shows a more in-depth server, client, and documentation.
After servant-rawm 1.0.0.0, the implementations for RawM server, client,
and documentation generator are divided into three packages:
servant-rawm-server,
servant-rawm-client,
and
servant-rawm-docs
to avoid pulling in unnecessary dependencies. This module is re-exported in
Servant.RawM.Server, Servant.RawM.Client, and Servant.RawM.Docs, so you
don't need to import this module explicitly. Import the corresponding
implementation instead.
Synopsis
- type RawM = RawM' FileServer
- data RawM' serverType
- data FileServer
RawM API parameter
type RawM = RawM' FileServer Source #
Specialization of RawM' to FileServer. This can be used if you are
using serveDirectoryWebApp,
serveDirectoryFileServer, etc.
data RawM' serverType Source #
This is a type to use to define a Servant API. It signifies a route that
allows embedding of a WAI Application. It is similar to
Raw, but it has a HasServer instance that
allows embedding of monadic effects. This should be more convenient than
Raw.
The phantom type serverType is used for defining the HasDocs
instance. There are instances for HasClient and
HasServer for RawM' with a polymorphic phantom type, but
there is only a HasDocs instance specified for . This allows the end-user to easily create a
RawM'
FileServerHasDocs instance for a custom Application.
data FileServer Source #
Used by RawM as a phantom type.