@@ -13,18 +13,21 @@
1313{-# LANGUAGE TypeOperators #-}
1414{-# LANGUAGE UndecidableInstances #-}
1515{-# LANGUAGE OverloadedStrings #-}
16+{-# LANGUAGE PolyKinds #-}
1617
1718-- | Generalizes all the data needed to make code generation work with
1819-- arbitrary programming languages.
1920module Servant.Foreign.Internal where
2021
21−import Control.Lens (makeLenses, (%~), (&), (.~), (<>~))
22−import qualified Data.Char as C
22+import Control.Lens (makeLenses, (%~), (&), (.~), (<>~))
23+import qualified Data.Char as C
2324import Data.Proxy
2425import Data.Text
25−import GHC.Exts (Constraint)
26+import Data.Text.Encoding (decodeUtf8)
27+import GHC.Exts (Constraint)
2628import GHC.TypeLits
27−import Prelude hiding (concat)
29+import qualified Network.HTTP.Types as HTTP
30+import Prelude hiding (concat)
2831import Servant.API
2932
3033-- | Function name builder that simply concat each part together
@@ -86,11 +89,10 @@ defUrl :: Url
8689defUrl = Url [] []
8790
8891type FunctionName = [Text]
89−type Method = Text
9092
9193data Req = Req
9294 { _reqUrl :: Url
93− , _reqMethod :: Method
95+ , _reqMethod :: HTTP.Method
9496 , _reqHeaders :: [HeaderArg]
9597 , _reqBody :: Maybe ForeignType
9698 , _reqReturnType :: ForeignType
@@ -185,27 +187,18 @@ instance (KnownSymbol sym, HasForeignType lang a, HasForeign lang sublayout)
185187 str = pack . symbolVal $ (Proxy :: Proxy sym)
186188 arg = (str, typeFor lang (Proxy :: Proxy a))
187189
188−instance (Elem JSON list, HasForeignType lang a)
189− => HasForeign lang (Delete list a) where
190− type Foreign (Delete list a) = Req
190+instance (Elem JSON list, HasForeignType lang a, ReflectMethod method)
191+ => HasForeign lang (Verb method status list a) where
192+ type Foreign (Verb method status list a) = Req
191193
192194 foreignFor lang Proxy req =
193− req & funcName %~ ("delete" :)
194− & reqMethod .~ "DELETE"
195− & reqReturnType .~ retType
196− where
197− retType = typeFor lang (Proxy :: Proxy a)
198−
199−instance (Elem JSON list, HasForeignType lang a)
200− => HasForeign lang (Get list a) where
201− type Foreign (Get list a) = Req
202−
203− foreignFor lang Proxy req =
204− req & funcName %~ ("get" :)
205− & reqMethod .~ "GET"
195+ req & funcName %~ (methodLC :)
196+ & reqMethod .~ method
206197 & reqReturnType .~ retType
207198 where
208− retType = typeFor lang (Proxy :: Proxy a)
199+ retType = typeFor lang (Proxy :: Proxy a)
200+ method = reflectMethod (Proxy :: Proxy method)
201+ methodLC = toLower $ decodeUtf8 method
209202
210203instance (KnownSymbol sym, HasForeignType lang a, HasForeign lang sublayout)
211204 => HasForeign lang (Header sym a :> sublayout) where
@@ -220,28 +213,6 @@ instance (KnownSymbol sym, HasForeignType lang a, HasForeign lang sublayout)
220213 arg = (hname, typeFor lang (Proxy :: Proxy a))
221214 subP = Proxy :: Proxy sublayout
222215
223−instance (Elem JSON list, HasForeignType lang a)
224− => HasForeign lang (Post list a) where
225− type Foreign (Post list a) = Req
226−
227− foreignFor lang Proxy req =
228− req & funcName %~ ("post" :)
229− & reqMethod .~ "POST"
230− & reqReturnType .~ retType
231− where
232− retType = typeFor lang (Proxy :: Proxy a)
233−
234−instance (Elem JSON list, HasForeignType lang a)
235− => HasForeign lang (Put list a) where
236− type Foreign (Put list a) = Req
237−
238− foreignFor lang Proxy req =
239− req & funcName %~ ("put" :)
240− & reqMethod .~ "PUT"
241− & reqReturnType .~ retType
242− where
243− retType = typeFor lang (Proxy :: Proxy a)
244−
245216instance (KnownSymbol sym, HasForeignType lang a, HasForeign lang sublayout)
246217 => HasForeign lang (QueryParam sym a :> sublayout) where
247218 type Foreign (QueryParam sym a :> sublayout) = Foreign sublayout
@@ -279,10 +250,10 @@ instance (KnownSymbol sym, HasForeignType lang a, a ~ Bool, HasForeign lang subl
279250 arg = (str, typeFor lang (Proxy :: Proxy a))
280251
281252instance HasForeign lang Raw where
282− type Foreign Raw = Method -> Req
253+ type Foreign Raw = HTTP.Method -> Req
283254
284255 foreignFor _ Proxy req method =
285− req & funcName %~ ((toLower method) :)
256+ req & funcName %~ ((toLower $ decodeUtf8 method) :)
286257 & reqMethod .~ method
287258
288259instance (Elem JSON list, HasForeignType lang a, HasForeign lang sublayout)
@@ -346,4 +317,3 @@ instance (GenerateList start, GenerateList rest) => GenerateList (start :<|> res
346317-- describing one endpoint from your API type.
347318listFromAPI :: (HasForeign lang api, GenerateList (Foreign api)) => Proxy lang -> Proxy api -> [Req]
348319listFromAPI lang p = generateList (foreignFor lang p defReq)
349−