module Text.Config.Lib
    where

import Text.Parsec
import Text.Parsec.ByteString
import Control.Applicative hiding (many, (<|>))
import Network.URI
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as BC

comment :: Parser ()
comment = () <$ string "--" <* many (noneOf "\n")

commentLine :: Parser ()
commentLine = () <$ (comment *> newline <|> newline)

commentLines :: Parser ()
commentLines = () <$ many commentLine

key :: Parser String
key = many1 $ oneOf $ ['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9'] ++ "_"

spcs :: Parser ()
spcs = () <$ many spc

spcs1 :: Parser ()
spcs1 = () <$ many1 spc

spc :: Parser Char
spc = satisfy (`elem` " \t")

cv_string :: Parser String
cv_string = try $ do
    char '"'
    str <- many1 (noneOf "\"\r\n")
    char '"'
    return str
  <|> many1 (noneOf ", \t\r\n") <* spcs

cv_bytestring :: Parser ByteString
cv_bytestring = BC.pack <$> cv_string

cv_list :: Parser p -> Parser [p]
cv_list p = sepBy p (spcs *> char ',' <* spcs) <* spcs

cv_uri :: Parser String
cv_uri = do
    str <- cv_string
    if isURI str
      then return str
      else fail "parse error: URI"

cv_int :: Parser Int
cv_int = read <$> many1 digit <* spcs

sep :: Parser ()
sep = () <$ char ':' *> spcs