@@ -58,6 +58,7 @@ import Servant.API.Post ( Post )
5858import Servant.API.Put ( Put )
5959import Servant.API.Delete ( Delete )
6060import Servant.API.QueryParam ( QueryParam )
61+import Servant.API.MatrixParam ( MatrixParam )
6162import Servant.API.ReqBody ( ReqBody )
6263import Servant.API.Sub ( (:>) )
6364import Servant.API.Alternative ( (:<|>) )
@@ -68,15 +69,16 @@ import Servant.API.Alternative ( (:<|>) )
6869-- only one of 'get', 'post', 'put', and 'delete' in a value), but
6970-- sometimes requires a little more work.
7071class 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
72+ lit :: String -> repr' -> repr
73+ capture :: String -> String -> repr -> repr
74+ reqBody :: String -> repr -> repr
75+ queryParam :: String -> String -> repr -> repr
76+ matrixParam :: String -> String -> repr -> repr
77+ conj :: repr' -> repr -> repr
78+ get :: String -> repr
79+ post :: String -> repr
80+ put :: String -> repr
81+ delete :: String -> repr
8082
8183
8284infixr 6 >:
@@ -90,7 +92,9 @@ instance ExpSYM Type Type where
9092 capture name typ r = AppT (AppT (ConT ''Capture) (LitT (StrTyLit name)))
9193 (ConT $ mkName typ) >: r
9294 reqBody typ r = AppT (ConT ''ReqBody) (ConT $ mkName typ) >: r
93− queryParam name typ r = AppT (AppT (ConT ''QueryParam) (LitT (StrTyLit name)))
95+ queryParam name typ r = AppT (AppT (ConT ''QueryParam) (LitT (StrTyLit name)))
96+ (ConT $ mkName typ) >: r
97+ matrixParam name typ r = AppT (AppT (ConT ''MatrixParam) (LitT (StrTyLit name)))
9498 (ConT $ mkName typ) >: r
9599 conj x = AppT (AppT (ConT ''(:>)) x)
96100 get typ = AppT (ConT ''Get) (ConT $ mkName typ)
@@ -111,17 +115,27 @@ parseUrlSegment = try parseCapture
111115 <|> try parseLit
112116 where
113117 parseCapture = do
114− cname <- many (noneOf " ?/:")
118+ cname <- many (noneOf " ?/:;")
115119 char ':'
116− ctyp <- many (noneOf " ?/:")
117− return $ capture cname ctyp
120+ ctyp <- many (noneOf " ?/:;")
121+ mx <- many parseMatrixParam
122+ return $ capture cname ctyp . foldr (.) id mx
118123 parseQueryParam = do
119124 char '?'
120− cname <- many (noneOf " ?/:")
125+ cname <- many (noneOf " ?/:;")
121126 char ':'
122− ctyp <- many (noneOf " ?/:")
127+ ctyp <- many (noneOf " ?/:;")
123128 return $ queryParam cname ctyp
124− parseLit = lit <$> many (noneOf " ?/:")
129+ parseLit = do
130+ lt <- many (noneOf " ?/:;")
131+ mx <- many parseMatrixParam
132+ return $ lit lt . foldr (.) id mx
133+ parseMatrixParam = do
134+ char ';'
135+ cname <- many (noneOf " ?/:;")
136+ char ':'
137+ ctyp <- many (noneOf " ?/:;")
138+ return $ matrixParam cname ctyp
125139
126140parseUrl :: ExpSYM repr repr => Parser (repr -> repr)
127141parseUrl = do