@@ -1,14 +1,16 @@
2{-# LANGUAGE AllowAmbiguousTypes #-}
1{-# LANGUAGE AllowAmbiguousTypes #-}
3{-# LANGUAGE ConstraintKinds #-}
2{-# LANGUAGE ConstraintKinds #-}
4{-# LANGUAGE DataKinds #-}
4{-# LANGUAGE DataKinds #-}
5{-# LANGUAGE DeriveDataTypeable #-}
5{-# LANGUAGE DeriveDataTypeable #-}
6{-# LANGUAGE FlexibleContexts #-}
6{-# LANGUAGE FlexibleContexts #-}
7{-# LANGUAGE FlexibleInstances #-}
7{-# LANGUAGE FlexibleInstances #-}
8{-# LANGUAGE InstanceSigs #-}
8{-# LANGUAGE InstanceSigs #-}
9+{-# LANGUAGE LambdaCase #-}
9{-# LANGUAGE MultiParamTypeClasses #-}
10{-# LANGUAGE MultiParamTypeClasses #-}
10{-# LANGUAGE OverloadedStrings #-}
11{-# LANGUAGE OverloadedStrings #-}
11{-# LANGUAGE PolyKinds #-}
12{-# LANGUAGE PolyKinds #-}
13+{-# LANGUAGE QuantifiedConstraints #-}
12{-# LANGUAGE RankNTypes #-}
14{-# LANGUAGE RankNTypes #-}
13{-# LANGUAGE ScopedTypeVariables #-}
15{-# LANGUAGE ScopedTypeVariables #-}
14{-# LANGUAGE TupleSections #-}
16{-# LANGUAGE TupleSections #-}
@@ -17,14 +19,6 @@
17{-# LANGUAGE TypeOperators #-}
19{-# LANGUAGE TypeOperators #-}
18{-# LANGUAGE UndecidableInstances #-}
20{-# LANGUAGE UndecidableInstances #-}
20−#if MIN_VERSION_base(4,9,0) && __GLASGOW_HASKELL__ >= 802
21−#define HAS_TYPE_ERROR
24−#if __GLASGOW_HASKELL__ >= 806
25−{-# LANGUAGE QuantifiedConstraints #-}
28module Servant.Server.Internal
22module Servant.Server.Internal
29 ( module Servant.Server.Internal
23 ( module Servant.Server.Internal
30 , module Servant.Server.Internal.BasicAuth
24 , module Servant.Server.Internal.BasicAuth
@@ -42,14 +36,15 @@ module Servant.Server.Internal
42import Control.Monad
36import Control.Monad
43 (join, when)
37 (join, when)
44import Control.Monad.Trans
38import Control.Monad.Trans
45− (liftIO)
39+ (liftIO, lift)
46import Control.Monad.Trans.Resource
40import Control.Monad.Trans.Resource
47− (runResourceT)
41+ (runResourceT, ReleaseKey)
48import qualified Data.ByteString as B
43import qualified Data.ByteString as B
49import qualified Data.ByteString.Builder as BB
44import qualified Data.ByteString.Builder as BB
50import qualified Data.ByteString.Char8 as BC8
45import qualified Data.ByteString.Char8 as BC8
51import qualified Data.ByteString.Lazy as BL
46import qualified Data.ByteString.Lazy as BL
52−import Data.Constraint (Dict(..))
47+import Data.Constraint (Constraint, Dict(..))
53import Data.Either
48import Data.Either
54 (partitionEithers)
49 (partitionEithers)
55import Data.Maybe
50import Data.Maybe
@@ -64,14 +59,14 @@ import qualified Data.Text as T
64import Data.Typeable
59import Data.Typeable
65import GHC.Generics
60import GHC.Generics
66import GHC.TypeLits
61import GHC.TypeLits
67− (KnownNat, KnownSymbol, natVal, symbolVal)
62+ (KnownNat, KnownSymbol, TypeError, symbolVal)
68import qualified Network.HTTP.Media as NHM
63import qualified Network.HTTP.Media as NHM
69import Network.HTTP.Types hiding
64import Network.HTTP.Types hiding
70 (Header, ResponseHeaders)
65 (Header, ResponseHeaders)
71import Network.Socket
66import Network.Socket
72 (SockAddr)
67 (SockAddr)
73import Network.Wai
68import Network.Wai
74− (Application, Request, httpVersion, isSecure, lazyRequestBody,
69+ (Application, Request, Response, ResponseReceived, httpVersion, isSecure, lazyRequestBody,
75 queryString, remoteHost, getRequestBodyChunk, requestHeaders,
70 queryString, remoteHost, getRequestBodyChunk, requestHeaders,
76 requestMethod, responseLBS, responseStream, vault)
71 requestMethod, responseLBS, responseStream, vault)
77import Prelude ()
72import Prelude ()
@@ -81,10 +76,10 @@ import Servant.API
81 CaptureAll, Description, EmptyAPI, Fragment,
76 CaptureAll, Description, EmptyAPI, Fragment,
82 FramingRender (..), FramingUnrender (..), FromSourceIO (..),
77 FramingRender (..), FramingUnrender (..), FromSourceIO (..),
83 Header', If, IsSecure (..), NoContentVerb, QueryFlag,
78 Header', If, IsSecure (..), NoContentVerb, QueryFlag,
84− QueryParam', QueryParams, Raw, ReflectMethod (reflectMethod),
79+ QueryParam', QueryParams, Raw, RawM, ReflectMethod (reflectMethod),
85 RemoteHost, ReqBody', SBool (..), SBoolI (..), SourceIO,
80 RemoteHost, ReqBody', SBool (..), SBoolI (..), SourceIO,
86 Stream, StreamBody', Summary, ToSourceIO (..), Vault, Verb,
81 Stream, StreamBody', Summary, ToSourceIO (..), Vault, Verb,
87− WithNamedContext, NamedRoutes)
82+ WithNamedContext, WithResource, NamedRoutes)
88import Servant.API.Generic (GenericMode(..), ToServant, ToServantApi, GServantProduct, toServant, fromServant)
83import Servant.API.Generic (GenericMode(..), ToServant, ToServantApi, GServantProduct, toServant, fromServant)
89import Servant.API.ContentTypes
84import Servant.API.ContentTypes
90 (AcceptHeader (..), AllCTRender (..), AllCTUnrender (..),
85 (AcceptHeader (..), AllCTRender (..), AllCTUnrender (..),
@@ -95,10 +90,15 @@ import Servant.API.Modifiers
95 unfoldRequestArgument)
90 unfoldRequestArgument)
96import Servant.API.ResponseHeaders
91import Servant.API.ResponseHeaders
97 (GetHeaders, Headers, getHeaders, getResponse)
92 (GetHeaders, Headers, getHeaders, getResponse)
93+import Servant.API.Status
98import qualified Servant.Types.SourceT as S
95import qualified Servant.Types.SourceT as S
96+import Servant.API.TypeErrors
99import Web.HttpApiData
97import Web.HttpApiData
100 (FromHttpApiData, parseHeader, parseQueryParam, parseUrlPiece,
98 (FromHttpApiData, parseHeader, parseQueryParam, parseUrlPiece,
101 parseUrlPieces)
99 parseUrlPieces)
103import Servant.Server.Internal.BasicAuth
103import Servant.Server.Internal.BasicAuth
104import Servant.Server.Internal.Context
104import Servant.Server.Internal.Context
@@ -111,14 +111,16 @@ import Servant.Server.Internal.RouteResult
111import Servant.Server.Internal.RoutingApplication
111import Servant.Server.Internal.RoutingApplication
112import Servant.Server.Internal.ServerError
112import Servant.Server.Internal.ServerError
114−#ifdef HAS_TYPE_ERROR
115import GHC.TypeLits
114import GHC.TypeLits
116 (ErrorMessage (..), TypeError)
115 (ErrorMessage (..), TypeError)
117import Servant.API.TypeLevel
116import Servant.API.TypeLevel
118 (AtLeastOneFragment, FragmentUnique)
117 (AtLeastOneFragment, FragmentUnique)
121class HasServer api context where
119class HasServer api context where
120+ -- | The type of a server for this API, given a monad to run effects in.
122+ -- Note that the result kind is @*@, so it is /not/ a monad transformer, unlike
123+ -- what the @T@ in the name might suggest.
122 type ServerT api (m :: * -> *) :: *
124 type ServerT api (m :: * -> *) :: *
@@ -180,7 +182,7 @@ instance (HasServer a context, HasServer b context) => HasServer (a :<|> b) cont
180-- > server = getBook
182-- > server = getBook
181-- > where getBook :: Text -> Handler Book
183-- > where getBook :: Text -> Handler Book
182-- > getBook isbn = ...
184-- > getBook isbn = ...
183−instance (KnownSymbol capture, FromHttpApiData a
185+instance (KnownSymbol capture, FromHttpApiData a, Typeable a
184 , HasServer api context, SBoolI (FoldLenient mods)
186 , HasServer api context, SBoolI (FoldLenient mods)
185 , HasContextEntry (MkContextWithErrorFormatter context) ErrorFormatters
187 , HasContextEntry (MkContextWithErrorFormatter context) ErrorFormatters
@@ -192,7 +194,7 @@ instance (KnownSymbol capture, FromHttpApiData a
192 hoistServerWithContext _ pc nt s = hoistServerWithContext (Proxy :: Proxy api) pc nt . s
194 hoistServerWithContext _ pc nt s = hoistServerWithContext (Proxy :: Proxy api) pc nt . s
194 route Proxy context d =
196 route Proxy context d =
195− CaptureRouter $
197+ CaptureRouter [hint] $
196 route (Proxy :: Proxy api)
198 route (Proxy :: Proxy api)
198 (addCapture d $ \ txt -> withRequest $ \ request ->
200 (addCapture d $ \ txt -> withRequest $ \ request ->
@@ -204,6 +206,7 @@ instance (KnownSymbol capture, FromHttpApiData a
205 rep = typeRep (Proxy :: Proxy Capture')
207 rep = typeRep (Proxy :: Proxy Capture')
206 formatError = urlParseErrorFormatter $ getContextEntry (mkContextWithErrorFormatter context)
208 formatError = urlParseErrorFormatter $ getContextEntry (mkContextWithErrorFormatter context)
209+ hint = CaptureHint (T.pack $ symbolVal $ Proxy @capture) (typeRep (Proxy :: Proxy a))
208-- | If you use 'CaptureAll' in one of the endpoints for your API,
211-- | If you use 'CaptureAll' in one of the endpoints for your API,
209-- this automatically requires your server-side handler to be a
212-- this automatically requires your server-side handler to be a
@@ -222,7 +225,7 @@ instance (KnownSymbol capture, FromHttpApiData a
222-- > server = getSourceFile
225-- > server = getSourceFile
223-- > where getSourceFile :: [Text] -> Handler Book
226-- > where getSourceFile :: [Text] -> Handler Book
224-- > getSourceFile pathSegments = ...
227-- > getSourceFile pathSegments = ...
225−instance (KnownSymbol capture, FromHttpApiData a
228+instance (KnownSymbol capture, FromHttpApiData a, Typeable a
226 , HasServer api context
229 , HasServer api context
227 , HasContextEntry (MkContextWithErrorFormatter context) ErrorFormatters
230 , HasContextEntry (MkContextWithErrorFormatter context) ErrorFormatters
@@ -234,7 +237,7 @@ instance (KnownSymbol capture, FromHttpApiData a
234 hoistServerWithContext _ pc nt s = hoistServerWithContext (Proxy :: Proxy api) pc nt . s
237 hoistServerWithContext _ pc nt s = hoistServerWithContext (Proxy :: Proxy api) pc nt . s
236 route Proxy context d =
239 route Proxy context d =
237− CaptureAllRouter $
240+ CaptureAllRouter [hint] $
238 route (Proxy :: Proxy api)
241 route (Proxy :: Proxy api)
240 (addCapture d $ \ txts -> withRequest $ \ request ->
243 (addCapture d $ \ txts -> withRequest $ \ request ->
@@ -245,6 +248,43 @@ instance (KnownSymbol capture, FromHttpApiData a
246 rep = typeRep (Proxy :: Proxy CaptureAll)
249 rep = typeRep (Proxy :: Proxy CaptureAll)
247 formatError = urlParseErrorFormatter $ getContextEntry (mkContextWithErrorFormatter context)
250 formatError = urlParseErrorFormatter $ getContextEntry (mkContextWithErrorFormatter context)
251+ hint = CaptureHint (T.pack $ symbolVal $ Proxy @capture) (typeRep (Proxy :: Proxy [a]))
253+-- | If you use 'WithResource' in one of the endpoints for your API Servant
254+-- will provide the handler for this endpoint an argument of the specified type.
255+-- The lifespan of this resource will be automatically managed by Servant. This
256+-- resource will be created before the handler starts and it will be destoyed
257+-- after it ends. A new resource is created for each request to the endpoint.
259+-- The creation and destruction are done using a 'Data.Acquire.Acquire'
260+-- provided via server 'Context'.
264+-- > type MyApi = WithResource Handle :> "writeToFile" :> Post '[JSON] NoContent
266+-- > server :: Server MyApi
267+-- > server = writeToFile
268+-- > where writeToFile :: (ReleaseKey, Handle) -> Handler NoContent
269+-- > writeToFile (_, h) = hPutStrLn h "message"
271+-- In addition to the resource, the handler will also receive a 'ReleaseKey'
272+-- which can be used to deallocate the resource before the end of the request
275+instance (HasServer api ctx, HasContextEntry ctx (Acquire a))
276+ => HasServer (WithResource a :> api) ctx where
278+ type ServerT (WithResource a :> api) m = (ReleaseKey, a) -> ServerT api m
280+ hoistServerWithContext _ pc nt s = hoistServerWithContext (Proxy @api) pc nt . s
282+ route Proxy context d = route (Proxy @api) context (d `addParameterCheck` allocateResource)
284+ allocateResource :: DelayedIO (ReleaseKey, a)
285+ allocateResource = DelayedIO $ lift $ allocateAcquire (getContextEntry context)
249allowedMethodHead :: Method -> Request -> Bool
289allowedMethodHead :: Method -> Request -> Bool
250allowedMethodHead method request = method == methodGet && requestMethod request == methodHead
290allowedMethodHead method request = method == methodGet && requestMethod request == methodHead
@@ -308,7 +348,7 @@ instance {-# OVERLAPPABLE #-}
309 route Proxy _ = methodRouter ([],) method (Proxy :: Proxy ctypes) status
349 route Proxy _ = methodRouter ([],) method (Proxy :: Proxy ctypes) status
310 where method = reflectMethod (Proxy :: Proxy method)
350 where method = reflectMethod (Proxy :: Proxy method)
311− status = toEnum . fromInteger $ natVal (Proxy :: Proxy status)
351+ status = statusFromNat (Proxy :: Proxy status)
313instance {-# OVERLAPPING #-}
353instance {-# OVERLAPPING #-}
314 ( AllCTRender ctypes a, ReflectMethod method, KnownNat status
354 ( AllCTRender ctypes a, ReflectMethod method, KnownNat status
@@ -320,7 +360,7 @@ instance {-# OVERLAPPING #-}
321 route Proxy _ = methodRouter (\x -> (getHeaders x, getResponse x)) method (Proxy :: Proxy ctypes) status
361 route Proxy _ = methodRouter (\x -> (getHeaders x, getResponse x)) method (Proxy :: Proxy ctypes) status
322 where method = reflectMethod (Proxy :: Proxy method)
362 where method = reflectMethod (Proxy :: Proxy method)
323− status = toEnum . fromInteger $ natVal (Proxy :: Proxy status)
363+ status = statusFromNat (Proxy :: Proxy status)
325instance (ReflectMethod method) =>
365instance (ReflectMethod method) =>
326 HasServer (NoContentVerb method) context where
366 HasServer (NoContentVerb method) context where
@@ -341,7 +381,7 @@ instance {-# OVERLAPPABLE #-}
342 route Proxy _ = streamRouter ([],) method status (Proxy :: Proxy framing) (Proxy :: Proxy ctype)
382 route Proxy _ = streamRouter ([],) method status (Proxy :: Proxy framing) (Proxy :: Proxy ctype)
343 where method = reflectMethod (Proxy :: Proxy method)
383 where method = reflectMethod (Proxy :: Proxy method)
344− status = toEnum . fromInteger $ natVal (Proxy :: Proxy status)
384+ status = statusFromNat (Proxy :: Proxy status)
347instance {-# OVERLAPPING #-}
387instance {-# OVERLAPPING #-}
@@ -355,7 +395,7 @@ instance {-# OVERLAPPING #-}
356 route Proxy _ = streamRouter (\x -> (getHeaders x, getResponse x)) method status (Proxy :: Proxy framing) (Proxy :: Proxy ctype)
396 route Proxy _ = streamRouter (\x -> (getHeaders x, getResponse x)) method status (Proxy :: Proxy framing) (Proxy :: Proxy ctype)
357 where method = reflectMethod (Proxy :: Proxy method)
397 where method = reflectMethod (Proxy :: Proxy method)
358− status = toEnum . fromInteger $ natVal (Proxy :: Proxy status)
398+ status = statusFromNat (Proxy :: Proxy status)
361streamRouter :: forall ctype a c chunk env framing. (MimeRender ctype chunk, FramingRender framing, ToSourceIO chunk a) =>
401streamRouter :: forall ctype a c chunk env framing. (MimeRender ctype chunk, FramingRender framing, ToSourceIO chunk a) =>
@@ -613,6 +653,35 @@ instance HasServer Raw context where
613 Fail a -> respond $ Fail a
653 Fail a -> respond $ Fail a
614 FailFatal e -> respond $ FailFatal e
654 FailFatal e -> respond $ FailFatal e
656+-- | Just pass the request to the underlying application and serve its response.
660+-- > type MyApi = "images" :> Raw
662+-- > server :: Server MyApi
663+-- > server = serveDirectory "/var/www/images"
664+instance HasServer RawM context where
665+ type ServerT RawM m = Request -> (Response -> IO ResponseReceived) -> m ResponseReceived
670+ -> Delayed env (Request -> (Response -> IO ResponseReceived) -> Handler ResponseReceived) -> Router env
671+ route _ _ handleDelayed = RawRouter $ \env request respond -> runResourceT $ do
672+ routeResult <- runDelayed handleDelayed env request
673+ let respond' = liftIO . respond
674+ liftIO $ case routeResult of
675+ Route handler -> runHandler (handler request (respond . Route)) >>=
677+ Left e -> respond' $ FailFatal e
679+ Fail e -> respond' $ Fail e
680+ FailFatal e -> respond' $ FailFatal e
682+ hoistServerWithContext _ _ f srvM = \req respond -> f (srvM req respond)
616-- | If you use 'ReqBody' in one of the endpoints for your API,
685-- | If you use 'ReqBody' in one of the endpoints for your API,
617-- this automatically requires your server-side handler to be a function
686-- this automatically requires your server-side handler to be a function
618-- that takes an argument of the type specified by 'ReqBody'.
687-- that takes an argument of the type specified by 'ReqBody'.
@@ -794,7 +863,7 @@ instance ( KnownSymbol realm
794-- * helpers
863-- * helpers
796ct_wildcard :: B.ByteString
865ct_wildcard :: B.ByteString
797−ct_wildcard = "*" <> "/" <> "*" -- Because CPP
866+ct_wildcard = "*" <> "/" <> "*"
799getAcceptHeader :: Request -> AcceptHeader
868getAcceptHeader :: Request -> AcceptHeader
800getAcceptHeader = AcceptHeader . fromMaybe ct_wildcard . lookup hAccept . requestHeaders
869getAcceptHeader = AcceptHeader . fromMaybe ct_wildcard . lookup hAccept . requestHeaders
@@ -822,39 +891,19 @@ instance (HasContextEntry context (NamedContext name subContext), HasServer subA
822 hoistServerWithContext _ _ nt s = hoistServerWithContext (Proxy :: Proxy subApi) (Proxy :: Proxy subContext) nt s
891 hoistServerWithContext _ _ nt s = hoistServerWithContext (Proxy :: Proxy subApi) (Proxy :: Proxy subContext) nt s
824-------------------------------------------------------------------------------
893-------------------------------------------------------------------------------
825−-- TypeError helpers
894+-- Custom type errors
826-------------------------------------------------------------------------------
895-------------------------------------------------------------------------------
828−#ifdef HAS_TYPE_ERROR
897+-- Erroring instance for 'HasServer' when a combinator is not fully applied
829−-- | This instance catches mistakes when there are non-saturated
898+instance TypeError (PartialApplication
830−-- type applications on LHS of ':>'.
899+#if __GLASGOW_HASKELL__ >= 904
831−--
900+ @(Type -> [Type] -> Constraint)
832−-- >>> serve (Proxy :: Proxy (Capture "foo" :> Get '[JSON] Int)) (error "...")
901+#endif
834−-- ...Expected something of kind Symbol or *, got: k -> l on the LHS of ':>'.
835−-- ...Maybe you haven't applied enough arguments to
836−-- ...Capture' '[] "foo"
839−-- >>> undefined :: Server (Capture "foo" :> Get '[JSON] Int)
841−-- ...Expected something of kind Symbol or *, got: k -> l on the LHS of ':>'.
842−-- ...Maybe you haven't applied enough arguments to
843−-- ...Capture' '[] "foo"
846−instance TypeError (HasServerArrowKindError arr) => HasServer ((arr :: k -> l) :> api) context
902+ HasServer arr) => HasServer ((arr :: a -> b) :> sub) context
848− type ServerT (arr :> api) m = TypeError (HasServerArrowKindError arr)
904+ type ServerT (arr :> sub) _ = TypeError (PartialApplication (HasServer :: * -> [*] -> Constraint) arr)
849− -- it doesn't really matter what sub route we peak
905+ route = error "unreachable"
850− route _ _ _ = error "servant-server panic: impossible happened in HasServer (arr :> api)"
851− hoistServerWithContext _ _ _ = id
906+ hoistServerWithContext _ _ _ _ = error "unreachable"
853−-- Cannot have TypeError here, otherwise use of this symbol will error :)
854−type HasServerArrowKindError arr =
855− 'Text "Expected something of kind Symbol or *, got: k -> l on the LHS of ':>'."
856− ':$$: 'Text "Maybe you haven't applied enough arguments to"
859-- | This instance prevents from accidentally using '->' instead of ':>'
908-- | This instance prevents from accidentally using '->' instead of ':>'
@@ -888,7 +937,19 @@ type HasServerArrowTypeError a b =
888 ':$$: 'ShowType a
937 ':$$: 'ShowType a
889 ':$$: 'Text "and"
938 ':$$: 'Text "and"
890 ':$$: 'ShowType b
939 ':$$: 'ShowType b
941+-- Erroring instances for 'HasServer' for unknown API combinators
943+-- XXX: This omits the @context@ parameter, e.g.:
945+-- "There is no instance for HasServer (Bool :> …)". Do we care ?
946+instance {-# OVERLAPPABLE #-} TypeError (NoInstanceForSub
947+#if __GLASGOW_HASKELL__ >= 904
948+ @(Type -> [Type] -> Constraint)
950+ HasServer ty) => HasServer (ty :> sub) context
952+instance {-# OVERLAPPABLE #-} TypeError (NoInstanceFor (HasServer api context)) => HasServer api context
893-- | Ignore @'Fragment'@ in server handlers.
954-- | Ignore @'Fragment'@ in server handlers.
894-- See <https://ietf.org/rfc/rfc2616.html#section-15.1.3> for more details.
955-- See <https://ietf.org/rfc/rfc2616.html#section-15.1.3> for more details.
@@ -901,11 +962,7 @@ type HasServerArrowTypeError a b =
901-- > server = getBooks
962-- > server = getBooks
902-- > where getBooks :: Handler [Book]
963-- > where getBooks :: Handler [Book]
903-- > getBooks = ...return all books...
964-- > getBooks = ...return all books...
904−#ifdef HAS_TYPE_ERROR
905instance (AtLeastOneFragment api, FragmentUnique (Fragment a1 :> api), HasServer api context)
965instance (AtLeastOneFragment api, FragmentUnique (Fragment a1 :> api), HasServer api context)
907−instance (HasServer api context)
909 => HasServer (Fragment a1 :> api) context where
966 => HasServer (Fragment a1 :> api) context where
910 type ServerT (Fragment a1 :> api) m = ServerT api m
967 type ServerT (Fragment a1 :> api) m = ServerT api m
@@ -924,8 +981,6 @@ instance GenericMode (AsServerT m) where
924type AsServer = AsServerT Handler
981type AsServer = AsServerT Handler
927−#if __GLASGOW_HASKELL__ >= 806
929-- | Set of constraints required to convert to / from vanilla server types.
984-- | Set of constraints required to convert to / from vanilla server types.
930type GServerConstraints api m =
985type GServerConstraints api m =
931 ( ToServant api (AsServerT m) ~ ServerT (ToServantApi api) m
986 ( ToServant api (AsServerT m) ~ ServerT (ToServantApi api) m
@@ -946,13 +1001,13 @@ type GServerConstraints api m =
946-- is provided in this module for all record APIs.
1001-- is provided in this module for all record APIs.
948class GServer (api :: * -> *) (m :: * -> *) where
1003class GServer (api :: * -> *) (m :: * -> *) where
949− proof :: Dict (GServerConstraints api m)
1004+ gServerProof :: Dict (GServerConstraints api m)
952 ( ToServant api (AsServerT m) ~ ServerT (ToServantApi api) m
1007 ( ToServant api (AsServerT m) ~ ServerT (ToServantApi api) m
953 , GServantProduct (Rep (api (AsServerT m)))
1008 , GServantProduct (Rep (api (AsServerT m)))
954 ) => GServer api m where
1009 ) => GServer api m where
955− proof = Dict
1010+ gServerProof = Dict
958 ( HasServer (ToServantApi api) context
1013 ( HasServer (ToServantApi api) context
@@ -968,7 +1023,7 @@ instance
968 -> Delayed env (api (AsServerT Handler))
1023 -> Delayed env (api (AsServerT Handler))
969 -> Router env
1024 -> Router env
970 route _ ctx delayed =
1025 route _ ctx delayed =
971− case proof @api @Handler of
1026+ case gServerProof @api @Handler of
972 Dict -> route (Proxy @(ToServantApi api)) ctx (toServant <$> delayed)
1027 Dict -> route (Proxy @(ToServantApi api)) ctx (toServant <$> delayed)
974 hoistServerWithContext
1029 hoistServerWithContext
@@ -978,7 +1033,7 @@ instance
978 -> api (AsServerT m)
1033 -> api (AsServerT m)
979 -> api (AsServerT n)
1034 -> api (AsServerT n)
980 hoistServerWithContext _ pctx nat server =
1035 hoistServerWithContext _ pctx nat server =
981− case (proof @api @m, proof @api @n) of
1036+ case (gServerProof @api @m, gServerProof @api @n) of
982 (Dict, Dict) ->
1037 (Dict, Dict) ->
983 fromServant servantSrvN
1038 fromServant servantSrvN
@@ -986,5 +1041,3 @@ instance
986 toServant server
1041 toServant server
987 servantSrvN :: ServerT (ToServantApi api) n =
1042 servantSrvN :: ServerT (ToServantApi api) n =
988 hoistServerWithContext (Proxy @(ToServantApi api)) pctx nat servantSrvM
1043 hoistServerWithContext (Proxy @(ToServantApi api)) pctx nat servantSrvM