module ColtraneTypes where
import Text.Regex as TR
import qualified Data.Text as DT
import qualified Data.ByteString.Char8 as BS hiding (putStrLn)
import Network.HTTP.Types
import Network.HTTP.Types.Method
import Network.Wai
import qualified Network.Wai.Parse as Parse
import Control.Monad.Error
import qualified Control.Monad.State as MS
data Route = Route {
method :: StdMethod,
path :: Path,
handler :: Handler
}
data ResponseState = RS {
body :: ResponseBody,
headers :: [Header],
status :: Status
}
rsPlus :: ResponseState -> ResponseState -> ResponseState
rsPlus r1 r2 = RS (body r1 ++ body r2) (headers r1 ++ headers r2) (status r2)
data HandlerState = HS {
resp :: ResponseState,
pms :: Params,
req :: Request
}
data Server = Warp | CGI
deriving (Show)
type ContentType = BS.ByteString
ctHTML = BS.pack "text/html"
ctText = BS.pack "text/plain"
ctJSON = BS.pack "application/json"
ctFile = BS.pack "application/octet-stream"
type ResponseBody = String
data Path = Literal String | RegExp Regex
type ParamKey = String
type ParamValue = String
type Params = [(ParamKey, ParamValue)]
convertBSParams :: [Parse.Param] -> Params
convertBSParams ps = map unpack ps where
unpack (a, b) = (BS.unpack a, BS.unpack b)
type Handler = HandlerM ()
newtype ColtraneApp a = C { runCA :: MS.StateT [Route] IO a }
deriving (Monad, MS.MonadState [Route])
newtype HandlerM a = HM { runHM :: ErrorT String (MS.StateT HandlerState IO) a }
deriving (Monad, MS.MonadState HandlerState, MonadError String, MonadIO)