@@ -13,6 +13,7 @@ import           Control.Lens (makePrisms, makeLenses, Getter, (&), (<>~), (%~),
1313import            Data.Monoid 
1414#endif 
1515import            Data.Proxy 
16+ import            Data.Typeable  (Typeable , TypeRep , typeOf )
1617import            Data.String 
1718import            Data.Text 
1819import            Data.Text.Encoding  (decodeUtf8 )
@@ -125,6 +126,7 @@ data Req f = Req
125126  , _reqBody        ::  Maybe f 
126127  , _reqReturnType  ::  Maybe f 
127128  , _reqFuncName    ::  FunctionName 
129+   , _reqApiType     ::  TypeRep 
128130  } 
129131
130132deriving  instance  Eq f  =>  Eq Req  f )
@@ -133,7 +135,7 @@ deriving instance Show f => Show (Req f)
133135makeLenses ''Req
134136
135137defReq  ::  Req  ftype 
136- defReq =  Req  defUrl " GET" []  Nothing  Nothing  (FunctionName  [] )
138+ defReq =  Req  defUrl " GET" []  Nothing  Nothing  (FunctionName  [] ) (typeOf  () ) 
137139
138140--  |  To be used exclusively as a "negative" return type/constraint 
139141--  by @'Elem`@ type family. 
@@ -196,81 +198,87 @@ instance (HasForeign lang ftype a, HasForeign lang ftype b)
196198         foreignFor lang ftype (Proxy  ::  Proxy  a ) req
197199    :<|>  foreignFor lang ftype (Proxy  ::  Proxy  b ) req
198200
199- instance  (KnownSymbol  sym , HasForeignType  lang  ftype  t , HasForeign  lang  ftype  sublayout )
201+ instance  (KnownSymbol  sym , HasForeignType  lang  ftype  t , HasForeign  lang  ftype  sublayout ,  Typeable  ( Capture   sym   t   :>   sublayout ) )
200202  =>  HasForeign  lang  ftype  (Capture  sym  t  :>  sublayout ) where 
201203  type  Foreign  ftype  (Capture  sym  a  :>  sublayout ) =  Foreign  ftype  sublayout 
202204
203205  foreignFor lang Proxy  Proxy  req = 
204206    foreignFor lang Proxy  (Proxy  ::  Proxy  sublayout ) $ 
205207      req &  reqUrl .  path <>~  [Segment  (Cap  arg)]
206208          &  reqFuncName .  _FunctionName %~  (++  [" by" 
209+           &  reqApiType .~  typeOf (undefined  ::  Capture  sym  t  :>  sublayout )
207210    where 
208211      str   =  pack .  symbolVal $  (Proxy  ::  Proxy  sym )
209212      ftype =  typeFor lang (Proxy  ::  Proxy  ftype ) (Proxy  ::  Proxy  t )
210213      arg   =  Arg 
211214        { _argName =  PathSegment  str
212215        , _argType =  ftype }
213216
214- instance  (Elem  JSON  list , HasForeignType  lang  ftype  a , ReflectMethod  method )
217+ instance  (Elem  JSON  list , HasForeignType  lang  ftype  a , ReflectMethod  method ,  Typeable  ( Verb   method   status   list   a ) )
215218  =>  HasForeign  lang  ftype  (Verb  method  status  list  a ) where 
216219  type  Foreign  ftype  (Verb  method  status  list  a ) =  Req  ftype 
217220
218221  foreignFor lang Proxy  Proxy  req = 
219222    req &  reqFuncName .  _FunctionName %~  (methodLC : )
220223        &  reqMethod .~  method
221224        &  reqReturnType .~  Just  retType
225+         &  reqApiType .~  typeOf (undefined  ::  Verb  method  status  list  a )
222226    where 
223227      retType  =  typeFor lang (Proxy  ::  Proxy  ftype ) (Proxy  ::  Proxy  a )
224228      method   =  reflectMethod (Proxy  ::  Proxy  method )
225229      methodLC =  toLower $  decodeUtf8 method
226230
227- instance  (KnownSymbol  sym , HasForeignType  lang  ftype  a , HasForeign  lang  ftype  sublayout )
231+ instance  (KnownSymbol  sym , HasForeignType  lang  ftype  a , HasForeign  lang  ftype  sublayout ,  Typeable  ( Header   sym   a   :>   sublayout ) )
228232  =>  HasForeign  lang  ftype  (Header  sym  a  :>  sublayout ) where 
229233  type  Foreign  ftype  (Header  sym  a  :>  sublayout ) =  Foreign  ftype  sublayout 
230234
231235  foreignFor lang Proxy  Proxy  req = 
232236    foreignFor lang Proxy  subP $  req &  reqHeaders <>~  [HeaderArg  arg]
237+                                      &  reqApiType .~  typeOf (undefined  ::  Header  sym  a  :>  sublayout )
233238    where 
234239      hname =  pack .  symbolVal $  (Proxy  ::  Proxy  sym )
235240      arg   =  Arg 
236241        { _argName =  PathSegment  hname
237242        , _argType  =  typeFor lang (Proxy  ::  Proxy  ftype ) (Proxy  ::  Proxy  a ) }
238243      subP  =  Proxy  ::  Proxy  sublayout 
239244
240- instance  (KnownSymbol  sym , HasForeignType  lang  ftype  a , HasForeign  lang  ftype  sublayout )
245+ instance  (KnownSymbol  sym , HasForeignType  lang  ftype  a , HasForeign  lang  ftype  sublayout ,  Typeable  ( QueryParam   sym   a   :>   sublayout ) )
241246  =>  HasForeign  lang  ftype  (QueryParam  sym  a  :>  sublayout ) where 
242247  type  Foreign  ftype  (QueryParam  sym  a  :>  sublayout ) =  Foreign  ftype  sublayout 
243248
244249  foreignFor lang Proxy  Proxy  req = 
245250    foreignFor lang (Proxy  ::  Proxy  ftype ) (Proxy  ::  Proxy  sublayout ) $ 
246251      req &  reqUrl. queryStr <>~  [QueryArg  arg Normal ]
252+           &  reqApiType .~  typeOf (undefined  ::  QueryParam  sym  a  :>  sublayout )
247253    where 
248254      str =  pack .  symbolVal $  (Proxy  ::  Proxy  sym )
249255      arg =  Arg 
250256        { _argName =  PathSegment  str
251257        , _argType =  typeFor lang (Proxy  ::  Proxy  ftype ) (Proxy  ::  Proxy  a ) }
252258
253259instance 
254-   (KnownSymbol  sym , HasForeignType  lang  ftype  [a ], HasForeign  lang  ftype  sublayout )
260+   (KnownSymbol  sym , HasForeignType  lang  ftype  [a ], HasForeign  lang  ftype  sublayout ,  Typeable  ( QueryParams   sym   a   :>   sublayout ) )
255261  =>  HasForeign  lang  ftype  (QueryParams  sym  a  :>  sublayout ) where 
256262  type  Foreign  ftype  (QueryParams  sym  a  :>  sublayout ) =  Foreign  ftype  sublayout 
257263  foreignFor lang Proxy  Proxy  req = 
258264    foreignFor lang (Proxy  ::  Proxy  ftype ) (Proxy  ::  Proxy  sublayout ) $ 
259265      req &  reqUrl. queryStr <>~  [QueryArg  arg List ]
266+           &  reqApiType .~  typeOf (undefined  ::  QueryParams  sym  a  :>  sublayout )
260267    where 
261268      str =  pack .  symbolVal $  (Proxy  ::  Proxy  sym )
262269      arg =  Arg 
263270        { _argName =  PathSegment  str
264271        , _argType =  typeFor lang (Proxy  ::  Proxy  ftype ) (Proxy  ::  Proxy  [a ]) }
265272
266273instance 
267-   (KnownSymbol  sym , HasForeignType  lang  ftype  Bool HasForeign  lang  ftype  sublayout )
274+   (KnownSymbol  sym , HasForeignType  lang  ftype  Bool HasForeign  lang  ftype  sublayout ,  Typeable  ( QueryFlag   sym   :>   sublayout ) )
268275  =>  HasForeign  lang  ftype  (QueryFlag  sym  :>  sublayout ) where 
269276  type  Foreign  ftype  (QueryFlag  sym  :>  sublayout ) =  Foreign  ftype  sublayout 
270277
271278  foreignFor lang ftype Proxy  req = 
272279    foreignFor lang ftype (Proxy  ::  Proxy  sublayout ) $ 
273280      req &  reqUrl. queryStr <>~  [QueryArg  arg Flag ]
281+           &  reqApiType .~  typeOf (undefined  ::  QueryFlag  sym  :>  sublayout )
274282    where 
275283      str =  pack .  symbolVal $  (Proxy  ::  Proxy  sym )
276284      arg =  Arg 
@@ -283,61 +291,70 @@ instance HasForeign lang ftype Raw where
283291  foreignFor _ Proxy  Proxy  req method = 
284292    req &  reqFuncName .  _FunctionName %~  ((toLower $  decodeUtf8 method) : )
285293        &  reqMethod .~  method
294+         &  reqApiType .~  typeOf (undefined  ::  Raw )
286295
287- instance  (Elem  JSON  list , HasForeignType  lang  ftype  a , HasForeign  lang  ftype  sublayout )
296+ instance  (Elem  JSON  list , HasForeignType  lang  ftype  a , HasForeign  lang  ftype  sublayout ,  Typeable  ( ReqBody   list   a   :>   sublayout ) )
288297      =>  HasForeign  lang  ftype  (ReqBody  list  a  :>  sublayout ) where 
289298  type  Foreign  ftype  (ReqBody  list  a  :>  sublayout ) =  Foreign  ftype  sublayout 
290299
291300  foreignFor lang ftype Proxy  req = 
292301    foreignFor lang ftype (Proxy  ::  Proxy  sublayout ) $ 
293302      req &  reqBody .~  (Just  $  typeFor lang ftype (Proxy  ::  Proxy  a ))
303+           &  reqApiType .~  typeOf (undefined  ::  ReqBody  list  a  :>  sublayout )
294304
295- instance  (KnownSymbol  path , HasForeign  lang  ftype  sublayout )
305+ instance  (KnownSymbol  path , HasForeign  lang  ftype  sublayout ,  Typeable  ( path   :>   sublayout ) )
296306      =>  HasForeign  lang  ftype  (path  :>  sublayout ) where 
297307  type  Foreign  ftype  (path  :>  sublayout ) =  Foreign  ftype  sublayout 
298308
299309  foreignFor lang ftype Proxy  req = 
300310    foreignFor lang ftype (Proxy  ::  Proxy  sublayout ) $ 
301311      req &  reqUrl .  path <>~  [Segment  (Static  (PathSegment  str))]
302312          &  reqFuncName .  _FunctionName %~  (++  [str])
313+           &  reqApiType .~  typeOf (undefined  ::  path  :>  sublayout )
303314    where 
304315      str = 
305316        Data.Text. map  (\ c ->  if  c ==  ' .' then  ' _' else  c)
306317          .  pack .  symbolVal $  (Proxy  ::  Proxy  path )
307318
308- instance  HasForeign  lang  ftype  sublayout 
319+ instance  ( HasForeign  lang  ftype  sublayout ,  Typeable  ( RemoteHost   :>   sublayout )) 
309320  =>  HasForeign  lang  ftype  (RemoteHost  :>  sublayout ) where 
310321  type  Foreign  ftype  (RemoteHost  :>  sublayout ) =  Foreign  ftype  sublayout 
311322
312323  foreignFor lang ftype Proxy  req = 
313-     foreignFor lang ftype (Proxy  ::  Proxy  sublayout ) req
324+     foreignFor lang ftype (Proxy  ::  Proxy  sublayout ) $ 
325+       req &  reqApiType .~  typeOf (undefined  ::  (RemoteHost  :>  sublayout ))
314326
315- instance  HasForeign  lang  ftype  sublayout 
327+ instance  ( HasForeign  lang  ftype  sublayout ,  Typeable  ( IsSecure   :>   sublayout )) 
316328  =>  HasForeign  lang  ftype  (IsSecure  :>  sublayout ) where 
317329  type  Foreign  ftype  (IsSecure  :>  sublayout ) =  Foreign  ftype  sublayout 
318330
319331  foreignFor lang ftype Proxy  req = 
320-     foreignFor lang ftype (Proxy  ::  Proxy  sublayout ) req
332+     foreignFor lang ftype (Proxy  ::  Proxy  sublayout ) $ 
333+       req &  reqApiType .~  typeOf (undefined  ::  IsSecure  :>  sublayout )
321334
322- instance  HasForeign  lang  ftype  sublayout  =>  HasForeign  lang  ftype  (Vault  :>  sublayout ) where 
335+ instance  (HasForeign  lang  ftype  sublayout , Typeable  (Vault  :>  sublayout ))
336+     =>  HasForeign  lang  ftype  (Vault  :>  sublayout ) where 
323337  type  Foreign  ftype  (Vault  :>  sublayout ) =  Foreign  ftype  sublayout 
324338
325339  foreignFor lang ftype Proxy  req = 
326-     foreignFor lang ftype (Proxy  ::  Proxy  sublayout ) req
340+     foreignFor lang ftype (Proxy  ::  Proxy  sublayout ) $ 
341+       req &  reqApiType .~  typeOf (undefined  ::  Vault  :>  sublayout )
327342
328- instance  HasForeign  lang  ftype  sublayout   => 
329-   HasForeign  lang  ftype  (WithNamedContext  name  context  sublayout ) where 
343+ instance  ( HasForeign  lang  ftype  sublayout ,  Typeable  ( WithNamedContext   name   context   sublayout )) 
344+      =>   HasForeign  lang  ftype  (WithNamedContext  name  context  sublayout ) where 
330345
331346  type  Foreign  ftype  (WithNamedContext  name  context  sublayout ) =  Foreign  ftype  sublayout 
332347
333-   foreignFor lang ftype Proxy  =  foreignFor lang ftype (Proxy  ::  Proxy  sublayout )
348+   foreignFor lang ftype Proxy  req =  foreignFor lang ftype (Proxy  ::  Proxy  sublayout ) $ 
349+       req &  reqApiType .~  typeOf (undefined  ::  WithNamedContext  name  context  sublayout )
334350
335- instance  HasForeign  lang  ftype  sublayout 
351+ instance  ( HasForeign  lang  ftype  sublayout ,  Typeable  ( HttpVersion   :>   sublayout )) 
336352  =>  HasForeign  lang  ftype  (HttpVersion  :>  sublayout ) where 
337353  type  Foreign  ftype  (HttpVersion  :>  sublayout ) =  Foreign  ftype  sublayout 
338354
339355  foreignFor lang ftype Proxy  req = 
340-     foreignFor lang ftype (Proxy  ::  Proxy  sublayout ) req
356+     foreignFor lang ftype (Proxy  ::  Proxy  sublayout ) $ 
357+       req &  reqApiType .~  typeOf (undefined  ::  HttpVersion  :>  sublayout )
341358
342359--  |  Utility class used by 'listFromAPI' which computes 
343360--    the data needed to generate a function for each endpoint 
0 commit comments