module Hack where

import Data.Default

data RequestMethod = 
    OPTIONS
  | GET
  | HEAD
  | POST
  | PUT
  | DELETE
  | TRACE
  | CONNECT
  deriving (Show, Read, Eq)

data Hack_UrlScheme = HTTP | HTTPS deriving (Show, Eq)

type Map = [(String, String)]

data Env = Env {
  request_method :: RequestMethod,
  script_name :: String,
  path_info :: String,
  query_string :: String,
  server_name :: String,
  server_port :: Int,
  http_ :: Map,
  hack_version :: [Int],
  hack_url_scheme :: Hack_UrlScheme,
  hack_input :: String,
  hack_errors :: String,
  hack_multithread :: String,
  hack_multiprocess :: String,
  hack_run_once :: String,
  custom :: Map
  }
  deriving (Show)

data Response = Response {
  status :: Int,
  headers :: Map,
  body :: String
  }
  deriving (Show)

instance Default RequestMethod where
  def = GET

instance Default Hack_UrlScheme where
  def = HTTP

instance Default Bool where
  def = False

instance Default Response where
  def = Response def def def

instance Default Env where
  def = Env def def def def def def def def def def def def def def def

type Application = Env -> IO Response

type MiddleWare = Application -> Application