| Safe Haskell | Safe-Inferred |
|---|---|
| Language | Haskell2010 |
Servant.API.UVerb
Description
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 |
| HasStatus a => HasStatus (Headers ls a) Source # | |
| 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 Associated Types 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.
Constructors
| WithStatus a |
Instances
module Servant.API.UVerb.Union