Incomplete changes

This commit is contained in:
Michael Snoyman 2014-02-24 14:20:17 +02:00
parent 98b64cd17c
commit 9fad1071fc
4 changed files with 79 additions and 5 deletions

View 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) []

View File

@ -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

View File

@ -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

View File

@ -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