@@ -58,6 +58,7 @@ import Servant.API.Post ( Post )
58import Servant.API.Put ( Put )
58import Servant.API.Put ( Put )
59import Servant.API.Delete ( Delete )
59import Servant.API.Delete ( Delete )
60import Servant.API.QueryParam ( QueryParam )
60import Servant.API.QueryParam ( QueryParam )
61+import Servant.API.MatrixParam ( MatrixParam )
61import Servant.API.ReqBody ( ReqBody )
62import Servant.API.ReqBody ( ReqBody )
62import Servant.API.Sub ( (:>) )
63import Servant.API.Sub ( (:>) )
63import Servant.API.Alternative ( (:<|>) )
64import Servant.API.Alternative ( (:<|>) )
@@ -68,15 +69,16 @@ import Servant.API.Alternative ( (:<|>) )
68-- only one of 'get', 'post', 'put', and 'delete' in a value), but
69-- only one of 'get', 'post', 'put', and 'delete' in a value), but
69-- sometimes requires a little more work.
70-- sometimes requires a little more work.
70class ExpSYM repr' repr | repr -> repr', repr' -> repr where
71class ExpSYM repr' repr | repr -> repr', repr' -> repr where
71− lit :: String -> repr' -> repr
72+ lit :: String -> repr' -> repr
72− capture :: String -> String -> repr -> repr
73+ capture :: String -> String -> repr -> repr
73− reqBody :: String -> repr -> repr
74+ reqBody :: String -> repr -> repr
75+ queryParam :: String -> String -> repr -> repr
74− queryParam :: String -> String -> repr -> repr
76+ matrixParam :: String -> String -> repr -> repr
75− conj :: repr' -> repr -> repr
77+ conj :: repr' -> repr -> repr
76− get :: String -> repr
78+ get :: String -> repr
77− post :: String -> repr
79+ post :: String -> repr
78− put :: String -> repr
80+ put :: String -> repr
79− delete :: String -> repr
81+ delete :: String -> repr
82infixr 6 >:
84infixr 6 >:
@@ -90,7 +92,9 @@ instance ExpSYM Type Type where
90 capture name typ r = AppT (AppT (ConT ''Capture) (LitT (StrTyLit name)))
92 capture name typ r = AppT (AppT (ConT ''Capture) (LitT (StrTyLit name)))
91 (ConT $ mkName typ) >: r
93 (ConT $ mkName typ) >: r
92 reqBody typ r = AppT (ConT ''ReqBody) (ConT $ mkName typ) >: r
94 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)))
94 (ConT $ mkName typ) >: r
98 (ConT $ mkName typ) >: r
95 conj x = AppT (AppT (ConT ''(:>)) x)
99 conj x = AppT (AppT (ConT ''(:>)) x)
96 get typ = AppT (ConT ''Get) (ConT $ mkName typ)
100 get typ = AppT (ConT ''Get) (ConT $ mkName typ)
@@ -111,17 +115,27 @@ parseUrlSegment = try parseCapture
111 <|> try parseLit
115 <|> try parseLit
113 parseCapture = do
117 parseCapture = do
114− cname <- many (noneOf " ?/:")
118+ cname <- many (noneOf " ?/:;")
116− ctyp <- many (noneOf " ?/:")
120+ ctyp <- many (noneOf " ?/:;")
121+ mx <- many parseMatrixParam
117− return $ capture cname ctyp
122+ return $ capture cname ctyp . foldr (.) id mx
118 parseQueryParam = do
123 parseQueryParam = do
120− cname <- many (noneOf " ?/:")
125+ cname <- many (noneOf " ?/:;")
122− ctyp <- many (noneOf " ?/:")
127+ ctyp <- many (noneOf " ?/:;")
123 return $ queryParam cname ctyp
128 return $ queryParam cname ctyp
130+ lt <- many (noneOf " ?/:;")
131+ mx <- many parseMatrixParam
132+ return $ lit lt . foldr (.) id mx
133+ parseMatrixParam = do
124− parseLit = lit <$> many (noneOf " ?/:")
135+ cname <- many (noneOf " ?/:;")
137+ ctyp <- many (noneOf " ?/:;")
138+ return $ matrixParam cname ctyp
126parseUrl :: ExpSYM repr repr => Parser (repr -> repr)
140parseUrl :: ExpSYM repr repr => Parser (repr -> repr)
127parseUrl = do
141parseUrl = do