packages feed

haskyapi-0.0.0.1: src/Web/Haskyapi/Config/Parser.hs

{-# LANGUAGE RecordWildCards, BangPatterns #-}
module Web.Haskyapi.Config.Parser (
  sparser,
  A (..),
) where
import Text.Parsec
import Control.Applicative ((<$>), (<*>))

data A = A { key :: String, aval :: String }
       | B { key :: String, bval :: [A] }
       deriving (Show)


sptab = many (oneOf " \t")
nt = oneOf "\n" *> (oneOf "\t" <|> char ' ' *> char ' ')

sparser :: String -> String -> Either ParseError [A]
sparser name str = parse (_sparser []) name str
  where
    _sparser l = do
      sharp
      many (oneOf "\n")
      a <- colon
      many (oneOf "\n")
      sharp
      try (eof *> return (a:l)) <|> _sparser (a:l)

colon = do
  x <- many alphaNum
  sptab *> char ':' *> sptab
  try (B x <$> (nt *> hyphens)) <|> (A x <$> many1 (alphaNum <|> oneOf "."))

arrow = do
  x <- many alphaNum
  sptab *> string "->" *> sptab
  A x <$> many1 (alphaNum <|> oneOf "./")

hyphens = _hyphens []
  where
    _hyphens l = do
      a <- hyphen
      try (sptab *> nt *> _hyphens (a:l)) <|> return (a:l)

hyphen = do
  char '-' *> sptab
  a <- arrow
  return a

sharp =
  try
    (oneOf "#" *> many (noneOf "\n") *> many (oneOf "\n") *> sharp)
  <|>
    return ()

main = do
  f <- readFile "./setting.yml"
  putStrLn f
  print $ sparser "setting.yml" f
  -- parseTest sparser "x:  y\nip : 0.0.0.0\n\nsub :\n\t- hoge -> foo\n\t- foo -> okok"
  -- parseTest sharp   "## comment out\n# comment\t is\n##########\n"