Fixed liftVerbMap wrt applyUrlParams
This commit is contained in:
parent
3661d96f0b
commit
f27f6cd7e3
@ -203,7 +203,7 @@ getAllPairs (x:xs) = map ((,) x) xs ++ getAllPairs xs
|
|||||||
checkPatterns :: (MonadFailure OverlappingPatterns m,
|
checkPatterns :: (MonadFailure OverlappingPatterns m,
|
||||||
MonadFailure InvalidResourcePattern m)
|
MonadFailure InvalidResourcePattern m)
|
||||||
=> [ResourcePattern]
|
=> [ResourcePattern]
|
||||||
-> m [RP] -- FIXME
|
-> m [RP]
|
||||||
checkPatterns rpss = do
|
checkPatterns rpss = do
|
||||||
rps <- mapM (runKleisli $ Kleisli return &&& Kleisli readRP) rpss
|
rps <- mapM (runKleisli $ Kleisli return &&& Kleisli readRP) rpss
|
||||||
let overlaps' = concatMap helper $ getAllPairs rps
|
let overlaps' = concatMap helper $ getAllPairs rps
|
||||||
@ -291,10 +291,9 @@ rpnodesTH ns = do
|
|||||||
cpb <- [|doesPatternMatch|]
|
cpb <- [|doesPatternMatch|]
|
||||||
let r' = VarE $ mkName "resource"
|
let r' = VarE $ mkName "resource"
|
||||||
let g = cpb `AppE` rp' `AppE` r'
|
let g = cpb `AppE` rp' `AppE` r'
|
||||||
vm' <- liftVerbMap vm $ countParams rp
|
vm' <- liftVerbMap vm r' rp
|
||||||
vm'' <- applyUrlParams rp r' vm'
|
let vm'' = LamE [VarP $ mkName "verb"] vm'
|
||||||
let vm''' = LamE [VarP $ mkName "verb"] vm''
|
return (NormalG g, vm'')
|
||||||
return (NormalG g, vm''')
|
|
||||||
|
|
||||||
data UrlParam = SlurpParam { slurpParam :: [String] }
|
data UrlParam = SlurpParam { slurpParam :: [String] }
|
||||||
| StringParam { stringParam :: String }
|
| StringParam { stringParam :: String }
|
||||||
@ -339,12 +338,6 @@ applyUrlParams rp@(RP rpps) r f = do
|
|||||||
rest' <- helper (i + 1) rest
|
rest' <- helper (i + 1) rest
|
||||||
return $ slurp `AppE` rp' `AppE` r `AppE` i' : rest'
|
return $ slurp `AppE` rp' `AppE` r `AppE` i' : rest'
|
||||||
|
|
||||||
countParams :: RP -> Int
|
|
||||||
countParams (RP rpps) = helper 0 rpps where
|
|
||||||
helper i [] = i
|
|
||||||
helper i (Static _:rest) = helper i rest
|
|
||||||
helper i (_:rest) = helper (i + 1) rest
|
|
||||||
|
|
||||||
instance Lift RP where
|
instance Lift RP where
|
||||||
lift (RP rpps) = do
|
lift (RP rpps) = do
|
||||||
rpps' <- lift rpps
|
rpps' <- lift rpps
|
||||||
@ -363,26 +356,34 @@ instance Lift RPP where
|
|||||||
lift (Slurp s) = do
|
lift (Slurp s) = do
|
||||||
sl <- [|Slurp|]
|
sl <- [|Slurp|]
|
||||||
return $ sl `AppE` (LitE $ StringL s)
|
return $ sl `AppE` (LitE $ StringL s)
|
||||||
liftVerbMap :: VerbMap -> Int -> Q Exp
|
liftVerbMap :: VerbMap -> Exp -> RP -> Q Exp
|
||||||
liftVerbMap (AllVerbs s) _ = do
|
liftVerbMap (AllVerbs s) r rp = do
|
||||||
cr <- [|(.) (fmap chooseRep)|]
|
-- handler function
|
||||||
return $ cr `AppE` ((VarE $ mkName s) `AppE` (VarE $ mkName "verb"))
|
let f = VarE $ mkName s
|
||||||
liftVerbMap (Verbs vs) params = do
|
-- applied to the verb
|
||||||
cr0 <- [|fmap chooseRep|]
|
let f' = f `AppE` VarE (mkName "verb")
|
||||||
cr1 <- [|(.) (fmap chooseRep)|]
|
-- apply all the url params
|
||||||
let cr = if params == 0 then cr0 else cr1
|
f'' <- applyUrlParams rp r f'
|
||||||
return $ CaseE (VarE $ mkName "verb")
|
-- and apply chooseRep
|
||||||
$ map (helper cr) vs ++ [whenNotFound]
|
cr <- [|fmap chooseRep|]
|
||||||
|
let f''' = cr `AppE` f''
|
||||||
|
return f'''
|
||||||
|
liftVerbMap (Verbs vs) r rp = do
|
||||||
|
cr <- [|fmap chooseRep|]
|
||||||
|
vs' <- mapM (helper cr) vs
|
||||||
|
return $ CaseE (VarE $ mkName "verb") $ vs' ++ [whenNotFound]
|
||||||
where
|
where
|
||||||
helper :: Exp -> (Verb, String) -> Match
|
helper :: Exp -> (Verb, String) -> Q Match
|
||||||
helper cr (v, f) =
|
helper cr (v, fName) = do
|
||||||
Match (ConP (mkName $ show v) [])
|
let f = VarE $ mkName fName
|
||||||
(NormalB $ cr `AppE` VarE (mkName f))
|
f' <- applyUrlParams rp r f
|
||||||
[]
|
let f'' = cr `AppE` f'
|
||||||
|
let con = ConP (mkName $ show v) []
|
||||||
|
return $ Match con (NormalB f'') []
|
||||||
whenNotFound :: Match
|
whenNotFound :: Match
|
||||||
whenNotFound =
|
whenNotFound =
|
||||||
Match WildP
|
Match WildP
|
||||||
(NormalB $ LamE (replicate params WildP) $ VarE $ mkName "notFound")
|
(NormalB $ VarE $ mkName "notFound")
|
||||||
[]
|
[]
|
||||||
|
|
||||||
strToExp :: Bool -> String -> Q Exp
|
strToExp :: Bool -> String -> Q Exp
|
||||||
|
|||||||
@ -21,6 +21,10 @@ pageUpdate :: String -> Handler MyYesod RepChooser
|
|||||||
pageUpdate s = return $ chooseRep $ toHtmlObject ["pageUpdate", s]
|
pageUpdate s = return $ chooseRep $ toHtmlObject ["pageUpdate", s]
|
||||||
userInfo :: Int -> Handler MyYesod HtmlObject
|
userInfo :: Int -> Handler MyYesod HtmlObject
|
||||||
userInfo i = return $ toHtmlObject ["userInfo", show i]
|
userInfo i = return $ toHtmlObject ["userInfo", show i]
|
||||||
|
userVariable :: Int -> String -> Handler MyYesod HtmlObject
|
||||||
|
userVariable i s = return $ toHtmlObject ["userVariable", show i, s]
|
||||||
|
userPage :: Int -> [String] -> Handler MyYesod HtmlObject
|
||||||
|
userPage i p = return $ toHtmlObject ["userPage", show i, show p]
|
||||||
|
|
||||||
instance Show (Verb -> Handler MyYesod RepChooser) where
|
instance Show (Verb -> Handler MyYesod RepChooser) where
|
||||||
show _ = "verb -> handler"
|
show _ = "verb -> handler"
|
||||||
@ -38,6 +42,10 @@ handler = [$resources|
|
|||||||
Post: pageUpdate
|
Post: pageUpdate
|
||||||
/user/#id/:
|
/user/#id/:
|
||||||
Get: userInfo
|
Get: userInfo
|
||||||
|
/user/#id/profile/$variable/:
|
||||||
|
Get: userVariable
|
||||||
|
/user/#id/page/*page/:
|
||||||
|
Get: userPage
|
||||||
|]
|
|]
|
||||||
|
|
||||||
ph :: Handler MyYesod RepChooser -> IO ()
|
ph :: Handler MyYesod RepChooser -> IO ()
|
||||||
@ -57,3 +65,4 @@ main = do
|
|||||||
ph $ handler ["user"] Get
|
ph $ handler ["user"] Get
|
||||||
ph $ handler ["user", "five"] Get
|
ph $ handler ["user", "five"] Get
|
||||||
ph $ handler ["user", "5"] Get
|
ph $ handler ["user", "5"] Get
|
||||||
|
ph $ handler ["user", "5", "profile", "email"] Get
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user