on 13664a2 help sign in
servant/src/Servant/API/Capture.hs
50 lines 1.4 kB history raw
1{-# LANGUAGE PolyKinds #-}
2{-# LANGUAGE TypeFamilies #-}
3{-# LANGUAGE TypeOperators #-}
4{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE ScopedTypeVariables #-}
6module Servant.API.Capture where
8import Data.Proxy
9import Data.Text
10import GHC.TypeLits
11import Network.Wai
12import Servant.API.Sub
13import Servant.Client
14import Servant.Server
15import Servant.Text
17-- * Captures
18data Capture sym a
20captured :: FromText a => proxy (Capture sym a) -> Text -> Maybe a
21captured _ = fromText
23instance (KnownSymbol capture, FromText a, HasServer sublayout)
24 => HasServer (Capture capture a :> sublayout) where
26 type Server (Capture capture a :> sublayout) =
27 a -> Server sublayout
29 route Proxy subserver request = case pathInfo request of
30 (first : rest)
31 -> case captured captureProxy first of
32 Nothing -> return Nothing
33 Just v -> route (Proxy :: Proxy sublayout) (subserver v) request{
34 pathInfo = rest
35 }
36 _ -> return Nothing
38 where captureProxy = Proxy :: Proxy (Capture capture a)
40instance (KnownSymbol capture, ToText a, HasClient sublayout)
41 => HasClient (Capture capture a :> sublayout) where
43 type Client (Capture capture a :> sublayout) =
44 a -> Client sublayout
46 clientWithRoute Proxy req val =
47 clientWithRoute (Proxy :: Proxy sublayout) $
48 appendToPath p req
50 where p = unpack (toText val)