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 "\r\n")
commentLine :: Parser ()
commentLine = comment *> nl <|> nl
nl :: Parser ()
nl = () <$ try (string "\r\n") <|> () <$ char '\n'
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