@@ -29,7 +29,6 @@
2929module Servant.QQ (sitemap) where
3030
3131import Control.Monad ( void )
32−import Control.Applicative ( (<$>) )
3332import Language.Haskell.TH.Quote ( QuasiQuoter(..) )
3433import Language.Haskell.TH
3534 ( mkName, Type(AppT, ConT, LitT), TyLit(StrTyLit) )
@@ -58,6 +57,7 @@ import Servant.API.Post ( Post )
5857import Servant.API.Put ( Put )
5958import Servant.API.Delete ( Delete )
6059import Servant.API.QueryParam ( QueryParam )
60+import Servant.API.MatrixParam ( MatrixParam )
6161import Servant.API.ReqBody ( ReqBody )
6262import Servant.API.Sub ( (:>) )
6363import Servant.API.Alternative ( (:<|>) )
@@ -68,15 +68,16 @@ import Servant.API.Alternative ( (:<|>) )
6868-- only one of 'get', 'post', 'put', and 'delete' in a value), but
6969-- sometimes requires a little more work.
7070class ExpSYM repr' repr | repr -> repr', repr' -> repr where
71− lit :: String -> repr' -> repr
72− capture :: String -> String -> repr -> repr
73− reqBody :: String -> repr -> repr
74− queryParam :: String -> String -> repr -> repr
75− conj :: repr' -> repr -> repr
76− get :: String -> repr
77− post :: String -> repr
78− put :: String -> repr
79− delete :: String -> repr
71+ lit :: String -> repr' -> repr
72+ capture :: String -> String -> repr -> repr
73+ reqBody :: String -> repr -> repr
74+ queryParam :: String -> String -> repr -> repr
75+ matrixParam :: String -> String -> repr -> repr
76+ conj :: repr' -> repr -> repr
77+ get :: String -> repr
78+ post :: String -> repr
79+ put :: String -> repr
80+ delete :: String -> repr
8081
8182
8283infixr 6 >:
@@ -90,7 +91,9 @@ instance ExpSYM Type Type where
9091 capture name typ r = AppT (AppT (ConT ''Capture) (LitT (StrTyLit name)))
9192 (ConT $ mkName typ) >: r
9293 reqBody typ r = AppT (ConT ''ReqBody) (ConT $ mkName typ) >: r
93− queryParam name typ r = AppT (AppT (ConT ''QueryParam) (LitT (StrTyLit name)))
94+ queryParam name typ r = AppT (AppT (ConT ''QueryParam) (LitT (StrTyLit name)))
95+ (ConT $ mkName typ) >: r
96+ matrixParam name typ r = AppT (AppT (ConT ''MatrixParam) (LitT (StrTyLit name)))
9497 (ConT $ mkName typ) >: r
9598 conj x = AppT (AppT (ConT ''(:>)) x)
9699 get typ = AppT (ConT ''Get) (ConT $ mkName typ)
@@ -111,17 +114,27 @@ parseUrlSegment = try parseCapture
111114 <|> try parseLit
112115 where
113116 parseCapture = do
114− cname <- many (noneOf " ?/:")
117+ cname <- many (noneOf " ?/:;")
115118 char ':'
116− ctyp <- many (noneOf " ?/:")
117− return $ capture cname ctyp
119+ ctyp <- many (noneOf " ?/:;")
120+ mx <- many parseMatrixParam
121+ return $ capture cname ctyp . foldr (.) id mx
118122 parseQueryParam = do
119123 char '?'
120− cname <- many (noneOf " ?/:")
124+ cname <- many (noneOf " ?/:;")
121125 char ':'
122− ctyp <- many (noneOf " ?/:")
126+ ctyp <- many (noneOf " ?/:;")
123127 return $ queryParam cname ctyp
124− parseLit = lit <$> many (noneOf " ?/:")
128+ parseLit = do
129+ lt <- many (noneOf " ?/:;")
130+ mx <- many parseMatrixParam
131+ return $ lit lt . foldr (.) id mx
132+ parseMatrixParam = do
133+ char ';'
134+ cname <- many (noneOf " ?/:;")
135+ char ':'
136+ ctyp <- many (noneOf " ?/:;")
137+ return $ matrixParam cname ctyp
125138
126139parseUrl :: ExpSYM repr repr => Parser (repr -> repr)
127140parseUrl = do