Fixed some dispatch bugs
This commit is contained in:
parent
af30b44ef2
commit
24b519ffa4
@ -133,7 +133,7 @@ mkYesodGeneral name args clazzes isSub res = do
|
|||||||
[ FunD (mkName "renderRoute") render
|
[ FunD (mkName "renderRoute") render
|
||||||
]
|
]
|
||||||
|
|
||||||
let sortedRes = filter (not . isSubSite) th ++ filter isSubSite th
|
let sortedRes = filter (not . isSubSite) th' ++ filter isSubSite th'
|
||||||
yd <- mkYesodDispatch' sortedRes
|
yd <- mkYesodDispatch' sortedRes
|
||||||
let master = mkName "master"
|
let master = mkName "master"
|
||||||
let ctx = if isSub
|
let ctx = if isSub
|
||||||
@ -145,11 +145,11 @@ mkYesodGeneral name args clazzes isSub res = do
|
|||||||
let y = InstanceD ctx ytyp [FunD (mkName "yesodDispatch") [yd]]
|
let y = InstanceD ctx ytyp [FunD (mkName "yesodDispatch") [yd]]
|
||||||
return ([w, x, x'], [y])
|
return ([w, x, x'], [y])
|
||||||
|
|
||||||
isSubSite :: (String, Pieces) -> Bool
|
isSubSite :: ((String, Pieces), a) -> Bool
|
||||||
isSubSite (_, SubSite{}) = True
|
isSubSite ((_, SubSite{}), _) = True
|
||||||
isSubSite _ = False
|
isSubSite _ = False
|
||||||
|
|
||||||
mkYesodDispatch' :: [(String, Pieces)] -> Q Clause
|
mkYesodDispatch' :: [((String, Pieces), Maybe String)] -> Q Clause
|
||||||
mkYesodDispatch' sortedRes = do
|
mkYesodDispatch' sortedRes = do
|
||||||
sub <- newName "sub"
|
sub <- newName "sub"
|
||||||
master <- newName "master"
|
master <- newName "master"
|
||||||
@ -163,14 +163,14 @@ mkYesodDispatch' sortedRes = do
|
|||||||
(NormalB body)
|
(NormalB body)
|
||||||
[]
|
[]
|
||||||
where
|
where
|
||||||
go master sub toMasterRoute mkey segments onFail (constr, SubSite { ssPieces = pieces }) = do
|
go master sub toMasterRoute mkey segments onFail ((constr, SubSite { ssPieces = pieces }), Just toSub) = do
|
||||||
test <- mkSubsiteExp segments pieces id (master, sub, toMasterRoute, mkey, constr)
|
test <- mkSubsiteExp segments pieces id (master, sub, toMasterRoute, mkey, constr, VarE $ mkName toSub)
|
||||||
app <- newName "app"
|
app <- newName "app"
|
||||||
return $ CaseE test
|
return $ CaseE test
|
||||||
[ Match (ConP (mkName "Nothing") []) (NormalB onFail) []
|
[ Match (ConP (mkName "Nothing") []) (NormalB onFail) []
|
||||||
, Match (ConP (mkName "Just") [VarP app]) (NormalB $ VarE app) []
|
, Match (ConP (mkName "Just") [VarP app]) (NormalB $ VarE app) []
|
||||||
]
|
]
|
||||||
go master sub toMasterRoute mkey segments onFail (constr, Simple pieces methods) = do
|
go master sub toMasterRoute mkey segments onFail ((constr, Simple pieces methods), Nothing) = do
|
||||||
test <- mkSimpleExp (VarE segments) pieces id (master, sub, toMasterRoute, mkey, constr, methods)
|
test <- mkSimpleExp (VarE segments) pieces id (master, sub, toMasterRoute, mkey, constr, methods)
|
||||||
just <- [|Just|]
|
just <- [|Just|]
|
||||||
app <- newName "app"
|
app <- newName "app"
|
||||||
@ -178,6 +178,7 @@ mkYesodDispatch' sortedRes = do
|
|||||||
[ Match (ConP (mkName "Nothing") []) (NormalB onFail) []
|
[ Match (ConP (mkName "Nothing") []) (NormalB onFail) []
|
||||||
, Match (ConP (mkName "Just") [VarP app]) (NormalB $ just `AppE` VarE app) []
|
, Match (ConP (mkName "Just") [VarP app]) (NormalB $ just `AppE` VarE app) []
|
||||||
]
|
]
|
||||||
|
go _ _ _ _ _ _ _ = error "Invalid combination"
|
||||||
|
|
||||||
mkSimpleExp :: Exp -- ^ segments
|
mkSimpleExp :: Exp -- ^ segments
|
||||||
-> [Piece]
|
-> [Piece]
|
||||||
@ -195,7 +196,7 @@ mkSimpleExp segments [] frontVars (master, sub, toMasterRoute, mkey, constr, met
|
|||||||
yr <- [|yesodRunner|]
|
yr <- [|yesodRunner|]
|
||||||
cr <- [|fmap chooseRep|]
|
cr <- [|fmap chooseRep|]
|
||||||
let url = foldl' AppE (ConE $ mkName constr) $ frontVars []
|
let url = foldl' AppE (ConE $ mkName constr) $ frontVars []
|
||||||
let runHandlerVars h = runHandler' $ foldl' AppE (cr `AppE` (VarE $ mkName h)) $ frontVars []
|
let runHandlerVars h = runHandler' $ cr `AppE` foldl' AppE (VarE $ mkName h) (frontVars [])
|
||||||
runHandler' h = NormalB $ yr `AppE` sub
|
runHandler' h = NormalB $ yr `AppE` sub
|
||||||
`AppE` VarE master
|
`AppE` VarE master
|
||||||
`AppE` toMasterRoute
|
`AppE` toMasterRoute
|
||||||
@ -279,13 +280,15 @@ mkSimpleExp _ (MultiPiece _:_) _ _ = error "MultiPiece must be last piece"
|
|||||||
mkSubsiteExp :: Name -- ^ segments
|
mkSubsiteExp :: Name -- ^ segments
|
||||||
-> [Piece]
|
-> [Piece]
|
||||||
-> ([Exp] -> [Exp]) -- ^ variables already parsed
|
-> ([Exp] -> [Exp]) -- ^ variables already parsed
|
||||||
-> (Name, Exp, Exp, Name, String) -- ^ master, sub, toMasterRoute, mkey, constructor
|
-> (Name, Exp, Exp, Name, String, Exp) -- ^ master, sub, toMasterRoute, mkey, constructor, toSub
|
||||||
-> Q Exp
|
-> Q Exp
|
||||||
mkSubsiteExp segments [] frontVars (master, sub, toMasterRoute, mkey, constr) = do
|
mkSubsiteExp segments [] frontVars (master, sub, toMasterRoute, mkey, constr, toSub) = do
|
||||||
yd <- [|yesodDispatch|]
|
yd <- [|yesodDispatch|]
|
||||||
dot <- [|(.)|]
|
dot <- [|(.)|]
|
||||||
let con = InfixE (Just toMasterRoute) dot $ Just $ foldl' AppE (ConE $ mkName constr) $ frontVars []
|
let con = InfixE (Just toMasterRoute) dot $ Just $ foldl' AppE (ConE $ mkName constr) $ frontVars []
|
||||||
let app = yd `AppE` sub
|
-- proper handling for sub-subsites
|
||||||
|
let sub' = foldl' AppE (toSub `AppE` sub) $ frontVars []
|
||||||
|
let app = yd `AppE` sub'
|
||||||
`AppE` VarE mkey
|
`AppE` VarE mkey
|
||||||
`AppE` VarE segments
|
`AppE` VarE segments
|
||||||
`AppE` VarE master
|
`AppE` VarE master
|
||||||
|
|||||||
@ -21,7 +21,10 @@ getSubRootR = do
|
|||||||
render <- getUrlRender
|
render <- getUrlRender
|
||||||
return $ RepPlain $ toContent $ "Hello Sub World: " ++ s ++ ". " ++ render (tm SubRootR)
|
return $ RepPlain $ toContent $ "Hello Sub World: " ++ s ++ ". " ++ render (tm SubRootR)
|
||||||
|
|
||||||
handleSubMultiR = return . RepPlain . toContent . show
|
handleSubMultiR :: Strings -> GHandler Subsite m RepPlain
|
||||||
|
handleSubMultiR x = do
|
||||||
|
Subsite y <- getYesodSub
|
||||||
|
return . RepPlain . toContent . show $ (x, y)
|
||||||
|
|
||||||
data HelloWorld = HelloWorld { getSubsite :: String -> Subsite }
|
data HelloWorld = HelloWorld { getSubsite :: String -> Subsite }
|
||||||
mkYesod "HelloWorld" [$parseRoutes|
|
mkYesod "HelloWorld" [$parseRoutes|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user