@@ -40,6 +40,7 @@ import Servant.API.Post
40import Servant.API.Put
40import Servant.API.Put
41import Servant.API.Delete
41import Servant.API.Delete
42import Servant.API.QueryParam
42import Servant.API.QueryParam
43+import Servant.API.MatrixParam
43import Servant.API.ReqBody
44import Servant.API.ReqBody
44import Servant.API.Sub
45import Servant.API.Sub
45import Servant.API.Alternative
46import Servant.API.Alternative
@@ -50,15 +51,16 @@ import Servant.API.Alternative
50-- only one of 'get', 'post', 'put', and 'delete' in a value), but
51-- only one of 'get', 'post', 'put', and 'delete' in a value), but
51-- sometimes requires a little more work.
52-- sometimes requires a little more work.
52class ExpSYM repr' repr | repr -> repr', repr' -> repr where
53class ExpSYM repr' repr | repr -> repr', repr' -> repr where
53− lit :: String -> repr' -> repr
54+ lit :: String -> repr' -> repr
54− capture :: String -> String -> repr -> repr
55+ capture :: String -> String -> repr -> repr
55− reqBody :: String -> repr -> repr
56+ reqBody :: String -> repr -> repr
57+ queryParam :: String -> String -> repr -> repr
56− queryParam :: String -> String -> repr -> repr
58+ matrixParam :: String -> String -> repr -> repr
57− conj :: repr' -> repr -> repr
59+ conj :: repr' -> repr -> repr
58− get :: String -> repr
60+ get :: String -> repr
59− post :: String -> repr
61+ post :: String -> repr
60− put :: String -> repr
62+ put :: String -> repr
61− delete :: String -> repr
63+ delete :: String -> repr
64infixr 6 >:
66infixr 6 >:
@@ -72,7 +74,9 @@ instance ExpSYM Type Type where
72 capture name typ r = AppT (AppT (ConT ''Capture) (LitT (StrTyLit name)))
74 capture name typ r = AppT (AppT (ConT ''Capture) (LitT (StrTyLit name)))
73 (ConT $ mkName typ) >: r
75 (ConT $ mkName typ) >: r
74 reqBody typ r = AppT (ConT ''ReqBody) (ConT $ mkName typ) >: r
76 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)))
76 (ConT $ mkName typ) >: r
80 (ConT $ mkName typ) >: r
77 conj x = AppT (AppT (ConT ''(:>)) x)
81 conj x = AppT (AppT (ConT ''(:>)) x)
78 get typ = AppT (ConT ''Get) (ConT $ mkName typ)
82 get typ = AppT (ConT ''Get) (ConT $ mkName typ)
@@ -93,17 +97,27 @@ parseUrlSegment = try parseCapture
93 <|> try parseLit
97 <|> try parseLit
95 parseCapture = do
99 parseCapture = do
96− cname <- many (noneOf " ?/:")
100+ cname <- many (noneOf " ?/:;")
98− ctyp <- many (noneOf " ?/:")
102+ ctyp <- many (noneOf " ?/:;")
103+ mx <- many parseMatrixParam
99− return $ capture cname ctyp
104+ return $ capture cname ctyp . foldr (.) id mx
100 parseQueryParam = do
105 parseQueryParam = do
102− cname <- many (noneOf " ?/:")
107+ cname <- many (noneOf " ?/:;")
104− ctyp <- many (noneOf " ?/:")
109+ ctyp <- many (noneOf " ?/:;")
105 return $ queryParam cname ctyp
110 return $ queryParam cname ctyp
112+ lt <- many (noneOf " ?/:;")
113+ mx <- many parseMatrixParam
114+ return $ lit lt . foldr (.) id mx
115+ parseMatrixParam = do
106− parseLit = lit <$> many (noneOf " ?/:")
117+ cname <- many (noneOf " ?/:;")
119+ ctyp <- many (noneOf " ?/:;")
120+ return $ matrixParam cname ctyp
108parseUrl :: ExpSYM repr repr => Parser (repr -> repr)
122parseUrl :: ExpSYM repr repr => Parser (repr -> repr)
109parseUrl = do
123parseUrl = do