{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedStrings #-} module Settlr.Routes ( Route(..) , formatRoute , loadRoute ) where import Data.Text (Text) import qualified Data.Text as T import Control.Monad.Reader (MonadReader, asks) import Settlr.Config (Config(..)) import Data.Maybe (fromMaybe) import Network.CGI (MonadCGI, pathInfo) data Route = RouteHome | RouteNew formatRoute :: MonadReader Config m => Route -> m Text formatRoute route = do base <- asks cfgScriptPath pure (fromMaybe base (T.stripSuffix "/" base) <> relative route) where relative :: Route -> Text relative RouteHome = "/" relative RouteNew = "/new" loadRoute :: MonadCGI m => m (Maybe Route) loadRoute = decode . filter (/= T.empty) . T.splitOn "/" . T.pack <$> pathInfo where decode :: [Text] -> Maybe Route decode [] = Just RouteHome decode ["new"] = Just RouteNew decode _ = Nothing