{-# LANGUAGE OverloadedStrings #-}

module Database.Redis.Parser (
  parseRequest,
  ) where

import           Control.Applicative
import           Control.Monad
import           Data.Attoparsec.Char8 as A

import           Database.Redis.Types

parseRequest :: Parser Request
parseRequest = unified <|> inline where
  unified = do
    n <- char '*' *> decimal <* crlf
    Request <$> replicateM n arg

  arg = do
    n <- char '$' *> decimal <* crlf
    A.take n <* crlf

  inline = do
    cmd <- A.takeWhile1 A.isAlpha_ascii
    Request <$> ((cmd:) <$> many (char ' ' *> A.takeTill isSpace)) <* crlf

  crlf = string "\r\n"

{-# INLINE parseRequest #-}