content: {-# OPTIONS_GHC -fno-warn-unused-do-bind #-}
  module Hi.Config
      (
        parseConfig
      ) where
  
  import           Control.Applicative ((<$>), (<*))
  import           Control.Monad
  import           Data.Maybe          (catMaybes)
  import           Text.Parsec
  import           Text.Parsec.String
  
  -- | Parse config file
  parseConfig :: String -> [(String, String)]
  parseConfig x = case parse configFile "Invalid config file format" x of
        Left  l  -> error $ show l
        Right xs -> xs
  
  configFile :: Parser [(String, String)]
  configFile = catMaybes <$> many line <* eof
  
  sep :: Parser Char
  sep = char ':'
  
  name :: Parser String
  name = many (oneOf $ ['a'..'z'] ++ ['A'..'Z'] ++ "-")
  
  eol :: Parser Char
  eol = newline <|> (eof >> return '\n')
  
  comment :: Parser ()
  comment = do
      _ <- char '#' <* manyTill anyChar newline
      return ()
  
  line :: Parser (Maybe (String, String))
  line = do
      spaces
      try (comment >> return Nothing) <|> liftM Just line'
    where
      line' = do
          spaces
          n <- name
          spaces >> sep >> spaces
          v <- many (noneOf "\n")
          eol
          return (n, v)
  