Incomplete changes
This commit is contained in:
parent
98b64cd17c
commit
9fad1071fc
57
yesod-routes/Yesod/Routes/TH/Simple.hs
Normal file
57
yesod-routes/Yesod/Routes/TH/Simple.hs
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
{-# LANGUAGE RecordWildCards, TemplateHaskell, ViewPatterns #-}
|
||||||
|
module Yesod.Routes.TH.Simple where
|
||||||
|
|
||||||
|
import Yesod.Routes.TH
|
||||||
|
import Language.Haskell.TH.Syntax
|
||||||
|
import Web.PathPieces
|
||||||
|
import Data.Maybe (mapMaybe)
|
||||||
|
import Control.Monad (forM)
|
||||||
|
import Data.List (foldl')
|
||||||
|
import Data.ByteString (ByteString)
|
||||||
|
|
||||||
|
mkSimpleDispatchClauses :: MkDispatchSettings -> [ResourceTree a] -> Q [Clause]
|
||||||
|
mkSimpleDispatchClauses MkDispatchSettings {..} (flatten -> resources) = do
|
||||||
|
clauses <- mapM go resources
|
||||||
|
clause404 <- mkClause404
|
||||||
|
return $ clauses ++ [clause404]
|
||||||
|
where
|
||||||
|
go (FlatResource _ name pieces dispatch) = do
|
||||||
|
let env = VarE $ mkName "env"
|
||||||
|
req = VarE $ mkName "req"
|
||||||
|
gpi <- mdsGetPathInfo
|
||||||
|
gm <- mdsMethod
|
||||||
|
let handlePiece (_, Static str) = return (LitP $ StringL str, Nothing)
|
||||||
|
handlePiece (_, Dynamic _) = do
|
||||||
|
x <- newName "x"
|
||||||
|
let pat = ViewP (VarE 'fromPathPiece) (ConP 'Just [VarP x])
|
||||||
|
return (pat, Just x)
|
||||||
|
pairs <- mapM handlePiece pieces
|
||||||
|
let pats = map fst pairs
|
||||||
|
names = mapMaybe snd pairs
|
||||||
|
runHandler <- mdsRunHandler
|
||||||
|
let route = foldl' AppE (ConE (mkName name)) (map VarE names)
|
||||||
|
exp <- case dispatch of
|
||||||
|
Methods _ [] -> error "no methods"
|
||||||
|
Methods _ methods -> do
|
||||||
|
matches <- forM methods $ \method -> do
|
||||||
|
handler' <- mdsGetHandler (Just method) name
|
||||||
|
let handler = foldl' AppE handler' (map VarE names)
|
||||||
|
let body = NormalB exp
|
||||||
|
jroute = ConE 'Just `AppE` route
|
||||||
|
exp = runHandler `AppE` handler `AppE` env `AppE` jroute `AppE` req
|
||||||
|
return $ Match (LitP $ StringL method) body []
|
||||||
|
let method = SigE (gm `AppE` req) (ConT ''ByteString)
|
||||||
|
return $ CaseE method matches
|
||||||
|
return $ Clause
|
||||||
|
[ VarP $ mkName "env"
|
||||||
|
, AsP (mkName "req") (ViewP gpi (ListP pats))
|
||||||
|
] (NormalB exp) []
|
||||||
|
|
||||||
|
mkClause404 = do
|
||||||
|
handler <- mds404
|
||||||
|
runHandler <- mdsRunHandler
|
||||||
|
let exp = runHandler `AppE` handler `AppE` VarE (mkName "env") `AppE` ConE 'Nothing `AppE` VarE (mkName "req")
|
||||||
|
return $ Clause
|
||||||
|
[ VarP (mkName "env")
|
||||||
|
, VarP (mkName "req")
|
||||||
|
] (NormalB exp) []
|
||||||
@ -1,3 +1,4 @@
|
|||||||
|
{-# LANGUAGE CPP #-}
|
||||||
{-# LANGUAGE QuasiQuotes #-}
|
{-# LANGUAGE QuasiQuotes #-}
|
||||||
{-# LANGUAGE RecordWildCards #-}
|
{-# LANGUAGE RecordWildCards #-}
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
@ -27,6 +28,9 @@ import qualified Yesod.Routes.Class as YRC
|
|||||||
import Data.Text (Text, pack, unpack, append)
|
import Data.Text (Text, pack, unpack, append)
|
||||||
import Data.ByteString (ByteString)
|
import Data.ByteString (ByteString)
|
||||||
import qualified Data.ByteString.Char8 as S8
|
import qualified Data.ByteString.Char8 as S8
|
||||||
|
#if SIMPLE_DISPATCH
|
||||||
|
import Yesod.Routes.TH.Simple
|
||||||
|
#endif
|
||||||
|
|
||||||
class ToText a where
|
class ToText a where
|
||||||
toText :: a -> Text
|
toText :: a -> Text
|
||||||
@ -108,7 +112,11 @@ do
|
|||||||
|
|
||||||
rrinst <- mkRenderRouteInstance (ConT ''Hierarchy) $ map (fmap parseType) resources
|
rrinst <- mkRenderRouteInstance (ConT ''Hierarchy) $ map (fmap parseType) resources
|
||||||
prinst <- mkParseRouteInstance (ConT ''Hierarchy) $ map (fmap parseType) resources
|
prinst <- mkParseRouteInstance (ConT ''Hierarchy) $ map (fmap parseType) resources
|
||||||
dispatch <- mkDispatchClause MkDispatchSettings
|
#if SIMPLE_DISPATCH
|
||||||
|
dispatch <- mkSimpleDispatchClauses MkDispatchSettings
|
||||||
|
#else
|
||||||
|
dispatch <- fmap return $ mkDispatchClause MkDispatchSettings
|
||||||
|
#endif
|
||||||
{ mdsRunHandler = [|runHandler|]
|
{ mdsRunHandler = [|runHandler|]
|
||||||
, mdsSubDispatcher = [|subDispatch|]
|
, mdsSubDispatcher = [|subDispatch|]
|
||||||
, mdsGetPathInfo = [|fst|]
|
, mdsGetPathInfo = [|fst|]
|
||||||
@ -124,7 +132,7 @@ do
|
|||||||
(ConT ''Dispatcher
|
(ConT ''Dispatcher
|
||||||
`AppT` ConT ''Hierarchy
|
`AppT` ConT ''Hierarchy
|
||||||
`AppT` ConT ''Hierarchy)
|
`AppT` ConT ''Hierarchy)
|
||||||
[FunD (mkName "dispatcher") [dispatch]]
|
[FunD (mkName "dispatcher") dispatch]
|
||||||
: prinst
|
: prinst
|
||||||
: rrinst
|
: rrinst
|
||||||
|
|
||||||
|
|||||||
@ -24,6 +24,9 @@ import Language.Haskell.TH.Syntax
|
|||||||
import Hierarchy
|
import Hierarchy
|
||||||
import qualified Data.ByteString.Char8 as S8
|
import qualified Data.ByteString.Char8 as S8
|
||||||
import qualified Data.Set as Set
|
import qualified Data.Set as Set
|
||||||
|
#if SIMPLE_DISPATCH
|
||||||
|
import Yesod.Routes.TH.Simple
|
||||||
|
#endif
|
||||||
|
|
||||||
result :: ([Text] -> Maybe Int) -> Dispatch Int
|
result :: ([Text] -> Maybe Int) -> Dispatch Int
|
||||||
result f ts = f ts
|
result f ts = f ts
|
||||||
@ -125,7 +128,11 @@ do
|
|||||||
rrinst <- mkRenderRouteInstance (ConT ''MyApp) ress
|
rrinst <- mkRenderRouteInstance (ConT ''MyApp) ress
|
||||||
rainst <- mkRouteAttrsInstance (ConT ''MyApp) ress
|
rainst <- mkRouteAttrsInstance (ConT ''MyApp) ress
|
||||||
prinst <- mkParseRouteInstance (ConT ''MyApp) ress
|
prinst <- mkParseRouteInstance (ConT ''MyApp) ress
|
||||||
dispatch <- mkDispatchClause MkDispatchSettings
|
#if SIMPLE_DISPATCH
|
||||||
|
dispatch <- mkSimpleDispatchClauses MkDispatchSettings
|
||||||
|
#else
|
||||||
|
dispatch <- fmap return $ mkDispatchClause MkDispatchSettings
|
||||||
|
#endif
|
||||||
{ mdsRunHandler = [|runHandler|]
|
{ mdsRunHandler = [|runHandler|]
|
||||||
, mdsSubDispatcher = [|subDispatch dispatcher|]
|
, mdsSubDispatcher = [|subDispatch dispatcher|]
|
||||||
, mdsGetPathInfo = [|fst|]
|
, mdsGetPathInfo = [|fst|]
|
||||||
@ -141,7 +148,7 @@ do
|
|||||||
(ConT ''Dispatcher
|
(ConT ''Dispatcher
|
||||||
`AppT` ConT ''MyApp
|
`AppT` ConT ''MyApp
|
||||||
`AppT` ConT ''MyApp)
|
`AppT` ConT ''MyApp)
|
||||||
[FunD (mkName "dispatcher") [dispatch]]
|
[FunD (mkName "dispatcher") dispatch]
|
||||||
: prinst
|
: prinst
|
||||||
: rainst
|
: rainst
|
||||||
: rrinst
|
: rrinst
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
name: yesod-routes
|
name: yesod-routes
|
||||||
version: 1.2.0.6
|
version: 1.2.1
|
||||||
license: MIT
|
license: MIT
|
||||||
license-file: LICENSE
|
license-file: LICENSE
|
||||||
author: Michael Snoyman <michael@snoyman.com>
|
author: Michael Snoyman <michael@snoyman.com>
|
||||||
@ -21,9 +21,11 @@ library
|
|||||||
, containers >= 0.2
|
, containers >= 0.2
|
||||||
, template-haskell
|
, template-haskell
|
||||||
, path-pieces >= 0.1 && < 0.2
|
, path-pieces >= 0.1 && < 0.2
|
||||||
|
, bytestring
|
||||||
|
|
||||||
exposed-modules: Yesod.Routes.Dispatch
|
exposed-modules: Yesod.Routes.Dispatch
|
||||||
Yesod.Routes.TH
|
Yesod.Routes.TH
|
||||||
|
Yesod.Routes.TH.Simple
|
||||||
Yesod.Routes.Class
|
Yesod.Routes.Class
|
||||||
Yesod.Routes.Parse
|
Yesod.Routes.Parse
|
||||||
Yesod.Routes.Overlap
|
Yesod.Routes.Overlap
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user