{-# LANGUAGE NamedFieldPuns #-} module Network.Loli.Engine where import Control.Monad.Reader hiding (join) import Control.Monad.State hiding (join) import Data.Default import Hack import Hack.Contrib.Middleware.UserMime import Hack.Contrib.Middleware.NotFound import Hack.Contrib.Utils hiding (get, put) import MPS import Network.Loli.Config import Network.Loli.Middleware.LoliRouter () import Network.Loli.Type import Network.Loli.Utils import Prelude hiding ((.), (/), (>), (^), (-)) run_app :: AppUnit -> Application run_app unit = \env -> runReaderT unit env .flip execStateT def {status = 200} loli :: Unit -> Application loli unit = run unit not_found_app where not_found_app = not_found dummy_app run_route x = (x.router) loli_captures run_app (x.route_path) run :: Unit -> Middleware run unit' = let loli_state = execState unit' def route_configs = loli_state.routes route = route_configs.map run_route .use mime_filter = user_mime (loli_state.mimes) stack = loli_state.middlewares.use pre = pre_installed_middlewares.use in use [pre, mime_filter, stack, route] add_route_config :: RouteConfig -> Loli -> Loli add_route_config r s = let xs = s.routes in s {routes = xs.insert_last r} add_route :: RequestMethod -> String -> AppUnit -> Unit add_route r s u = do c <- get ^ current_router update - add_route_config RouteConfig { route_path = (r, s, u), router = c } set_router :: Router -> Loli -> Loli set_router r x = x { current_router = r } add_middleware :: Middleware -> Loli -> Loli add_middleware x s = let xs = s.middlewares in s {middlewares = xs.insert_last x} add_mime :: String -> String -> Loli -> Loli add_mime k v s = let xs = s.mimes in s {mimes = xs.insert_last (k, v)}