module Bird.BirdResponder where import Control.Monad.State import Control.Monad.Reader import Control.Monad.Writer import Data.Default import Data.Maybe import Bird.Reply import Bird.Request import qualified Data.Map as Hash type BirdResponder = StateT Reply (ReaderT Request (WriterT [String] IO)) runBirdResponder request router = runWriterT (runReaderT (execStateT (router request) def) request) body b = do reply <- get put $ reply { replyBody = b } status code = do reply <- get put $ reply { replyStatus = code } param paramName = do request <- ask return $ maybe Nothing id (lookup paramName $ params request) log logMessage = do tell [logMessage] mime m = header "Content-Type" m header k v = do reply <- get put $ reply { replyHeaders = Hash.insert k v $ replyHeaders reply }