on master help sign in
conflict resolution
commit340df642e021f7b035be3b358e49733848bc72d4 authorIsaac Shapira <fresheyeball@gmail.com> dateFri 2 Mar 2018, 17:37 (9 years ago) parent69d855fcff3499
3 files changed+444−86
servant-reflex.cabal+2−1 src/Servant/Reflex.hs+226−48 src/Servant/Reflex/Multi.hs+216−37
servant-reflex.cabal+2−1
@@ -42,7 +42,8 @@ library
4242 reflex >= 0.5 && < 0.6,
4343 reflex-dom-core == 0.4 && < 0.5,
4444 safe >= 0.3.9 && < 0.4,
45− servant >= 0.8 && < 0.12,
45+ servant >= 0.13 && < 0.14,
46+ servant-checked-exceptions >= 1.1.0.0 && < 1.2,
4647 servant-auth >= 0.2.1 && < 0.4,
4748 string-conversions >= 0.4 && < 0.5,
4849 text >= 1.2 && < 1.3,
src/Servant/Reflex.hs+226−48
@@ -42,56 +42,101 @@ module Servant.Reflex
4242
4343------------------------------------------------------------------------------
4444import Control.Applicative
45−import qualified Data.ByteString as BS
46−import qualified Data.ByteString.Lazy as BL
47−import Data.CaseInsensitive (mk)
45+import qualified Data.ByteString as BS
46+import qualified Data.ByteString.Lazy as BL
47+import Data.CaseInsensitive (mk)
4848import Data.Functor.Identity
49−import Data.Kind (Type)
50−import qualified Data.Map as Map
51−import Data.Monoid ((<>))
52−import Data.Proxy (Proxy (..))
53−import qualified Data.Set as Set
54−import Data.Text (Text)
55−import qualified Data.Text as T
56−import qualified Data.Text.Encoding as E
57−import qualified Data.Text.Lazy as TL
58−import GHC.Exts (Constraint)
59−import GHC.TypeLits (KnownSymbol, symbolVal)
60−import GHCJS.DOM.Types (Blob)
61−import Servant.API ((:<|>) (..), (:>), Accept (..),
62− BasicAuth, BasicAuthData,
63− BuildHeadersTo (..), Capture,
64− FormUrlEncoded, Header, Headers (..),
65− HttpVersion, IsSecure, JSON,
66− MimeRender (..), NoContent,
67− OctetStream, PlainText, QueryFlag,
68− QueryParam, QueryParams, Raw,
69− ReflectMethod (..), RemoteHost,
70− ReqBody, ToHttpApiData (..), Vault,
71− Verb, contentType)
72−import qualified Servant.Auth as Auth
73−
74−import Reflex.Dom.Core (Dynamic, Event, IsXhrPayload, Reflex,
75− XhrRequest (..), XhrResponse (..),
76− XhrResponseHeaders (..),
77− attachPromptlyDynWith, constDyn, ffor,
78− fmapMaybe, leftmost,
79− performRequestsAsync)
49+import Data.Kind (Type)
50+import qualified Data.Map as Map
51+import Data.Monoid ((<>))
52+import Data.Proxy (Proxy (..))
53+import qualified Data.Set as Set
54+import Data.Text (Text)
55+import qualified Data.Text as T
56+import qualified Data.Text.Encoding as E
57+import qualified Data.Text.Lazy as TL
58+import GHC.Exts (Constraint)
59+import GHC.TypeLits (KnownSymbol,
60+ symbolVal)
61+import GHCJS.DOM.Types (Blob)
62+import Servant.API ((:<|>) (..),
63+ (:>),
64+ Accept (..),
65+ BasicAuth,
66+ BasicAuthData,
67+ BuildHeadersTo (..),
68+ Capture,
69+ FormUrlEncoded,
70+ Header,
71+ Headers (..),
72+ HttpVersion,
73+ IsSecure,
74+ JSON,
75+ MimeRender (..),
76+ NoContent,
77+ OctetStream,
78+ PlainText,
79+ QueryFlag,
80+ QueryParam,
81+ QueryParams,
82+ Raw,
83+ ReflectMethod (..),
84+ RemoteHost,
85+ ReqBody,
86+ ToHttpApiData (..),
87+ Vault, Verb,
88+ contentType)
89+import qualified Servant.Auth as Auth
90+
91+import Reflex.Dom.Core (Dynamic,
92+ Event,
93+ IsXhrPayload,
94+ Reflex,
95+ XhrRequest (..),
96+ XhrResponse (..),
97+ XhrResponseHeaders (..),
98+ attachPromptlyDynWith,
99+ constDyn,
100+ ffor,
101+ fmapMaybe,
102+ leftmost,
103+ performRequestsAsync)
80104------------------------------------------------------------------------------
81−import Servant.Common.BaseUrl (BaseUrl (..), Scheme (..),
82− SupportsServantReflex, baseUrlWidget,
83− showBaseUrl)
84−import Servant.Common.Req (ClientOptions (..), MimeUnrender (..),
85− QParam (..), QueryPart (..), Req (..),
86− ReqResult (..), addHeader, authData,
87− defReq, defaultClientOptions,
88− evalResponse, performRequestsCT,
89− performRequestsNoBody,
90− performSomeRequestsAsync,
91− prependToPathParts, qParamToQueryPart,
92− qParams, reqBody, reqFailure,
93− reqMethod, reqSuccess, reqTag,
94− respHeaders, response, withCredentials)
105+import Servant.Checked.Exceptions.Internal.Envelope (Envelope)
106+import Servant.Checked.Exceptions.Internal.Servant.API (NoThrow,
107+ Throwing,
108+ ThrowingNonterminal,
109+ Throws)
110+import Servant.Common.BaseUrl (BaseUrl (..),
111+ Scheme (..),
112+ SupportsServantReflex,
113+ baseUrlWidget,
114+ showBaseUrl)
115+import Servant.Common.Req (ClientOptions (..),
116+ MimeUnrender (..),
117+ QParam (..),
118+ QueryPart (..),
119+ Req (..),
120+ ReqResult (..),
121+ addHeader,
122+ authData,
123+ defReq,
124+ defaultClientOptions,
125+ evalResponse,
126+ performRequestsCT,
127+ performRequestsNoBody,
128+ performSomeRequestsAsync,
129+ prependToPathParts,
130+ qParamToQueryPart,
131+ qParams,
132+ reqBody,
133+ reqFailure,
134+ reqMethod,
135+ reqSuccess,
136+ reqTag,
137+ respHeaders,
138+ response,
139+ withCredentials)
95140
96141
97142-- * Accessing APIs as a Client
@@ -621,3 +666,136 @@ type family HasCookieAuth xs :: Constraint where
621666 HasCookieAuth '[] = CookieAuthNotEnabled
622667
623668class CookieAuthNotEnabled
669+
670+{- servant-checked-exceptions
671+~~~~~~~~~~~~~~~~~~~~~
672+-}
673+
674+-- | Change a 'Throws' into 'Throwing'.
675+instance (HasClient t m (Throwing '[e] :> api) tag) => HasClient t m (Throws e :> api) tag where
676+ type Client t m (Throws e :> api) tag = Client t m (Throwing '[e] :> api) tag
677+
678+ clientWithRoute
679+ :: Proxy (Throws e :> api)
680+ -> Proxy m
681+ -> Proxy tag
682+ -> Req t
683+ -> Dynamic t BaseUrl
684+ -> ClientOptions
685+ -> Client t m (Throwing '[e] :> api) tag
686+ clientWithRoute _ = clientWithRoute (Proxy :: Proxy (Throwing '[e] :> api))
687+
688+-- | When @'Throwing' es@ comes before a 'Verb', change it into the same 'Verb'
689+-- but returning an @'Envelope' es@.
690+instance (HasClient t m (Verb method status ctypes (Envelope es a)) tag) =>
691+ HasClient t m (Throwing es :> Verb method status ctypes a) tag where
692+
693+ type Client t m (Throwing es :> Verb method status ctypes a) tag =
694+ Client t m (Verb method status ctypes (Envelope es a)) tag
695+
696+ clientWithRoute
697+ :: Proxy (Throwing es :> Verb method status ctypes a)
698+ -> Proxy m
699+ -> Proxy tag
700+ -> Req t
701+ -> Dynamic t BaseUrl
702+ -> ClientOptions
703+ -> Client t m (Verb method status ctypes (Envelope es a)) tag
704+ clientWithRoute Proxy =
705+ clientWithRoute (Proxy :: Proxy (Verb method status ctypes (Envelope es a)))
706+
707+-- | When 'NoThrow' comes before a 'Verb', change it into the same 'Verb'
708+-- but returning an @'Envelope' \'[]@.
709+instance (HasClient t m (Verb method status ctypes (Envelope '[] a)) tag) =>
710+ HasClient t m (NoThrow :> Verb method status ctypes a) tag where
711+
712+ type Client t m (NoThrow :> Verb method status ctypes a) tag =
713+ Client t m (Verb method status ctypes (Envelope '[] a)) tag
714+
715+ clientWithRoute
716+ :: Proxy (NoThrow :> Verb method status ctypes a)
717+ -> Proxy m
718+ -> Proxy tag
719+ -> Req t
720+ -> Dynamic t BaseUrl
721+ -> ClientOptions
722+ -> Client t m (Verb method status ctypes (Envelope '[] a)) tag
723+ clientWithRoute Proxy =
724+ clientWithRoute (Proxy :: Proxy (Verb method status ctypes (Envelope '[] a)))
725+
726+-- | When @'Throwing' es@ comes before ':<|>', push @'Throwing' es@ into each
727+-- branch of the API.
728+instance HasClient t m ((Throwing es :> api1) :<|> (Throwing es :> api2)) tag =>
729+ HasClient t m (Throwing es :> (api1 :<|> api2)) tag where
730+
731+ type Client t m (Throwing es :> (api1 :<|> api2)) tag =
732+ Client t m ((Throwing es :> api1) :<|> (Throwing es :> api2)) tag
733+
734+ clientWithRoute
735+ :: Proxy (Throwing es :> (api1 :<|> api2))
736+ -> Proxy m
737+ -> Proxy tag
738+ -> Req t
739+ -> Dynamic t BaseUrl
740+ -> ClientOptions
741+ -> Client t m ((Throwing es :> api1) :<|> (Throwing es :> api2)) tag
742+ clientWithRoute _ =
743+ clientWithRoute (Proxy :: Proxy ((Throwing es :> api1) :<|> (Throwing es :> api2)))
744+
745+-- | When 'NoThrow' comes before ':<|>', push 'NoThrow' into each branch of the
746+-- API.
747+instance HasClient t m ((NoThrow :> api1) :<|> (NoThrow :> api2)) tag =>
748+ HasClient t m (NoThrow :> (api1 :<|> api2)) tag where
749+
750+ type Client t m (NoThrow :> (api1 :<|> api2)) tag =
751+ Client t m ((NoThrow :> api1) :<|> (NoThrow :> api2)) tag
752+
753+ clientWithRoute
754+ :: Proxy (NoThrow :> (api1 :<|> api2))
755+ -> Proxy m
756+ -> Proxy tag
757+ -> Req t
758+ -> Dynamic t BaseUrl
759+ -> ClientOptions
760+ -> Client t m ((NoThrow :> api1) :<|> (NoThrow :> api2)) tag
761+ clientWithRoute _ =
762+ clientWithRoute (Proxy :: Proxy ((NoThrow :> api1) :<|> (NoThrow :> api2)))
763+
764+-- | When a @'Throws' e@ comes immediately after a @'Throwing' es@, 'Snoc' the
765+-- @e@ onto the @es@. Otherwise, if @'Throws' e@ comes before any other
766+-- combinator, push it down so it is closer to the 'Verb'.
767+instance HasClient t m (ThrowingNonterminal (Throwing es :> api :> apis)) tag =>
768+ HasClient t m (Throwing es :> api :> apis) tag where
769+
770+ type Client t m (Throwing es :> api :> apis) tag =
771+ Client t m (ThrowingNonterminal (Throwing es :> api :> apis)) tag
772+
773+ clientWithRoute
774+ :: Proxy (Throwing es :> api :> apis)
775+ -> Proxy m
776+ -> Proxy tag
777+ -> Req t
778+ -> Dynamic t BaseUrl
779+ -> ClientOptions
780+ -> Client t m (ThrowingNonterminal (Throwing es :> api :> apis)) tag
781+ clientWithRoute _ =
782+ clientWithRoute (Proxy :: Proxy (ThrowingNonterminal (Throwing es :> api :> apis)))
783+
784+-- | When 'NoThrow' comes before any other combinator, push it down so it is
785+-- closer to the 'Verb'.
786+instance HasClient t m (api :> NoThrow :> apis) tag =>
787+ HasClient t m (NoThrow :> api :> apis) tag where
788+
789+ type Client t m (NoThrow :> api :> apis) tag =
790+ Client t m (api :> NoThrow :> apis) tag
791+
792+ clientWithRoute
793+ :: Proxy (NoThrow :> api :> apis)
794+ -> Proxy m
795+ -> Proxy tag
796+ -> Req t
797+ -> Dynamic t BaseUrl
798+ -> ClientOptions
799+ -> Client t m (api :> NoThrow :> apis) tag
800+ clientWithRoute _ =
801+ clientWithRoute (Proxy :: Proxy (api :> NoThrow :> apis))
src/Servant/Reflex/Multi.hs+216−37
@@ -38,44 +38,83 @@ module Servant.Reflex.Multi (
3838 ) where
3939
4040------------------------------------------------------------------------------
41−import Control.Applicative (liftA2)
42−import Data.Functor.Compose (Compose (..), getCompose)
43−import Data.Proxy (Proxy (..))
44−import qualified Data.Set as Set
45−import Data.Text (Text)
46−import qualified Data.Text as T
47−import qualified Data.Text.Encoding as E
48−import GHC.TypeLits (KnownSymbol, symbolVal)
49−import Servant.API ((:<|>) (..), (:>), BasicAuth,
50− BasicAuthData, BuildHeadersTo (..),
51− Capture, Header, Headers (..),
52− HttpVersion, IsSecure, NoContent,
53− QueryFlag, QueryParam, QueryParams,
54− Raw, ReflectMethod (..), RemoteHost,
55− ReqBody, ToHttpApiData (..), Vault,
56− Verb, contentType)
57−
58−import Reflex.Dom.Core (Dynamic, Event, IsXhrPayload, Reflex,
59− XhrRequest (..),
60− XhrResponseHeaders (..),
61− attachPromptlyDynWith, constDyn)
41+import Control.Applicative (liftA2)
42+import Data.Functor.Compose (Compose (..),
43+ getCompose)
44+import Data.Proxy (Proxy (..))
45+import qualified Data.Set as Set
46+import Data.Text (Text)
47+import qualified Data.Text as T
48+import qualified Data.Text.Encoding as E
49+import GHC.TypeLits (KnownSymbol,
50+ symbolVal)
51+import Servant.API ((:<|>) (..),
52+ (:>),
53+ BasicAuth,
54+ BasicAuthData,
55+ BuildHeadersTo (..),
56+ Capture,
57+ Header,
58+ Headers (..),
59+ HttpVersion,
60+ IsSecure,
61+ NoContent,
62+ QueryFlag,
63+ QueryParam,
64+ QueryParams,
65+ Raw,
66+ ReflectMethod (..),
67+ RemoteHost,
68+ ReqBody,
69+ ToHttpApiData (..),
70+ Vault, Verb,
71+ contentType)
72+
73+import Reflex.Dom.Core (Dynamic,
74+ Event,
75+ IsXhrPayload,
76+ Reflex,
77+ XhrRequest (..),
78+ XhrResponseHeaders (..),
79+ attachPromptlyDynWith,
80+ constDyn)
6281------------------------------------------------------------------------------
63−import Servant.Common.BaseUrl (BaseUrl (..), Scheme (..),
64− SupportsServantReflex)
65−import Servant.Common.Req (ClientOptions, MimeUnrender,
66− QParam (..), QueryPart (..), Req (..),
67− ReqResult (..), SomeXhrRequest (..),
68− addHeader, authData, defReq,
69− defaultClientOptions,
70− performRequestsCT,
71− performRequestsNoBody,
72− performSomeRequestsAsync,
73− prependToPathParts, qParamToQueryPart,
74− qParams, reqBody, reqFailure,
75− reqMethod, reqSuccess, reqSuccess',
76− respHeaders, response, withCredentials)
77−import Servant.Reflex (BuildHeaderKeysTo (..),
78− GHCJS'MimeRender (..), toHeaders)
82+import Servant.Checked.Exceptions.Internal.Envelope (Envelope)
83+import Servant.Checked.Exceptions.Internal.Servant.API (NoThrow,
84+ Throwing,
85+ ThrowingNonterminal,
86+ Throws)
87+import Servant.Common.BaseUrl (BaseUrl (..),
88+ Scheme (..),
89+ SupportsServantReflex)
90+import Servant.Common.Req (ClientOptions,
91+ MimeUnrender,
92+ QParam (..),
93+ QueryPart (..),
94+ Req (..),
95+ ReqResult (..),
96+ SomeXhrRequest (..),
97+ addHeader,
98+ authData,
99+ defReq,
100+ defaultClientOptions,
101+ performRequestsCT,
102+ performRequestsNoBody,
103+ performSomeRequestsAsync,
104+ prependToPathParts,
105+ qParamToQueryPart,
106+ qParams,
107+ reqBody,
108+ reqFailure,
109+ reqMethod,
110+ reqSuccess,
111+ reqSuccess',
112+ respHeaders,
113+ response,
114+ withCredentials)
115+import Servant.Reflex (BuildHeaderKeysTo (..),
116+ GHCJS'MimeRender (..),
117+ toHeaders)
79118
80119
81120------------------------------------------------------------------------------
@@ -389,3 +428,143 @@ instance (HasClientMulti t m api f tag, Reflex t, Applicative f)
389428 where
390429 req' a r = r { authData = Just (constDyn a) }
391430 reqs' = liftA2 req' <$> authdatas <*> reqs
431+
432+{- servant-checked-exceptions
433+~~~~~~~~~~~~~~~~~~~~~
434+-}
435+
436+-- | Change a 'Throws' into 'Throwing'.
437+instance (HasClientMulti t m (Throwing '[e] :> api) f tag) => HasClientMulti t m (Throws e :> api) f tag where
438+ type ClientMulti t m (Throws e :> api) f tag = ClientMulti t m (Throwing '[e] :> api) f tag
439+
440+ clientWithRouteMulti
441+ :: Proxy (Throws e :> api)
442+ -> Proxy m
443+ -> Proxy f
444+ -> Proxy tag
445+ -> Dynamic t (f (Req t))
446+ -> Dynamic t BaseUrl
447+ -> ClientOptions
448+ -> ClientMulti t m (Throwing '[e] :> api) f tag
449+ clientWithRouteMulti _ = clientWithRouteMulti (Proxy :: Proxy (Throwing '[e] :> api))
450+
451+-- | When @'Throwing' es@ comes before a 'Verb', change it into the same 'Verb'
452+-- but returning an @'Envelope' es@.
453+instance (HasClientMulti t m (Verb method status ctypes (Envelope es a)) f tag) =>
454+ HasClientMulti t m (Throwing es :> Verb method status ctypes a) f tag where
455+
456+ type ClientMulti t m (Throwing es :> Verb method status ctypes a) f tag =
457+ ClientMulti t m (Verb method status ctypes (Envelope es a)) f tag
458+
459+ clientWithRouteMulti
460+ :: Proxy (Throwing es :> Verb method status ctypes a)
461+ -> Proxy m
462+ -> Proxy f
463+ -> Proxy tag
464+ -> Dynamic t (f (Req t))
465+ -> Dynamic t BaseUrl
466+ -> ClientOptions
467+ -> ClientMulti t m (Verb method status ctypes (Envelope es a)) f tag
468+ clientWithRouteMulti Proxy =
469+ clientWithRouteMulti (Proxy :: Proxy (Verb method status ctypes (Envelope es a)))
470+
471+-- | When 'NoThrow' comes before a 'Verb', change it into the same 'Verb'
472+-- but returning an @'Envelope' \'[]@.
473+instance (HasClientMulti t m (Verb method status ctypes (Envelope '[] a)) f tag) =>
474+ HasClientMulti t m (NoThrow :> Verb method status ctypes a) f tag where
475+
476+ type ClientMulti t m (NoThrow :> Verb method status ctypes a) f tag =
477+ ClientMulti t m (Verb method status ctypes (Envelope '[] a)) f tag
478+
479+ clientWithRouteMulti
480+ :: Proxy (NoThrow :> Verb method status ctypes a)
481+ -> Proxy m
482+ -> Proxy f
483+ -> Proxy tag
484+ -> Dynamic t (f (Req t))
485+ -> Dynamic t BaseUrl
486+ -> ClientOptions
487+ -> ClientMulti t m (Verb method status ctypes (Envelope '[] a)) f tag
488+ clientWithRouteMulti Proxy =
489+ clientWithRouteMulti (Proxy :: Proxy (Verb method status ctypes (Envelope '[] a)))
490+
491+-- | When @'Throwing' es@ comes before ':<|>', push @'Throwing' es@ into each
492+-- branch of the API.
493+instance HasClientMulti t m ((Throwing es :> api1) :<|> (Throwing es :> api2)) f tag =>
494+ HasClientMulti t m (Throwing es :> (api1 :<|> api2)) f tag where
495+
496+ type ClientMulti t m (Throwing es :> (api1 :<|> api2)) f tag =
497+ ClientMulti t m ((Throwing es :> api1) :<|> (Throwing es :> api2)) f tag
498+
499+ clientWithRouteMulti
500+ :: Proxy (Throwing es :> (api1 :<|> api2))
501+ -> Proxy m
502+ -> Proxy f
503+ -> Proxy tag
504+ -> Dynamic t (f (Req t))
505+ -> Dynamic t BaseUrl
506+ -> ClientOptions
507+ -> ClientMulti t m ((Throwing es :> api1) :<|> (Throwing es :> api2)) f tag
508+ clientWithRouteMulti _ =
509+ clientWithRouteMulti (Proxy :: Proxy ((Throwing es :> api1) :<|> (Throwing es :> api2)))
510+
511+-- | When 'NoThrow' comes before ':<|>', push 'NoThrow' into each branch of the
512+-- API.
513+instance HasClientMulti t m ((NoThrow :> api1) :<|> (NoThrow :> api2)) f tag =>
514+ HasClientMulti t m (NoThrow :> (api1 :<|> api2)) f tag where
515+
516+ type ClientMulti t m (NoThrow :> (api1 :<|> api2)) f tag =
517+ ClientMulti t m ((NoThrow :> api1) :<|> (NoThrow :> api2)) f tag
518+
519+ clientWithRouteMulti
520+ :: Proxy (NoThrow :> (api1 :<|> api2))
521+ -> Proxy m
522+ -> Proxy f
523+ -> Proxy tag
524+ -> Dynamic t (f (Req t))
525+ -> Dynamic t BaseUrl
526+ -> ClientOptions
527+ -> ClientMulti t m ((NoThrow :> api1) :<|> (NoThrow :> api2)) f tag
528+ clientWithRouteMulti _ =
529+ clientWithRouteMulti (Proxy :: Proxy ((NoThrow :> api1) :<|> (NoThrow :> api2)))
530+
531+-- | When a @'Throws' e@ comes immediately after a @'Throwing' es@, 'Snoc' the
532+-- @e@ onto the @es@. Otherwise, if @'Throws' e@ comes before any other
533+-- combinator, push it down so it is closer to the 'Verb'.
534+instance HasClientMulti t m (ThrowingNonterminal (Throwing es :> api :> apis)) f tag =>
535+ HasClientMulti t m (Throwing es :> api :> apis) f tag where
536+
537+ type ClientMulti t m (Throwing es :> api :> apis) f tag =
538+ ClientMulti t m (ThrowingNonterminal (Throwing es :> api :> apis)) f tag
539+
540+ clientWithRouteMulti
541+ :: Proxy (Throwing es :> api :> apis)
542+ -> Proxy m
543+ -> Proxy f
544+ -> Proxy tag
545+ -> Dynamic t (f (Req t))
546+ -> Dynamic t BaseUrl
547+ -> ClientOptions
548+ -> ClientMulti t m (ThrowingNonterminal (Throwing es :> api :> apis)) f tag
549+ clientWithRouteMulti _ =
550+ clientWithRouteMulti (Proxy :: Proxy (ThrowingNonterminal (Throwing es :> api :> apis)))
551+
552+-- | When 'NoThrow' comes before any other combinator, push it down so it is
553+-- closer to the 'Verb'.
554+instance HasClientMulti t m (api :> NoThrow :> apis) f tag =>
555+ HasClientMulti t m (NoThrow :> api :> apis) f tag where
556+
557+ type ClientMulti t m (NoThrow :> api :> apis) f tag =
558+ ClientMulti t m (api :> NoThrow :> apis) f tag
559+
560+ clientWithRouteMulti
561+ :: Proxy (NoThrow :> api :> apis)
562+ -> Proxy m
563+ -> Proxy f
564+ -> Proxy tag
565+ -> Dynamic t (f (Req t))
566+ -> Dynamic t BaseUrl
567+ -> ClientOptions
568+ -> ClientMulti t m (api :> NoThrow :> apis) f tag
569+ clientWithRouteMulti _ =
570+ clientWithRouteMulti (Proxy :: Proxy (api :> NoThrow :> apis))