git.iko.soy/typeable/servant-reflex
on master help sign in
More tweaking instances
commit0ec4d585f024c041d9c5fa851e06d27fbd79592f authorGreg Hale <imalsogreg@gmail.com> dateMon 8 Feb 2016, 21:07 (11 years ago) parent34c0132
3 files changed+43−36
.gitignore+3 src/Servant/Common/Req.hs+7−6 src/Servant/Reflex.hs+33−30
.gitignorenew file+3
@@ -0,0 +1,3 @@
1+.cabal-sandbox
2+cabal.sandbox.config
3+dist
src/Servant/Common/Req.hs+7−6
@@ -59,10 +59,11 @@ instance Exception ServantError
5959
6060data Req t = Req
6161 { reqPathParts :: [Behavior t String]
62− , qs :: QueryText
63− , reqBody :: Maybe (ByteString, MediaType)
64− , reqAccept :: [MediaType]
65− , headers :: [(String, Text)]
62+ , qParams :: [(String, Behavior t String)]
63+ -- , qs :: QueryText
64+ , reqBody :: Maybe (ByteString, MediaType)
65+ , reqAccept :: [MediaType]
66+ , headers :: [(String, Text)]
6667 }
6768
6869defReq :: Req
@@ -154,8 +155,8 @@ performRequest reqMethod req reqHost manager = do
154155 return (status_code, body, ct, hdrs, response)
155156
156157
157−performRequestCT :: MimeUnrender ct result =>
158− Proxy ct -> Method -> Req -> BaseUrl -> Manager
158+performRequestCT :: (MimeUnrender ct result, Reflex t) =>
159+ Proxy ct -> Method -> Req t -> BaseUrl -> Event t ()
159160 -> ExceptT ServantError IO ([HTTP.Header], result)
160161performRequestCT ct reqMethod req reqHost manager = do
161162 let acceptCT = contentType ct
src/Servant/Reflex.hs+33−30
@@ -100,27 +100,40 @@ instance (Reflex t, KnownSymbol capture, ToHttpApiData a, HasClient t sublayout)
100100instance OVERLAPPABLE_
101101 -- Note [Non-Empty Content Types]
102102 (MimeUnrender ct a, ReflectMethod method, cts' ~ (ct ': cts)
103− ) => HasClient (Verb method status cts' a) where
104− type Client (Verb method status cts' a) = ExceptT ServantError IO a
105− clientWithRoute Proxy req baseurl manager =
106− snd <$> performRequestCT (Proxy :: Proxy ct) method req baseurl manager
103+ ) => HasClient t (Verb method status cts' a) where
104+ type Client t (Verb method status cts' a) =
105+ Event t () -> m (Event t (Either XhrError a))
106+ -- TODO how to access input types here?
107+ -- ExceptT ServantError IO a
108+ clientWithRoute Proxy req baseurl =
109+ performRequestCT (Proxy :: Proxy ct) method req baseurl
107110 where method = reflectMethod (Proxy :: Proxy method)
108111
109112-- VERB (No content) --
110113instance OVERLAPPING_
111− (ReflectMethod method) => HasClient (Verb method status cts NoContent) where
112− type Client (Verb method status cts NoContent) = ExceptT ServantError IO NoContent
114+ (ReflectMethod method, Reflex t) =>
115+ HasClient t (Verb method status cts NoContent) where
116+ type Client t (Verb method status cts NoContent) =
117+ Event t () -> m (Event t (Either XhrError ()))
118+ -- TODO: how to access input types here?
119+ -- ExceptT ServantError IO NoContent
113120 clientWithRoute Proxy req baseurl manager =
114− performRequestNoBody method req baseurl manager >> return NoContent
121+ performRequestNoBody method req baseurl
115122 where method = reflectMethod (Proxy :: Proxy method)
116123
117124-- HEADERS Verb (Content) --
125+-- Headers combinator not treated in fully general case,
126+-- in order to deny instances for (Headers ls (Capture "id" Int)),
127+-- a combinator that wouldn't make sense
118128instance OVERLAPPING_
119129 -- Note [Non-Empty Content Types]
120− ( MimeUnrender ct a, BuildHeadersTo ls, ReflectMethod method, cts' ~ (ct ': cts)
130+ ( MimeUnrender ct a, BuildHeadersTo ls,
131+ ReflectMethod method, cts' ~ (ct ': cts),
132+ Reflex t
121133 ) => HasClient (Verb method status cts' (Headers ls a)) where
122134 type Client (Verb method status cts' (Headers ls a))
123− = ExceptT ServantError IO (Headers ls a)
135+ = Event t () -> m (Event t (Either XhrError ()))
136+ -- ExceptT ServantError IO (Headers ls a)
124137 clientWithRoute Proxy req baseurl manager = do
125138 let method = reflectMethod (Proxy :: Proxy method)
126139 (hdrs, resp) <- performRequestCT (Proxy :: Proxy ct) method req baseurl manager
@@ -130,11 +143,13 @@ instance OVERLAPPING_
130143
131144-- HEADERS Verb (No content) --
132145instance OVERLAPPING_
133− ( BuildHeadersTo ls, ReflectMethod method
146+ ( BuildHeadersTo ls, ReflectMethod method,
147+ Reflex t
134148 ) => HasClient (Verb method status cts (Headers ls NoContent)) where
135149 type Client (Verb method status cts (Headers ls NoContent))
136− = ExceptT ServantError IO (Headers ls NoContent)
137− clientWithRoute Proxy req baseurl manager = do
150+ = Event t () -> m (Event t (Either XhrError ()))
151+ -- ExceptT ServantError IO (Headers ls NoContent)
152+ clientWithRoute Proxy req baseurl = do
138153 let method = reflectMethod (Proxy :: Proxy method)
139154 hdrs <- performRequestNoBody method req baseurl manager
140155 return $ Headers { getResponse = NoContent
@@ -142,39 +157,27 @@ instance OVERLAPPING_
142157 }
143158
144159
145−-- | If you use a 'Header' in one of your endpoints in your API,
146−-- the corresponding querying function will automatically take
147−-- an additional argument of the type specified by your 'Header',
148−-- wrapped in Maybe.
149−--
150−-- That function will take care of encoding this argument as Text
151−-- in the request headers.
152−--
153−-- All you need is for your type to have a 'ToHttpApiData' instance.
154−--
155−-- Example:
156−--
160+-- HEADER
157161-- > newtype Referer = Referer { referrer :: Text }
158162-- > deriving (Eq, Show, Generic, FromText, ToHttpApiData)
159163-- >
160164-- > -- GET /view-my-referer
161165-- > type MyApi = "view-my-referer" :> Header "Referer" Referer :> Get '[JSON] Referer
162166-- >
163−-- > myApi :: Proxy MyApi
164−-- > myApi = Proxy
165167-- >
166168-- > viewReferer :: Maybe Referer -> ExceptT String IO Book
167169-- > viewReferer = client myApi host
168170-- > where host = BaseUrl Http "localhost" 8080
169171-- > -- then you can just use "viewRefer" to query that endpoint
170172-- > -- specifying Nothing or e.g Just "http://haskell.org/" as arguments
171−instance (KnownSymbol sym, ToHttpApiData a, HasClient sublayout)
173+instance (KnownSymbol sym, ToHttpApiData a,
174+ HasClient sublayout, Reflex t)
172175 => HasClient (Header sym a :> sublayout) where
173176
174− type Client (Header sym a :> sublayout) =
175− Maybe a -> Client sublayout
177+ type Client t (Header sym a :> sublayout) =
178+ Behavior t (Maybe a) -> Client t sublayout
176179
177− clientWithRoute Proxy req baseurl manager mval =
180+ clientWithRoute Proxy req baseurl mval =
178181 clientWithRoute (Proxy :: Proxy sublayout)
179182 (maybe req
180183 (\value -> Servant.Common.Req.addHeader hname value req)