git.iko.soy/typeable/servant
on c98c7db help sign in
65 lines 2.0 kB history raw
1{-# LANGUAGE PolyKinds #-}
2{-# LANGUAGE TypeFamilies #-}
3{-# LANGUAGE TypeOperators #-}
4{-# LANGUAGE FlexibleContexts #-}
5{-# LANGUAGE FlexibleInstances #-}
6{-# LANGUAGE ScopedTypeVariables #-}
7module Servant.API.Capture where
9import Data.Proxy
10import Data.Text
11import GHC.TypeLits
12import Network.Wai
13import Servant.API.Sub
14import Servant.Client
15import Servant.Docs
16import Servant.Server
17import Servant.Text
19-- * Captures
20data Capture sym a
22captured :: FromText a => proxy (Capture sym a) -> Text -> Maybe a
23captured _ = fromText
25instance (KnownSymbol capture, FromText a, HasServer sublayout)
26 => HasServer (Capture capture a :> sublayout) where
28 type Server (Capture capture a :> sublayout) =
29 a -> Server sublayout
31 route Proxy subserver request respond = case pathInfo request of
32 (first : rest)
33 -> case captured captureProxy first of
34 Nothing -> respond Nothing
35 Just v -> route (Proxy :: Proxy sublayout) (subserver v) request{
36 pathInfo = rest
37 } respond
38 _ -> respond Nothing
40 where captureProxy = Proxy :: Proxy (Capture capture a)
42instance (KnownSymbol capture, ToText a, HasClient sublayout)
43 => HasClient (Capture capture a :> sublayout) where
45 type Client (Capture capture a :> sublayout) =
46 a -> Client sublayout
48 clientWithRoute Proxy req val =
49 clientWithRoute (Proxy :: Proxy sublayout) $
50 appendToPath p req
52 where p = unpack (toText val)
54instance (KnownSymbol sym, ToCapture (Capture sym a), HasDocs sublayout)
55 => HasDocs (Capture sym a :> sublayout) where
57 docsFor Proxy (endpoint, action) =
58 docsFor sublayoutP (endpoint', action')
60 where sublayoutP = Proxy :: Proxy sublayout
61 captureP = Proxy :: Proxy (Capture sym a)
63 action' = over captures (|> toCapture captureP) action
64 endpoint' = over path (\p -> p++"/:"++symbolVal symP) endpoint
65 symP = Proxy :: Proxy sym