Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
An alternative to Verb
for end-points that respond with a resource value of any of an
open union of types, and specific status codes for each type in this union. (UVerb
is
short for UnionVerb
)
This can be used for returning (rather than throwing) exceptions in a server as in, say
'[Report, WaiError]
; or responding with either a 303 forward with a location header, or
201 created with a different body type, depending on the circumstances. (All of this can
be done with vanilla servant-server by throwing exceptions, but it can't be represented in
the API types without something like UVerb
.)
See https://docs.servant.dev/en/stable/cookbook/uverb/UVerb.html for a working example.
Synopsis
- data UVerb (method :: StdMethod) (contentTypes :: [*]) (as :: [*])
- class KnownStatus (StatusOf a) => HasStatus (a :: *) where
- statusOf :: forall a proxy. HasStatus a => proxy a -> Status
- class HasStatuses (as :: [*]) where
- newtype WithStatus (k :: Nat) a = WithStatus a
- module Servant.API.UVerb.Union
Documentation
data UVerb (method :: StdMethod) (contentTypes :: [*]) (as :: [*]) Source #
A variant of Verb
that can have any of a number of response values and status codes.
FUTUREWORK: it would be nice to make Verb
a special case of UVerb
, and only write
instances for HasServer
etc. for the latter, getting them for the former for free.
Something like:
type Verb method statusCode contentTypes a = UVerb method contentTypes [WithStatus statusCode a]
Backwards compatibility is tricky, though: this type alias would mean people would have to
use respond
instead of pure
or return
, so all old handlers would have to be rewritten.
class KnownStatus (StatusOf a) => HasStatus (a :: *) Source #
Instances
HasStatus NoContent Source # | If an API can respond with |
KnownStatus n => HasStatus (WithStatus n a) Source # | an instance of this typeclass assigns a HTTP status code to a return type Example: data NotFoundError = NotFoundError String instance HasStatus NotFoundError where type StatusOf NotFoundError = 404 You can also use the convience newtype wrapper |
Defined in Servant.API.UVerb type StatusOf (WithStatus n a) :: Nat Source # |
class HasStatuses (as :: [*]) where Source #
Instances
HasStatuses ('[] :: [Type]) Source # | |
(HasStatus a, HasStatuses as) => HasStatuses (a ': as) Source # | |
newtype WithStatus (k :: Nat) a Source #
A simple newtype wrapper that pairs a type with its status code. It implements all the content types that Servant ships with by default.
Instances
module Servant.API.UVerb.Union