@@ -40,6 +40,7 @@ import Servant.API.Post
4040import Servant.API.Put
4141import Servant.API.Delete
4242import Servant.API.QueryParam
43+import Servant.API.MatrixParam
4344import Servant.API.ReqBody
4445import Servant.API.Sub
4546import Servant.API.Alternative
@@ -50,15 +51,16 @@ import Servant.API.Alternative
5051-- only one of 'get', 'post', 'put', and 'delete' in a value), but
5152-- sometimes requires a little more work.
5253class ExpSYM repr' repr | repr -> repr', repr' -> repr where
53− lit :: String -> repr' -> repr
54− capture :: String -> String -> repr -> repr
55− reqBody :: String -> repr -> repr
56− queryParam :: String -> String -> repr -> repr
57− conj :: repr' -> repr -> repr
58− get :: String -> repr
59− post :: String -> repr
60− put :: String -> repr
61− delete :: String -> repr
54+ lit :: String -> repr' -> repr
55+ capture :: String -> String -> repr -> repr
56+ reqBody :: String -> repr -> repr
57+ queryParam :: String -> String -> repr -> repr
58+ matrixParam :: String -> String -> repr -> repr
59+ conj :: repr' -> repr -> repr
60+ get :: String -> repr
61+ post :: String -> repr
62+ put :: String -> repr
63+ delete :: String -> repr
6264
6365
6466infixr 6 >:
@@ -72,7 +74,9 @@ instance ExpSYM Type Type where
7274 capture name typ r = AppT (AppT (ConT ''Capture) (LitT (StrTyLit name)))
7375 (ConT $ mkName typ) >: r
7476 reqBody typ r = AppT (ConT ''ReqBody) (ConT $ mkName typ) >: r
75− queryParam name typ r = AppT (AppT (ConT ''QueryParam) (LitT (StrTyLit name)))
77+ queryParam name typ r = AppT (AppT (ConT ''QueryParam) (LitT (StrTyLit name)))
78+ (ConT $ mkName typ) >: r
79+ matrixParam name typ r = AppT (AppT (ConT ''MatrixParam) (LitT (StrTyLit name)))
7680 (ConT $ mkName typ) >: r
7781 conj x = AppT (AppT (ConT ''(:>)) x)
7882 get typ = AppT (ConT ''Get) (ConT $ mkName typ)
@@ -93,17 +97,27 @@ parseUrlSegment = try parseCapture
9397 <|> try parseLit
9498 where
9599 parseCapture = do
96− cname <- many (noneOf " ?/:")
100+ cname <- many (noneOf " ?/:;")
97101 char ':'
98− ctyp <- many (noneOf " ?/:")
99− return $ capture cname ctyp
102+ ctyp <- many (noneOf " ?/:;")
103+ mx <- many parseMatrixParam
104+ return $ capture cname ctyp . foldr (.) id mx
100105 parseQueryParam = do
101106 char '?'
102− cname <- many (noneOf " ?/:")
107+ cname <- many (noneOf " ?/:;")
103108 char ':'
104− ctyp <- many (noneOf " ?/:")
109+ ctyp <- many (noneOf " ?/:;")
105110 return $ queryParam cname ctyp
106− parseLit = lit <$> many (noneOf " ?/:")
111+ parseLit = do
112+ lt <- many (noneOf " ?/:;")
113+ mx <- many parseMatrixParam
114+ return $ lit lt . foldr (.) id mx
115+ parseMatrixParam = do
116+ char ';'
117+ cname <- many (noneOf " ?/:;")
118+ char ':'
119+ ctyp <- many (noneOf " ?/:;")
120+ return $ matrixParam cname ctyp
107121
108122parseUrl :: ExpSYM repr repr => Parser (repr -> repr)
109123parseUrl = do