paripari-0.1.0.0: example.hs
import System.Environment (getArgs)
import Text.PariPari
import qualified Data.ByteString as B
data Value
= Object ![(Text, Value)]
| Array ![Value]
| String !Text
| Number !Integer !Integer
| Bool !Bool
| Null
deriving (Eq, Show)
json :: Parser Value
json = space *> (object <|> array) <?> "json"
object :: Parser Value
object = Object <$> (char '{' *> space *> sepBy pair (space *> char ',' *> space) <* space <* char '}') <?> "object"
pair :: Parser (Text, Value)
pair = (,) <$> (text <* space) <*> (char ':' *> space *> value)
array :: Parser Value
array = Array <$> (char '[' *> sepBy value (space *> char ',' *> space) <* space <* char ']') <?> "array"
value :: Parser Value
value =
(String <$> text)
<|> object
<|> array
<|> (Bool False <$ string "false")
<|> (Bool True <$ string "true")
<|> (Null <$ string "null")
<|> number
text :: Parser Text
text = char '"' *> takeCharsWhile (/= '"') <* char '"' <?> "text"
number :: Parser Value
number = label "number" $ do
neg <- option id $ negate <$ char '-'
(c, _, e) <- fractionDec (pure ())
pure $ Number (neg c) e
space :: Parser ()
space = skipCharsWhile (\c -> c == ' ' || c == '\n' || c == '\t')
main :: IO ()
main = do
args <- getArgs
case args of
[file] -> do
b <- B.readFile file
case runParser json file b of
Left x -> do
putStrLn $ showReport x
print $ runTracer json file b
Right x -> print x
_ -> error "Usage: example test.json"