-- | Parser

{-# LANGUAGE OverloadedStrings #-}

module Network.HTTP.Pony.Serve.Wai.Parser where

import           Data.Attoparsec.ByteString (Parser)
import qualified Data.Attoparsec.ByteString.Char8 as Char
import           Data.ByteString.Char8 (ByteString)
import qualified Data.ByteString.Char8 as B
import qualified Data.CaseInsensitive as CI
import           Data.Char (ord)
import qualified Network.HTTP.Types as HTTP
import           Pipes (Producer)

type RequestURI = ByteString

requestLineTokens :: Parser (HTTP.Method, RequestURI, HTTP.HttpVersion)
requestLineTokens = do
  method <- Char.takeTill (== ' ')
  Char.char ' '
  requestURI <- Char.takeTill (== ' ')
  Char.char ' '
  Char.string "HTTP/"

  let minusZero = (+) (- ord '0')
      charToInt = minusZero . ord
      digit = fmap charToInt Char.digit

  httpVersionMajor<- digit
  Char.char '.'
  httpVersionMinor <- digit

  pure (method, requestURI, HTTP.HttpVersion httpVersionMajor httpVersionMinor)

-- requestURITokens :: Parser (ByteString, ByteString)
-- requestURITokens = do
--   ( (,) <$> Char.takeTill (== '?')
--         <*> (Char.char '?' >> takeByteString)
--     )

--   <|>

--   ( (,) <$> takeByteString
--         <*> pure mempty
--     )

parseRequestURITokens :: ByteString -> Either String (ByteString, ByteString)
parseRequestURITokens x = pure $
  let pathInfo = B.takeWhile (/= '?') x
      queryString = B.dropWhile (== '?') . B.dropWhile (/= '?') $  x
  in

  (pathInfo, queryString)