@@ -17,55 +17,17 @@ import Servant.Client.Core
1717import Servant.Server
1818import Servant.Server.Internal
1919
20−-- | Combinator for your Servant API description. Prepend it to your API for greater enjoyment!
21−-- Example:
22−--
23−-- @
24−-- type MyAPI = RequestTracking :> "ping" :> Get '[JSON] Text
25−-- @
26−--
27−-- In addition to the API combinator, you also need to create a context handler that will
28−-- handler the tracking data (see 'ReqtrackInfo') and produce desired output, which in turn
29−-- will be passed to your API handlers.
30−-- The type of values passed to API handlers is controlled by @type instance TrackingData RequestTracking@,
31−-- which isn't set by default.
32−-- The server code should look something like this:
33−--
34−-- @
35−-- data TrackingArg = ...
36−--
37−-- type instance TrackingData RequestTracking = TrackingArg
38−--
39−-- trackingHandler :: ReqtrackingHandler (Maybe ReqtrackInfo) TrackingArg
40−-- trackingHandler = mkReqtrackingHandler $ \mrti ->
41−-- case mrti of
42−-- Just rti -> ... -- Do something with ReqtrackInfo, return TrackingArg
43−-- Nothing -> ...
44−--
45−-- @
20+-- | Types to use in you API description
4621data RequestTracking
4722
48−-- | See 'RequestTracking'
4923type family TrackingData a
5024
5125-- | Same as above, except no argument is passed to a handler.
5226data RequestTracking_
5327
54−-- | Servant context handler used for processing 'ReqtrackInfo' before passing the result to endpoint handlers.
55−-- Use 'mkReqtrackingHandler' in your code instead of the constructor.
56−newtype ReqtrackingHandler r o = ReqtrackingHandler { runReqtrackingHandler :: r -> Handler o
28+newtype ReqtrackingHandler r o = ReqtrackingHandler { unReqtrackingHandler :: r -> Handler o
5729 } deriving (Functor)
5830
59−instance Applicative (ReqtrackingHandler r) where
60− pure x = ReqtrackingHandler $ \_ -> pure x
61− f <*> v = ReqtrackingHandler $ \r -> runReqtrackingHandler f r <*> runReqtrackingHandler v r
62−
63−instance Monad (ReqtrackingHandler r) where
64− return = pure
65− f >>= g = ReqtrackingHandler $ \r -> do a <- runReqtrackingHandler f r
66− runReqtrackingHandler (g a) r
67−
68−-- | Smart constructor to create 'ReqtrackingHandler'.
6931mkReqtrackingHandler :: (Maybe ReqtrackInfo -> Handler o) -> ReqtrackingHandler (Maybe ReqtrackInfo) o
7032mkReqtrackingHandler = ReqtrackingHandler
7133
@@ -116,7 +78,6 @@ instance HasClient m api => HasClient m (RequestTracking_ :> api) where
11678 hoistClientMonad pm Proxy f cl = hoistClientMonad pm (Proxy :: Proxy api) f cl
11779
11880
119−-- | Headers list to use with 'Headers'. Currently unused.
12081type ReqtrackHeaders = '[ Header RequestIdHdr ByteString
12182 , Header RequestLevelHdr Word
12283 , Header RequestSourceHdr ByteString