servant/servant-server
Gaël Deest b0b02f1948 Implement HasServer (NamedRoutes routes)
We define `ServerT (NamedRoutes api) m` as `api (AsServerT m)`, so that
the server of an record-defined API is a record of handlers.

The implementation piggy backs on the instance for “vanilla” servant
types with `(:<|>)`, using the `GServantProduct` for converting backd
and forth between the record / vanilla servers.

The main difficulty is that GHC needs to know that this operation is
legit, which can be expressed as the fact that:

```
GToServant (Rep (ServerT (NamedRoutes api))) m ~
ServerT (GToServant (Rep (api AsApi))) m
```

plus a few additional constraints.

This is easy enough for `route`, as we know that `m ~ Handler`. But in
the case of `hoistServerWithContext`, the two involved monads are
unknown ; in other words, this constraint needs to hold `forall m.`

Switching `-XQuantifiedConstraints` on is not sufficient, as our
constraints involve type families (`Rep` and `ServerT`). Our trick is to
use an intermediary typeclass, `GServer`, as a provider of evidence (in
the form of a `Dict`) that our constraints are indeed satisfied for a
particular monad.

The only instance of `GServer` is defined along with it, so it is
practically invisible to users.
2021-11-18 10:09:58 +01:00
..
example Implement HasServer (NamedRoutes routes) 2021-11-18 10:09:58 +01:00
src Implement HasServer (NamedRoutes routes) 2021-11-18 10:09:58 +01:00
test unsupporting GHC < 8.6.5, removing unecessary imports 2021-10-02 13:13:24 +02:00
CHANGELOG.md Prepare 0.18.3 release (#1430) 2021-06-24 00:38:46 +03:00
LICENSE Changelog and cabal file edits 2018-11-13 09:58:42 +02:00
README.md point to www.servant.dev (website) and docs.servant.dev (self-explanatory) 2019-03-02 10:08:03 +01:00
servant-server.cabal Implement HasServer (NamedRoutes routes) 2021-11-18 10:09:58 +01:00
Setup.hs Change build-type: Simple; run doctests on CI via haskell-ci 2020-01-10 01:07:31 +02:00

servant-server

servant

This library lets you implement an HTTP server with handlers for each endpoint of a servant API, handling most of the boilerplate for you.

Getting started

We've written a tutorial guide that introduces the core types and features of servant. After this article, you should be able to write your first servant webservices, learning the rest from the haddocks' examples.