Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- bootstrap :: forall ct m a. Endpoint m a -> Bootstrap m (ct :+: CNil) (HList '[Endpoint m a])
- serve :: forall ct cts es m a. Endpoint m a -> Bootstrap m cts (HList es) -> Bootstrap m (ct :+: cts) (HList (Endpoint m a ': es))
- compile :: forall cts m es. Compile cts m es => Bootstrap m cts es -> ReaderT Request m Response
- toApp :: forall m. NaturalTransformation m IO => ReaderT Request m Response -> Application
Documentation
bootstrap :: forall ct m a. Endpoint m a -> Bootstrap m (ct :+: CNil) (HList '[Endpoint m a]) Source #
Create Bootstrap
out of single Endpoint
and some given Content-Type:
bootstrap @TextPlain (pure "foo")
To enable Content-Type negotiation based on Accept
header, use Coproduct
:+:
type operator to set the type:
bootstrap @(TextPlain :+: TextHtml) (pure "foo") -- in case of failed negotiation, text/html is picked as the last resort bootstrap @(TextPlain :+: TextHtml :+: NotAcceptable406) (pure "foo") -- in case of failed negotiation, 406 is returned
serve :: forall ct cts es m a. Endpoint m a -> Bootstrap m cts (HList es) -> Bootstrap m (ct :+: cts) (HList (Endpoint m a ': es)) Source #
Add another endpoint to Bootstrap
for purpose of serving multiple Content-Types with *different* endpoints
bootstrap @TextPlain (pure "foo") & serve @ApplicationJson (pure "bar")
compile :: forall cts m es. Compile cts m es => Bootstrap m cts es -> ReaderT Request m Response Source #
Compile Bootstrap
into ReaderT Request m Response
for further combinations.
Might be useful to implement middleware in context of the same monad m
:
bootstrap @TextPlain (pure "foo") & compile
toApp :: forall m. NaturalTransformation m IO => ReaderT Request m Response -> Application Source #
Convert ReaderT Request m Response
into WAI Application
bootstrap @TextPlain (pure "foo") & compile & toApp @IO
The constraint here is a natural transformation of Endpoint
s monad m
into IO
.
In case if selected monad is IO
already then provided instance is just enough.
Otherwise, it's necessary define how to "start" custom monad for each request to come and convert it to IO
as the
instance of NaturalTransformation
m IO
.