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"