packages feed

keyword-args 0.1.0.5 → 0.2.0.1

raw patch · 3 files changed

+37/−29 lines, 3 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Data.KeywordArgs.Parse: configParser :: Parser [(String, String)]
+ Data.KeywordArgs.Parse: configParser :: Parser [(String, [String])]

Files

keyword-args.cabal view
@@ -1,5 +1,5 @@ name:                keyword-args-version:             0.1.0.5+version:             0.2.0.1 synopsis:            Extract data from a keyword-args config file format  description: Extracts data from a configuration file with keywords
src/Data/KeywordArgs/Parse.hs view
@@ -2,10 +2,13 @@  import Data.Maybe (catMaybes) -import Text.Parsec ((<|>), many, try, manyTill, char, anyChar, many1)+import Text.Parsec+  ((<|>), many, try, lookAhead, manyTill, char, anyChar, many1)+ import Text.Parsec.String (Parser)  import Text.ParserCombinators.Parsec.Prim (GenParser)+ import Text.ParserCombinators.Parsec.Char (space, newline, oneOf, noneOf)  import Control.Monad (liftM2)@@ -14,40 +17,44 @@  import Control.Applicative ((<*), (*>), (<$>)) --- | Returns a parser for input of a keyword, followed by a space,--- followed by one or more arguments. Any comments (text preceeded--- by a '#') will be ignored until the end of the line.-configParser :: Parser [(String, String)]-configParser = catMaybes <$> many line+configParser :: Parser [(String, [String])]+configParser = catMaybes <$> many lineWithArguments -line :: Parser (Maybe (String, String))-line = comment *> return Nothing <|> Just <$> configurationOption+lineWithArguments :: Parser (Maybe (String, [String]))+lineWithArguments =+  comment *> return Nothing+  <|> newline *> return Nothing+  <|> many1 (oneOf "\t ") *> return Nothing+  <|> Just <$> configurationOptionWithArguments -configurationOption :: Parser (String, String)-configurationOption = do+configurationOptionWithArguments :: Parser (String, [String])+configurationOptionWithArguments = do   _ <- many space -  keyword <- manyTill1 anyChar keywordArgSeparator-  val     <- value+  keyword   <- manyTill1 (noneOf "\n") keywordArgSeparator -  return (keyword, val)+  arguments <- argumentParser -value :: Parser String-value =-  unquotedValue <|> quotedValue+  return (keyword, arguments) -  where-    endOfOption   = endOfLineOrInput <|> comment+argumentParser :: Parser [String]+argumentParser =+  manyTill1 (try quotedArgument <|> try unquotedArgument)+  (try endOfLineOrInput <|> try comment) -    quotedValue   = quote-                    *> manyTill1 argumentChar quote-                    <* endOfOption+quotedArgument :: Parser String+quotedArgument =+  many (oneOf " \t") *> quote *> manyTill1 (noneOf "#") quote -    unquotedValue = manyTill1 argumentChar endOfOption+unquotedArgument :: Parser String+unquotedArgument =+  many (oneOf " \t") *> many1 (noneOf "\" \t\n#") <*+  (try comment <|> try (oneOf " \t") *> return () <|>+   lookAhead (try endOfLineOrInput))  comment :: Parser () comment =-  try (many space *> char '#')+  try (many (oneOf " \t") *> char '#')   *> manyTill anyChar endOfLineOrInput   *> return () @@ -56,9 +63,6 @@  manyTill1 :: GenParser tok st a -> GenParser tok st end -> GenParser tok st [a] manyTill1 p end = liftM2 (:) p (manyTill p end)--argumentChar :: Parser Char-argumentChar =  noneOf "#\""  keywordArgSeparator :: Parser () keywordArgSeparator = many1 (oneOf "\t ") *> return ()
src/Main.hs view
@@ -62,9 +62,12 @@     (_, _, errs) ->       ioError (userError (concat errs ++ usageInfo (headerMessage name) options)) -parseConfig :: String -> Either ParseError [(String, String)]+parseConfig :: String -> Either ParseError [(String, [String])] parseConfig = parse configParser "(unknown)" +configToList :: [(String, [String])] -> [[String]]+configToList cfg = map (\line -> fst line : snd line) cfg+ runCheck :: IO () runCheck = do   f <- getContents@@ -72,7 +75,8 @@   case parseConfig f of     Left e -> ioError $ userError $ "Parse error: " ++ show e -    Right config -> putStr $ unpack $ encode config+    Right config ->+      putStr $ unpack $ encode $ configToList config  main :: IO () main = do