Merge in (and slightly refactor) servant-generic
(by Patrick Chilton)
into servant (Servant.API.Generic),
servant-client-code (Servant.Client.Generic)
and servant-server (Servant.Server.Generic).
Deprecate Servant.Utils.Links, use Servant.Links.
servant-server Deprecate Servant.Utils.StaticUtils, use Servant.Server.StaticUtils.
0.14
Signifacant changes
Stream takes a status code argument
-Stream method framing ctype a
+Stream method status framing ctype a
ToStreamGenerator definition changed, so it’s possible to write an instance
for conduits.
-class ToStreamGenerator f a where
- toStreamGenerator :: f a -> StreamGenerator a
+class ToStreamGenerator a b | a -> b where
+ toStreamGenerator :: a -> StreamGenerator b
servant-client-core Free Client implementation.
Useful for testing HasClient instances.
(#920)
servant-client-core Add hoistClient to HasClient.
Just like hoistServer allows us to change the monad in which request handlers
of a web application live in, we also have hoistClient for changing the monad
in which client functions live.
Read tutorial section for more information.
(#936)
iF you have own combinators, you’ll need to define a new method of
HasClient class, for example:
type Client m (MyCombinator :> api) = MyValue :> Client m api
hoistClientMonad pm _ nt cl = hoistClientMonad pm (Proxy :: Proxy api) nt . cl
servant Add safeLink' :: (Link -> a) -> ... -> MkLink endpoint a,
which allows to create helpers returning something else than Link.
(#968)
servant-server File serving in polymorphic monad.
i.e. Generalised types of serveDirectoryFileServer etc functions in
Servant.Utils.StaticFiles
(#953)
servant-serverReqBody content type check is recoverable.
This allows writing APIs like:
ReqBody '[JSON] Int :> Post '[PlainText] Int
:<|> ReqBody '[PlainText] Int :> Post '[PlainText] Int
which is useful when handlers are subtly different,
for example may do less work.
(#937)
servant-client Add more constructors to RequestBody, including
RequestBodyStream.
Note: we are looking for http-library agnostic API,
so the might change again soon.
Tell us which constructors are useful for you!
(#913)
Other changes
GetHeaders instances implemented without OverlappingInstances
(#971)
QueryParam, Header and ReqBody understand modifiers:
Required or Optional (resulting in a or Maybe a in handlers)
Strict or Lenient (resulting in a or Either String a in handlers)
Also you can use Description as a modifier, but it doesn’t yet work
with servant-docs, only servant-swagger. There is an issue.
servant-client Support http-client’s CookieJar
(#897#883)
ClientM preserves cookies between requests,
if given initial CookieJar.
To migrate from older code, change ClientEnv constructor
to mkClientEnv which makes ClientEnv without CookieJar.
servant Mono-kind-ise modifiers, resulting in better error messages.
(#887#890)
servant Add TypeError ... => HasServers instances in GHC-8.2 for
not saturated modifiers (Capture "foo" :> ...) or -> in place of :>.
(#893)
Prevent double-escaping in link segments
(#835#878)
0.12
Significant changes
servant-clientservant-client-core
Factored out of servant-client all the functionality that was
independent of the http-client backend.
(#803#821)
If you have own combinators, you’ll need to add an additional m argument
in HasClient, Client and clientWithRoute:
-class HasClient api
- type Client (api :: *) :: *
- clientWithRoute :: Proxy api -> Req -> Client api
+class HasClient m api
+ type Client (m :: * -> *) (api :: *) :: *
+ clientWithRoute :: Proxy m -> Proxy api -> Request -> Client m api
servant-server Added hoistServer member to the HasServer class, which is HasServer
specific enter.
(#804#824)
enter isn’t exported from Servant module anymore. You can change
enter to hoistServer in a straight forward way.
Unwrap natural transformation and add a api type Proxy:
-server = enter (NT nt) impl
+server = hoistServer (Proxy :: Proxy MyApi) nt impl
If you have own combinators, you’ll need to define a new method of
HasServer class, for example:
type ServerT (MyCombinator :> api) m = MyValue -> ServerT api m
hoistServerWithContext _ pc nt s = hoistServerWithContext (Proxy :: Proxy api) pc nt . s