{- DisTract ------------------------------------------------------\ | | | Copyright (c) 2007, Matthew Sackman (matthew@wellquite.org) | | | | DisTract is freely distributable under the terms of a 3-Clause | | BSD-style license. For details, see the DisTract web site: | | http://distract.wellquite.org/ | | | \-----------------------------------------------------------------} module DisTract.Config.Parser (parseConfig, findUserInPrefsBranch ) where import DisTract.Monotone.Parser (handleParseError) import qualified Data.Map as M import Text.ParserCombinators.Parsec parseConfig :: String -> M.Map String String parseConfig = handleParseError . runParser (configParser M.empty) () "DisTract.Config.Parser" configParser :: (M.Map String String) -> Parser (M.Map String String) configParser m = do { key <- manyTill anyChar (try (char '=')) ; value <- manyTill anyChar ((try (do {newline; return ()})) <|> eof) ; rest <- configParser m ; return (M.insert key value rest) } <|> return m findUserInPrefsBranch :: String -> String findUserInPrefsBranch = handleParseError . runParser parseUserBranch () "DisTract.Config.Parser userBranch" parseUserBranch :: Parser String parseUserBranch = do { manyTill anyChar (try (string ".prefs.")) ; user <- manyTill anyChar ((try (do {newline; return ()})) <|> eof) ; return user }