packages feed

hxweb-0.1: src/Network/HxWeb/Utils.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  Network.HxWeb.Utils
-- Copyright   :  (c) David Himmelstrup 2006
-- License     :  BSD-like
--
-- Maintainer  :  lemmih@gmail.com
-- Stability   :  provisional
-- Portability :  portable
--
-----------------------------------------------------------------------------
module Network.HxWeb.Utils
    ( readM       -- (Monad m, Read a) => String -> m a
    , getInput'   -- String -> WebPage st String
    , readInput'  -- Read a => String -> WebPage st a
    , escape      -- String -> WebPage st a
    , runWebPage  -- st -> WebPage st CGIResult -> CGI CGIResult
    ) where

import Network.CGI           ( CGI, CGIResult, output, redirect
                             , getInput )
import Control.Monad.State   ( evalStateT )

import Network.HxWeb.Monad   ( WebPage(..), WebResult(..) )

readM :: (Monad m,Read a) => String -> m a
readM str = case reads str of
              [] -> fail "No parse"
              [(val,_)] -> return val
              _ -> fail "Ambiguous parse"

getInput' :: String -> WebPage st String
getInput' key = do mbVal <- getInput key
                   case mbVal of
                     Nothing -> fail $ "Failed to lookup key: " ++ key
                     Just val -> return val

readInput' :: Read a => String -> WebPage st a
readInput' key
    = do val <- getInput' key
         readM val

escape :: String -> WebPage st a
escape redirect
    = WebPage (return (Redirect redirect))

runWebPage :: st -> WebPage st CGIResult -> CGI CGIResult
runWebPage st (WebPage r)
    = do ret <- evalStateT r st
         case ret of
           WebResult a  -> return a
           Fail str     -> output $ "Uncaught error: " ++ str
           Redirect url -> redirect url