module Network.Wai.RequestSpec.Internal.Env (
Env(..),
EnvMap,
ParamValue(..),
defaultEnv,
mkHeaders,
mkParams,
toEnv
) where
import Data.ByteString (ByteString)
import Data.CaseInsensitive (CI, original, mk)
import Data.Text (Text)
import Data.Text.Encoding (decodeUtf8)
import Network.HTTP.Types
import Network.Wai (Request, requestHeaders, queryString)
import qualified Data.Map as M
data ParamValue
= Present Text
| Empty
| NotFound
deriving (Show)
type EnvMap k v = M.Map k v
type Headers = EnvMap (CI Text) Text
type Params = EnvMap Text ParamValue
data Env = Env { headers :: Headers
, params :: Params
} deriving Show
bt :: ByteString -> Text
bt = decodeUtf8
mkParams :: Query -> Params
mkParams query = go query M.empty
where go [] acc = acc
go ((a,Nothing):qs) acc = go qs (M.insert (bt a) Empty acc)
go ((a,Just b):qs) acc = go qs (M.insert (bt a) (Present . bt $ b) acc)
defaultEnv :: Env
defaultEnv = Env M.empty M.empty
mkHeaders :: RequestHeaders -> Headers
mkHeaders = M.fromList . fmap (\(a,b) -> (mk . bt . original $ a, bt b))
toEnv :: Request -> Env
toEnv r = Env headers' params'
where headers' = (mkHeaders . requestHeaders) r
params' = (mkParams . queryString) r