module Network.UrlDisp (
UrlDisp,
UrlS,
h, (|/), (|//), (|?), (|\), (|\\), (|.),
path, meth, param, takePath, readPath, endPath,
runUrlDisp, evalUrlDisp
) where
import Control.Monad.Maybe
import Control.Monad.State.Strict
import Network.CGI
import Network.CGI.Monad
import Network.UrlDisp.Types
import Network.UrlDisp.Controller
runUrlDisp :: (MonadCGI m)
=> String
-> UrlDisp m a
-> m (Maybe a)
runUrlDisp p (UrlDisp hn) = runMaybeT $ evalStateT hn (UrlS {pPath = pinfo})
where pinfo = (filter (not . null) . splitPath) p
splitPath :: String -> [String]
splitPath xs = let (zs, ys) = break (=='/') xs
in zs : case ys of
[] -> []
_:ws -> splitPath ws
evalUrlDisp :: (MonadCGI m, MonadIO m) => UrlDisp m CGIResult -> m CGIResult
evalUrlDisp handler = pathInfo >>= \s -> runUrlDisp s handler >>=
maybe (outputNotFound s) return