{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE OverloadedStrings #-} module YesodDsl.Generator.Handlers where import YesodDsl.AST import Data.Maybe import qualified Data.Text as T import Data.List import Text.Shakespeare.Text hiding (toText) import Data.String.Utils (rstrip) import qualified Data.Map as Map import YesodDsl.Generator.GetHandler import YesodDsl.Generator.UpdateHandlers import YesodDsl.Generator.Routes import Control.Monad.State import YesodDsl.Generator.Esqueleto hsRouteParams :: [PathPiece] -> String hsRouteParams ps = intercalate " " [("p" ++ show x) | x <- [1..length (filter hasType ps)]] where hasType (PathId _ _) = True hasType _ = False hsHandlerMethod :: HandlerType -> String hsHandlerMethod GetHandler = "get" hsHandlerMethod PutHandler = "put" hsHandlerMethod PostHandler = "post" hsHandlerMethod DeleteHandler = "delete" handler :: Handler -> State Context String handler (Handler _ ht ps) = do ctx <- get put $ ctx { ctxHandlerParams = ps, ctxTypes = Map.empty } m <- gets ctxModule r <- gets ctxRoute >>= return . fromJust result <- liftM concat $ sequence [ return $ T.unpack $(codegenFile "codegen/handler-header.cg"), return $ (if Public `elem` ps then "" else (T.unpack $(codegenFile "codegen/handler-requireauth.cg"))), case ht of GetHandler -> getHandler PutHandler -> updateHandler PostHandler -> updateHandler DeleteHandler -> updateHandler ] return result