HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

Moduleservant-server-0.20.2Haskell2010

Servant.Server.Internal

  • 6 types
  • 2 classes
  • 11 values
classclass HasServer (api :: k) (context :: [Type]) where
#

Associated types

  • type family ServerT (api :: k) (m :: Type -> Type)

    The type of a server for this API, given a monad to run effects in.

    Note that the result kind is *, so it is not a monad transformer, unlike what the T in the name might suggest.

Methods

Instances38HasServer, …
  • TypeError (NoInstanceFor (HasServer api context)) => HasServer api contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • HasServer EmptyAPI contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    The server for an EmptyAPI is emptyServer.

    type MyApi = "nothing" :> EmptyApi
    
    server :: Server MyApi
    server = emptyServer
  • HasServer Raw contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    Just pass the request to the underlying application and serve its response.

    Example:

    type MyApi = "images" :> Raw
    
    server :: Server MyApi
    server = serveDirectory "/var/www/images"
  • HasServer RawM contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    Just pass the request to the underlying application and serve its response.

    Example:

    type MyApi = "images" :> Raw
    
    server :: Server MyApi
    server = serveDirectory "/var/www/images"
  • (HasServer (ToServantApi api) context, forall (m :: Type -> Type). Generic (api (AsServerT m)), forall (m :: Type -> Type). GServer api m, ErrorIfNoGeneric api) => HasServer (NamedRoutes api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • TypeError (HasServerArrowTypeError a b) => HasServer (a -> b) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    This instance prevents from accidentally using -> instead of :>

    Example1 expression
    serve (Proxy :: Proxy (Capture "foo" Int -> Get '[JSON] Int)) (error "...")......No instance HasServer (a -> b)....Maybe you have used '->' instead of ':>' between...Capture' '[] "foo" Int...and...Verb 'GET 200 '[JSON] Int...
    Example1 expression
    undefined :: Server (Capture "foo" Int -> Get '[JSON] Int)......No instance HasServer (a -> b)....Maybe you have used '->' instead of ':>' between...Capture' '[] "foo" Int...and...Verb 'GET 200 '[JSON] Int...
  • ReflectMethod method => HasServer (NoContentVerb method) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • (HasServer a context, HasServer b context) => HasServer (a :<|> b) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    A server for a :<|> b first tries to match the request against the route represented by a and if it fails tries b. You must provide a request handler for each route.

    type MyApi = "books" :> Get '[JSON] [Book] -- GET /books
            :<|> "books" :> ReqBody Book :> Post '[JSON] Book -- POST /books
    
    server :: Server MyApi
    server = listAllBooks :<|> postBook
      where listAllBooks = ...
            postBook book = ...
  • TypeError (NoInstanceForSub HasServer ty) => HasServer (ty :> sub) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • TypeError (PartialApplication HasServer arr) => HasServer (arr :> sub) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • HasServer api context => HasServer (HttpVersion :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • HasServer api context => HasServer (EmptyAPI :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    Ignore EmptyAPI as part of route in server handlers.

  • HasServer api context => HasServer (IsSecure :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • HasServer api context => HasServer (QueryString :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    If you use QueryString in one of the endpoints for your API, this automatically requires your server-side handler to be a function that takes an argument of type Query ([(ByteString, Maybe ByteString)]).

    This lets you extract the whole query string. This is useful when the query string can contain parameters with dynamic names, that you can't access with QueryParam.

    Example:

    type MyApi = "books" :> QueryString :> Get '[JSON] [Book]
    
    server :: Server MyApi
    server = getBooksBy
      where getBooksBy :: Query -> Handler [Book]
            getBooksBy filters = ...filter books based on the dynamic filters provided...
  • HasServer api context => HasServer (RemoteHost :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • HasServer api context => HasServer (Vault :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • HasServer api ctx => HasServer (Description desc :> api) ctxDefined in servant-server-0.20.2 · Servant.Server.Internal

    Ignore Description in server handlers.

  • HasServer api ctx => HasServer (Summary desc :> api) ctxDefined in servant-server-0.20.2 · Servant.Server.Internal

    Ignore Summary in server handlers.

  • (KnownSymbol capture, FromHttpApiData a, Typeable a, HasServer api context, HasContextEntry (MkContextWithErrorFormatter context) ErrorFormatters) => HasServer (CaptureAll capture a :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    If you use CaptureAll in one of the endpoints for your API, this automatically requires your server-side handler to be a function that takes an argument of a list of the type specified by the CaptureAll. This lets servant worry about getting values from the URL and turning them into values of the type you specify.

    You can control how they'll be converted from Text to your type by simply providing an instance of FromHttpApiData for your type.

    Example:

    type MyApi = "src" :> CaptureAll "segments" Text :> Get '[JSON] SourceFile
    
    server :: Server MyApi
    server = getSourceFile
      where getSourceFile :: [Text] -> Handler Book
            getSourceFile pathSegments = ...
  • (KnownSymbol capture, FromHttpApiData a, Typeable a, HasServer api context, SBoolI (FoldLenient mods), HasContextEntry (MkContextWithErrorFormatter context) ErrorFormatters) => HasServer (Capture' mods capture a :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    If you use Capture in one of the endpoints for your API, this automatically requires your server-side handler to be a function that takes an argument of the type specified by the Capture. This lets servant worry about getting it from the URL and turning it into a value of the type you specify.

    You can control how it'll be converted from Text to your type by simply providing an instance of FromHttpApiData for your type.

    Example:

    type MyApi = "books" :> Capture "isbn" Text :> Get '[JSON] Book
    
    server :: Server MyApi
    server = getBook
      where getBook :: Text -> Handler Book
            getBook isbn = ...
  • (KnownSymbol path, HasServer api context) => HasServer (path :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    Make sure the incoming request starts with "/path", strip it and pass the rest of the request path to api.

  • (KnownSymbol realm, HasServer api context, HasContextEntry context (BasicAuthCheck usr)) => HasServer (BasicAuth realm usr :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    Basic Authentication

  • (KnownSymbol sym, FromHttpApiData a, HasServer api context, HasContextEntry (MkContextWithErrorFormatter context) ErrorFormatters) => HasServer (QueryParams sym a :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    If you use QueryParams "authors" Text in one of the endpoints for your API, this automatically requires your server-side handler to be a function that takes an argument of type [Text].

    This lets servant worry about looking up 0 or more values in the query string associated to authors and turning each of them into a value of the type you specify.

    You can control how the individual values are converted from Text to your type by simply providing an instance of FromHttpApiData for your type.

    Example:

    type MyApi = "books" :> QueryParams "authors" Text :> Get '[JSON] [Book]
    
    server :: Server MyApi
    server = getBooksBy
      where getBooksBy :: [Text] -> Handler [Book]
            getBooksBy authors = ...return all books by these authors...
  • (KnownSymbol sym, FromHttpApiData a, HasServer api context, SBoolI (FoldRequired mods), SBoolI (FoldLenient mods), HasContextEntry (MkContextWithErrorFormatter context) ErrorFormatters) => HasServer (Header' mods sym a :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    If you use Header in one of the endpoints for your API, this automatically requires your server-side handler to be a function that takes an argument of the type specified by Header. This lets servant worry about extracting it from the request and turning it into a value of the type you specify.

    All it asks is for a FromHttpApiData instance.

    Example:

    newtype Referer = Referer Text
      deriving (Eq, Show, FromHttpApiData)
    
               -- GET /view-my-referer
    type MyApi = "view-my-referer" :> Header "Referer" Referer :> Get '[JSON] Referer
    
    server :: Server MyApi
    server = viewReferer
      where viewReferer :: Referer -> Handler referer
            viewReferer referer = return referer
  • (KnownSymbol sym, FromHttpApiData a, HasServer api context, SBoolI (FoldRequired mods), SBoolI (FoldLenient mods), HasContextEntry (MkContextWithErrorFormatter context) ErrorFormatters) => HasServer (QueryParam' mods sym a :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    If you use QueryParam "author" Text in one of the endpoints for your API, this automatically requires your server-side handler to be a function that takes an argument of type Maybe Text.

    This lets servant worry about looking it up in the query string and turning it into a value of the type you specify, enclosed in Maybe, because it may not be there and servant would then hand you Nothing.

    You can control how it'll be converted from Text to your type by simply providing an instance of FromHttpApiData for your type.

    Example:

    type MyApi = "books" :> QueryParam "author" Text :> Get '[JSON] [Book]
    
    server :: Server MyApi
    server = getBooksBy
      where getBooksBy :: Maybe Text -> Handler [Book]
            getBooksBy Nothing       = ...return all books...
            getBooksBy (Just author) = ...return books by the given author...
  • (KnownSymbol sym, FromDeepQuery a, HasServer api context, HasContextEntry (MkContextWithErrorFormatter context) ErrorFormatters) => HasServer (DeepQuery sym a :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    If you use DeepQuery "symbol" a in one of the endpoints for your API, this automatically requires your server-side handler to be a function that takes an argument of type a.

    This lets you extract an object from multiple parameters in the query string, with its fields enclosed in brackets: `/books?filter[author][name]=value`. When all the fields are known in advance, it can be done with QueryParam (it can still be tedious if you the object has many fields). When some fields are dynamic, it cannot be done with @QueryParam.

    The way the object is constructed from the extracted fields can be controlled by providing an instance on FromDeepQuery

    Example:

    type MyApi = "books" :> DeepQuery "filter" BookQuery :> Get '[JSON] [Book]
    
    server :: Server MyApi
    server = getBooksBy
      where getBooksBy :: BookQuery -> Handler [Book]
            getBooksBy query = ...filter books based on the dynamic filters provided...
  • (KnownSymbol sym, HasServer api context) => HasServer (QueryFlag sym :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    If you use QueryFlag "published" in one of the endpoints for your API, this automatically requires your server-side handler to be a function that takes an argument of type Bool.

    Example:

    type MyApi = "books" :> QueryFlag "published" :> Get '[JSON] [Book]
    
    server :: Server MyApi
    server = getBooks
      where getBooks :: Bool -> Handler [Book]
            getBooks onlyPublished = ...return all books, or only the ones that are already published, depending on the argument...
  • (AllCTUnrender list a, HasServer api context, SBoolI (FoldLenient mods), HasContextEntry (MkContextWithErrorFormatter context) ErrorFormatters) => HasServer (ReqBody' mods list a :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    If you use ReqBody in one of the endpoints for your API, this automatically requires your server-side handler to be a function that takes an argument of the type specified by ReqBody. The Content-Type header is inspected, and the list provided is used to attempt deserialization. If the request does not have a Content-Type header, it is treated as application/octet-stream (as specified in RFC 7231 section 3.1.1.5). This lets servant worry about extracting it from the request and turning it into a value of the type you specify.

    All it asks is for a FromJSON instance.

    Example:

    type MyApi = "books" :> ReqBody '[JSON] Book :> Post '[JSON] Book
    
    server :: Server MyApi
    server = postBook
      where postBook :: Book -> Handler Book
            postBook book = ...insert into your db...
  • (FramingUnrender framing, FromSourceIO chunk a, MimeUnrender ctype chunk, HasServer api context) => HasServer (StreamBody' mods framing ctype a :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • (AtMostOneFragment api, FragmentUnique (Fragment a1 :> api), HasServer api context) => HasServer (Fragment a1 :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Internal

    Ignore Fragment in server handlers. See https://ietf.org/rfc/rfc2616.html#section-15.1.3 for more details.

    Example:

    type MyApi = "books" :> Fragment Text :> Get '[JSON] [Book]
    
    server :: Server MyApi
    server = getBooks
      where getBooks :: Handler [Book]
            getBooks = ...return all books...
  • (ReflectMethod method, AllMime contentTypes, All (IsServerResourceWithStatus contentTypes) as, Unique (Statuses as)) => HasServer (UVerb method contentTypes as) contextDefined in servant-server-0.20.2 · Servant.Server.UVerb · orphan
  • (HasServer api context, HasContextEntry context (AuthHandler Request (AuthServerData (AuthProtect tag)))) => HasServer (AuthProtect tag :> api) contextDefined in servant-server-0.20.2 · Servant.Server.Experimental.Auth · orphan

    Known orphan instance.

  • (HasServer api ctx, HasContextEntry ctx (Acquire a)) => HasServer (WithResource a :> api) ctxDefined in servant-server-0.20.2 · Servant.Server.Internal

    If you use WithResource in one of the endpoints for your API Servant will provide the handler for this endpoint an argument of the specified type. The lifespan of this resource will be automatically managed by Servant. This resource will be created before the handler starts and it will be destoyed after it ends. A new resource is created for each request to the endpoint.

  • (HasContextEntry context (NamedContext name subContext), HasServer subApi subContext) => HasServer (WithNamedContext name subContext subApi) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • (AllCTRender ctypes a, ReflectMethod method, KnownNat status) => HasServer (Verb method status ctypes a) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • (AllCTRender ctypes a, ReflectMethod method, KnownNat status, GetHeaders (Headers h a)) => HasServer (Verb method status ctypes (Headers h a)) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • (MimeRender ctype chunk, ReflectMethod method, KnownNat status, FramingRender framing, ToSourceIO chunk a) => HasServer (Stream method status framing ctype a) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
  • (MimeRender ctype chunk, ReflectMethod method, KnownNat status, FramingRender framing, ToSourceIO chunk a, GetHeaders (Headers h a)) => HasServer (Stream method status framing ctype (Headers h a)) contextDefined in servant-server-0.20.2 · Servant.Server.Internal
datadata EmptyServer
#

Singleton type representing a server that serves an empty API.

Instances4Bounded, Enum, Eq, Show
datadata AsServerT (m :: Type -> Type)
#

A type that specifies that an API record contains a server implementation.

Instances2GenericMode, :-
familytype family ServerT (api :: k) (m :: Type -> Type)
#

The type of a server for this API, given a monad to run effects in.

Note that the result kind is *, so it is not a monad transformer, unlike what the T in the name might suggest.

Instances36ServerT, …
classclass GServer (api :: Type -> Type) (m :: Type -> Type) where
#

This class is a necessary evil: in the implementation of HasServer for NamedRoutes api, we essentially need the quantified constraint forall m. GServerConstraints m to hold.

We cannot require do that directly as the definition of GServerConstraints contains type family applications (Rep and ServerT). The trick is to hide those type family applications behind a typeclass providing evidence for GServerConstraints api m in the form of a dictionary, and require that forall m. GServer api m instead.

Users shouldn't have to worry about this class, as the only possible instance is provided in this module for all record APIs.

Instances1GServer