summaryrefslogtreecommitdiff
path: root/src/Settlr/Routes.hs
blob: d5b01583e32a49a5c9c3a8fb222cd35b48ffca7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{-# 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