module Database.Redis.Info (
    RedisInfo, parseInfo
) where

import Text.Parsec
import Data.Map

import Database.Redis.ByteStringClass

type RedisInfo = Map String String

parseInfo :: String -> Either ParseError RedisInfo
parseInfo = runParser infoP empty "info"
    
infoP :: Parsec String RedisInfo RedisInfo
infoP = do skipMany infoLine
           getState

infoLine :: Parsec String RedisInfo ()
infoLine = emptyLine  <|> commentLine <|> keyLine

emptyLine :: Parsec String RedisInfo ()
emptyLine = skipMany (oneOf [' ', '\t', '\r']) >> newline >> return ()

commentLine :: Parsec String RedisInfo ()
commentLine = char '#' >> skipMany (noneOf ['\n']) >> newline >> return ()

keyLine :: Parsec String RedisInfo ()
keyLine = do key <- many1 (noneOf [':'])
             char ':'
             val <- many1 (noneOf [' ', '\t', '\r', '\n'])
             skipMany (oneOf [' ', '\t', '\r'])
             newline
             m <- getState
             setState $ insert key val m