>
> module Frame.Router (
> FrameRouter,
> fileFolder,
> Router,
> startRouter
> ) where
> import Data.List
> import Data.Map
> import qualified Data.ByteString.Lazy as L
> import Control.Monad.State (StateT, runStateT)
> import Control.Monad.Reader (ReaderT, runReaderT)
> import Frame.GUI
> import Frame.Data
> import Frame.Config
> import Frame.State
> import Frame.Types
> import Frame.Utilities
> import Frame.Validation
> import Frame.Model
> import Frame.View
> class (FrameConfig m, FrameState m, FrameIO m) => FrameRouter m
> instance (FrameConfig m, FrameState m, FrameIO m) => FrameRouter m
>
> fileFolder :: FrameRouter m => String
> -> [String]
> -> m Data
> fileFolder r fs = do
> f <- liftIO $ L.readFile (r ++ implodeUrl fs) `catch` (\_ -> return L.empty)
> case L.null f of
> True -> return Error404
> False -> return $ File f
>
> type Router = ([String] -> StateT Vars (ReaderT Config IO) Data)
>
> startRouter :: Router
> -> Config
> -> Validators
> -> [(FieldName, String)]
> -> String
> -> String
> -> Bool
> -> IO Data
> startRouter r c@Config{database=db} v vs u id a = let fs = fromList' db vs in
> do
> (d, _) <- runReaderT (runStateT (r $ explodeURL u) startState{fields=fs, validators=v, post=size fs /= 0, ajax=a}) c{sessionId=id}
> return d