module Hack2.Contrib.Middleware.URLMap (url_map) where
import Hack2
import Hack2.Contrib.Utils
import Data.List (find, isPrefixOf)
import Air.Env hiding (Default, def)
import Prelude ()
import qualified Data.ByteString.Char8 as B
type RoutePath = (B.ByteString, Application)
url_map :: [RoutePath] -> Middleware
url_map h app = \env ->
let path = env.path_info
script = env.script_name
mod_env location = env
{ scriptName = script + location
, pathInfo = path.B.drop (location.B.length)
}
in
case h.find (fst > (`B.isPrefixOf` path) ) of
Nothing -> app env
Just (location, app') -> app' (mod_env location)