{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes        #-}
{-# LANGUAGE CPP               #-}

module Text.Toml.Parser
  ( module Text.Toml.Parser
  , module Text.Toml.Types
  ) where

import           Control.Applicative hiding (many, optional, (<|>))
import           Control.Monad

import qualified Data.HashMap.Strict as M
import qualified Data.List           as L
import qualified Data.Set            as S
import           Data.Text           (Text, pack, unpack)
import qualified Data.Vector         as V

#if MIN_VERSION_time(1,5,0)
import           Data.Time.Format    (defaultTimeLocale, iso8601DateFormat,
                                      parseTimeM)
#else
import           Data.Time.Format    (parseTime)
import           System.Locale       (defaultTimeLocale, iso8601DateFormat)
#endif

import           Numeric             (readHex)
import           Text.Parsec

import           Text.Toml.Types

-- Imported as last to fix redundancy warning
import           Prelude             hiding (concat, takeWhile)


-- | Our very own Parser type.
type Parser a = forall s. Parsec Text s a


-- | Convenience function for the test suite and GHCI.
parseOnly :: Parsec Text (S.Set [Text]) a -> Text -> Either ParseError a
parseOnly :: forall a. Parsec Text (Set [Text]) a -> Text -> Either ParseError a
parseOnly Parsec Text (Set [Text]) a
p Text
str = Parsec Text (Set [Text]) a
-> Set [Text] -> SourceName -> Text -> Either ParseError a
forall s t u a.
Stream s Identity t =>
Parsec s u a -> u -> SourceName -> s -> Either ParseError a
runParser (Parsec Text (Set [Text]) a
p Parsec Text (Set [Text]) a
-> ParsecT Text (Set [Text]) Identity ()
-> Parsec Text (Set [Text]) a
forall a b.
ParsecT Text (Set [Text]) Identity a
-> ParsecT Text (Set [Text]) Identity b
-> ParsecT Text (Set [Text]) Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text (Set [Text]) Identity ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof)  Set [Text]
forall a. Set a
S.empty SourceName
"test" Text
str


-- | Parses a complete document formatted according to the TOML spec.
tomlDoc :: Parsec Text (S.Set [Text]) Table
tomlDoc :: Parsec Text (Set [Text]) Table
tomlDoc = do
    ParsecT Text (Set [Text]) Identity ()
Parser ()
skipBlanks
    Table
topTable <- Parsec Text (Set [Text]) Table
Parser Table
table
    [([Text], Node)]
namedSections <- ParsecT Text (Set [Text]) Identity ([Text], Node)
-> ParsecT Text (Set [Text]) Identity [([Text], Node)]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT Text (Set [Text]) Identity ([Text], Node)
Parser ([Text], Node)
namedSection
    -- Ensure the input is completely consumed
    ParsecT Text (Set [Text]) Identity ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
    -- Load each named section into the top table
    (Table -> ([Text], Node) -> Parsec Text (Set [Text]) Table)
-> Table -> [([Text], Node)] -> Parsec Text (Set [Text]) Table
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
foldM ((([Text], Node) -> Table -> Parsec Text (Set [Text]) Table)
-> Table -> ([Text], Node) -> Parsec Text (Set [Text]) Table
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Explicitness
-> ([Text], Node) -> Table -> Parsec Text (Set [Text]) Table
insert Explicitness
Explicit)) Table
topTable [([Text], Node)]
namedSections

-- | Parses a table of key-value pairs.
table :: Parser Table
table :: Parser Table
table = do
    [(Text, Node)]
pairs <- ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity [(Text, Node)]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text s Identity (Text, Node)
-> ParsecT Text s Identity [(Text, Node)]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT Text s Identity (Text, Node)
Parser (Text, Node)
assignment ParsecT Text s Identity (Text, Node)
-> ParsecT Text s Identity ()
-> ParsecT Text s Identity (Text, Node)
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text s Identity ()
Parser ()
skipBlanks)) ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity [(Text, Node)]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity () -> ParsecT Text s Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity ()
Parser ()
skipBlanks ParsecT Text s Identity ()
-> ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity [(Text, Node)]
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [(Text, Node)] -> ParsecT Text s Identity [(Text, Node)]
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return [])
    case [Text] -> Maybe Text
forall a. Ord a => [a] -> Maybe a
maybeDupe (((Text, Node) -> Text) -> [(Text, Node)] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (Text, Node) -> Text
forall a b. (a, b) -> a
fst [(Text, Node)]
pairs) of
      Just Text
k  -> SourceName -> Parsec Text s Table
forall a. SourceName -> ParsecT Text s Identity a
forall (m :: * -> *) a. MonadFail m => SourceName -> m a
fail (SourceName -> Parsec Text s Table)
-> SourceName -> Parsec Text s Table
forall a b. (a -> b) -> a -> b
$ SourceName
"Cannot redefine key " SourceName -> SourceName -> SourceName
forall a. [a] -> [a] -> [a]
++ (Text -> SourceName
unpack Text
k)
      Maybe Text
Nothing -> Table -> Parsec Text s Table
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Table -> Parsec Text s Table) -> Table -> Parsec Text s Table
forall a b. (a -> b) -> a -> b
$ [(Text, Node)] -> Table
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
M.fromList [(Text, Node)]
pairs

-- | Parses an inline table of key-value pairs.
inlineTable :: Parser Node
inlineTable :: Parser Node
inlineTable = do
    [(Text, Node)]
pairs <- ParsecT Text s Identity Char
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity [(Text, Node)]
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'{') (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'}') (ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
skipSpaces ParsecT Text s Identity SourceName
-> ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity [(Text, Node)]
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity [(Text, Node)]
forall {u}. ParsecT Text u Identity [(Text, Node)]
separatedValues ParsecT Text s Identity [(Text, Node)]
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity [(Text, Node)]
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
skipSpaces)
    case [Text] -> Maybe Text
forall a. Ord a => [a] -> Maybe a
maybeDupe (((Text, Node) -> Text) -> [(Text, Node)] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (Text, Node) -> Text
forall a b. (a, b) -> a
fst [(Text, Node)]
pairs) of
      Just Text
k  -> SourceName -> Parsec Text s Node
forall a. SourceName -> ParsecT Text s Identity a
forall (m :: * -> *) a. MonadFail m => SourceName -> m a
fail (SourceName -> Parsec Text s Node)
-> SourceName -> Parsec Text s Node
forall a b. (a -> b) -> a -> b
$ SourceName
"Cannot redefine key " SourceName -> SourceName -> SourceName
forall a. [a] -> [a] -> [a]
++ (Text -> SourceName
unpack Text
k)
      Maybe Text
Nothing -> Node -> Parsec Text s Node
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Node -> Parsec Text s Node) -> Node -> Parsec Text s Node
forall a b. (a -> b) -> a -> b
$ Table -> Node
VTable (Table -> Node) -> Table -> Node
forall a b. (a -> b) -> a -> b
$ [(Text, Node)] -> Table
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
M.fromList [(Text, Node)]
pairs
  where
    skipSpaces :: ParsecT Text u Identity SourceName
skipSpaces      = ParsecT Text u Identity Char -> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ((Char -> Bool) -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy Char -> Bool
isSpc)
    separatedValues :: ParsecT Text u Identity [(Text, Node)]
separatedValues = ParsecT Text u Identity (Text, Node)
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity [(Text, Node)]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
sepBy (ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
skipSpaces ParsecT Text u Identity SourceName
-> ParsecT Text u Identity (Text, Node)
-> ParsecT Text u Identity (Text, Node)
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text u Identity (Text, Node)
Parser (Text, Node)
assignment ParsecT Text u Identity (Text, Node)
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity (Text, Node)
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
skipSpaces) ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
comma
    comma :: ParsecT Text u Identity SourceName
comma           = ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
skipSpaces ParsecT Text u Identity SourceName
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
',' ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
skipSpaces

-- | Find dupes, if any.
maybeDupe :: Ord a => [a] -> Maybe a
maybeDupe :: forall a. Ord a => [a] -> Maybe a
maybeDupe [a]
xx = [a] -> Set a -> Maybe a
forall {a}. Ord a => [a] -> Set a -> Maybe a
dup [a]
xx Set a
forall a. Set a
S.empty
  where
    dup :: [a] -> Set a -> Maybe a
dup []     Set a
_ = Maybe a
forall a. Maybe a
Nothing
    dup (a
x:[a]
xs) Set a
s = if a -> Set a -> Bool
forall a. Ord a => a -> Set a -> Bool
S.member a
x Set a
s then a -> Maybe a
forall a. a -> Maybe a
Just a
x else [a] -> Set a -> Maybe a
dup [a]
xs (a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
S.insert a
x Set a
s)


-- | Parses a 'Table' or 'TableArray' with its header.
-- The resulting tuple has the header's value in the first position, and the
-- 'NTable' or 'NTArray' in the second.
namedSection :: Parser ([Text], Node)
namedSection :: Parser ([Text], Node)
namedSection = do
    Either [Text] [Text]
eitherHdr <- ParsecT Text s Identity (Either [Text] [Text])
-> ParsecT Text s Identity (Either [Text] [Text])
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([Text] -> Either [Text] [Text]
forall a b. a -> Either a b
Left ([Text] -> Either [Text] [Text])
-> ParsecT Text s Identity [Text]
-> ParsecT Text s Identity (Either [Text] [Text])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity [Text]
Parser [Text]
tableHeader) ParsecT Text s Identity (Either [Text] [Text])
-> ParsecT Text s Identity (Either [Text] [Text])
-> ParsecT Text s Identity (Either [Text] [Text])
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity (Either [Text] [Text])
-> ParsecT Text s Identity (Either [Text] [Text])
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ([Text] -> Either [Text] [Text]
forall a b. b -> Either a b
Right ([Text] -> Either [Text] [Text])
-> ParsecT Text s Identity [Text]
-> ParsecT Text s Identity (Either [Text] [Text])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity [Text]
Parser [Text]
tableArrayHeader)
    Parsec Text s ()
Parser ()
skipBlanks
    Table
tbl <- Parsec Text s Table
Parser Table
table
    Parsec Text s ()
Parser ()
skipBlanks
    ([Text], Node) -> Parsec Text s ([Text], Node)
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (([Text], Node) -> Parsec Text s ([Text], Node))
-> ([Text], Node) -> Parsec Text s ([Text], Node)
forall a b. (a -> b) -> a -> b
$ case Either [Text] [Text]
eitherHdr of Left  [Text]
ns -> ([Text]
ns, Table -> Node
VTable Table
tbl )
                               Right [Text]
ns -> ([Text]
ns, VTArray -> Node
VTArray (VTArray -> Node) -> VTArray -> Node
forall a b. (a -> b) -> a -> b
$ Table -> VTArray
forall a. a -> Vector a
V.singleton Table
tbl)


-- | Parses a table header.
tableHeader :: Parser [Text]
tableHeader :: Parser [Text]
tableHeader = ParsecT Text s Identity Char
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity [Text]
-> ParsecT Text s Identity [Text]
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'[') (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
']') ParsecT Text s Identity [Text]
Parser [Text]
headerValue


-- | Parses a table array header.
tableArrayHeader :: Parser [Text]
tableArrayHeader :: Parser [Text]
tableArrayHeader = ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity [Text]
-> ParsecT Text s Identity [Text]
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT Text s Identity SourceName
forall {s} {m :: * -> *} {u}.
Stream s m Char =>
Char -> ParsecT s u m SourceName
twoChar Char
'[') (Char -> ParsecT Text s Identity SourceName
forall {s} {m :: * -> *} {u}.
Stream s m Char =>
Char -> ParsecT s u m SourceName
twoChar Char
']') ParsecT Text s Identity [Text]
Parser [Text]
headerValue
  where
    twoChar :: Char -> ParsecT s u m SourceName
twoChar Char
c = Int -> ParsecT s u m Char -> ParsecT s u m SourceName
forall s (m :: * -> *) t u a.
Stream s m t =>
Int -> ParsecT s u m a -> ParsecT s u m [a]
count Int
2 (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
c)


-- | Parses the value of any header (names separated by dots), into a list of 'Text'.
headerValue :: Parser [Text]
headerValue :: Parser [Text]
headerValue = ((SourceName -> Text
pack (SourceName -> Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity Char -> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
keyChar) ParsecT Text s Identity Text
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity Text
Parser Text
anyStr') ParsecT Text s Identity Text
-> ParsecT Text s Identity Char -> ParsecT Text s Identity [Text]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
`sepBy1` (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'.')
  where
    keyChar :: ParsecT Text u Identity Char
keyChar = ParsecT Text u Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
alphaNum ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'_' ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'-'

-- | Parses a key-value assignment.
assignment :: Parser (Text, Node)
assignment :: Parser (Text, Node)
assignment = do
    Text
k <- (SourceName -> Text
pack (SourceName -> Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity Char -> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
keyChar) ParsecT Text s Identity Text
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity Text
Parser Text
anyStr'
    ParsecT Text s Identity Char -> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ((Char -> Bool) -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy Char -> Bool
isSpc) ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Char -> ParsecT Text s Identity Char
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'=' ParsecT Text s Identity Char
-> ParsecT Text s Identity () -> ParsecT Text s Identity ()
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT Text s Identity ()
Parser ()
skipBlanks
    Node
v <- Parsec Text s Node
Parser Node
value
    (Text, Node) -> Parsec Text s (Text, Node)
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Text
k, Node
v)
  where
    -- TODO: Follow the spec, e.g.: only first char cannot be '['.
    keyChar :: ParsecT Text u Identity Char
keyChar = ParsecT Text u Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
alphaNum ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'_' ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'-'


-- | Parses a value.
value :: Parser Node
value :: Parser Node
value = (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
array       ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array")
    ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
boolean     ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"boolean")
    ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
anyStr      ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"string")
    ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
datetime    ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"datetime")
    ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
float       ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"float")
    ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
integer     ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"integer")
    ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Node
Parser Node
inlineTable ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"inline table")


--
-- | * Toml value parsers
--

array :: Parser Node
array :: Parser Node
array = (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser Node -> Parser Node
arrayOf Parsec Text s Node
Parser Node
array)    ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array of arrays")
    ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser Node -> Parser Node
arrayOf Parsec Text s Node
Parser Node
boolean)  ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array of booleans")
    ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser Node -> Parser Node
arrayOf Parsec Text s Node
Parser Node
anyStr)   ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array of strings")
    ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser Node -> Parser Node
arrayOf Parsec Text s Node
Parser Node
datetime) ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array of datetimes")
    ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser Node -> Parser Node
arrayOf Parsec Text s Node
Parser Node
float)    ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array of floats")
    ParsecT Text s Identity Node
-> ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text s Identity Node -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Parser Node -> Parser Node
arrayOf Parsec Text s Node
Parser Node
integer)  ParsecT Text s Identity Node
-> SourceName -> ParsecT Text s Identity Node
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"array of integers")


boolean :: Parser Node
boolean :: Parser Node
boolean = Bool -> Node
VBoolean (Bool -> Node)
-> ParsecT Text s Identity Bool -> ParsecT Text s Identity Node
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ( (ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text s Identity SourceName
 -> ParsecT Text s Identity SourceName)
-> (SourceName -> ParsecT Text s Identity SourceName)
-> SourceName
-> ParsecT Text s Identity SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceName -> ParsecT Text s Identity SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string (SourceName -> ParsecT Text s Identity SourceName)
-> SourceName -> ParsecT Text s Identity SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
"true")  ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Bool -> ParsecT Text s Identity Bool
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> ParsecT Text s Identity Bool
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True  ParsecT Text s Identity Bool
-> ParsecT Text s Identity Bool -> ParsecT Text s Identity Bool
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
                         (ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text s Identity SourceName
 -> ParsecT Text s Identity SourceName)
-> (SourceName -> ParsecT Text s Identity SourceName)
-> SourceName
-> ParsecT Text s Identity SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceName -> ParsecT Text s Identity SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string (SourceName -> ParsecT Text s Identity SourceName)
-> SourceName -> ParsecT Text s Identity SourceName
forall a b. (a -> b) -> a -> b
$ SourceName
"false") ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Bool -> ParsecT Text s Identity Bool
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> ParsecT Text s Identity Bool
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False )


anyStr :: Parser Node
anyStr :: Parser Node
anyStr = Text -> Node
VString (Text -> Node)
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Node
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity Text
Parser Text
anyStr'

anyStr' :: Parser Text
anyStr' :: Parser Text
anyStr' = ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Text
Parser Text
multiBasicStr ParsecT Text s Identity Text
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Text
Parser Text
basicStr ParsecT Text s Identity Text
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Text
Parser Text
multiLiteralStr ParsecT Text s Identity Text
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity Text
Parser Text
literalStr


basicStr :: Parser Text
basicStr :: Parser Text
basicStr = ParsecT Text s Identity Char
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity Text
-> ParsecT Text s Identity Text
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
dQuote ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
dQuote ((SourceName -> Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall a b.
(a -> b) -> ParsecT Text s Identity a -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap SourceName -> Text
pack (ParsecT Text s Identity SourceName
 -> ParsecT Text s Identity Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall a b. (a -> b) -> a -> b
$ ParsecT Text s Identity Char -> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
strChar)
  where
    strChar :: ParsecT Text u Identity Char
strChar = ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text u Identity Char
forall {u}. ParsecT Text u Identity Char
escSeq ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ((Char -> Bool) -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'"' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'\\'))
    dQuote :: ParsecT Text u Identity Char
dQuote  = Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\"'


multiBasicStr :: Parser Text
multiBasicStr :: Parser Text
multiBasicStr = (ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
openDQuote3 ParsecT Text s Identity SourceName
-> ParsecT Text s Identity [SourceName]
-> ParsecT Text s Identity [SourceName]
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity [SourceName]
forall {u}. ParsecT Text u Identity [SourceName]
escWhiteSpc ParsecT Text s Identity [SourceName]
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (SourceName -> Text
pack (SourceName -> Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity Char
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
manyTill ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
strChar (ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
dQuote3)))
  where
    -- | Parse the a tripple-double quote, with possibly a newline attached
    openDQuote3 :: ParsecT Text u Identity SourceName
openDQuote3 = ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
dQuote3 ParsecT Text u Identity SourceName
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\n') ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
dQuote3
    -- | Parse tripple-double quotes
    dQuote3 :: ParsecT Text u Identity SourceName
dQuote3     = Int
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall s (m :: * -> *) t u a.
Stream s m t =>
Int -> ParsecT s u m a -> ParsecT s u m [a]
count Int
3 (ParsecT Text u Identity Char
 -> ParsecT Text u Identity SourceName)
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'"'
    -- | Parse a string char, accepting escaped codes, ignoring escaped white space
    strChar :: ParsecT Text u Identity Char
strChar     = (ParsecT Text u Identity Char
forall {u}. ParsecT Text u Identity Char
escSeq ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ((Char -> Bool) -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'\\'))) ParsecT Text u Identity Char
-> ParsecT Text u Identity [SourceName]
-> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text u Identity [SourceName]
forall {u}. ParsecT Text u Identity [SourceName]
escWhiteSpc
    -- | Parse escaped white space, if any
    escWhiteSpc :: ParsecT Text u Identity [SourceName]
escWhiteSpc = ParsecT Text u Identity SourceName
-> ParsecT Text u Identity [SourceName]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT Text u Identity SourceName
 -> ParsecT Text u Identity [SourceName])
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity [SourceName]
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\\' ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\n' ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (ParsecT Text u Identity Char -> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT Text u Identity Char
 -> ParsecT Text u Identity SourceName)
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char -> Bool
isSpc Char
c Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'\n'))


literalStr :: Parser Text
literalStr :: Parser Text
literalStr = ParsecT Text s Identity Char
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity Text
-> ParsecT Text s Identity Text
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
sQuote ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
sQuote (SourceName -> Text
pack (SourceName -> Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity Char -> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ((Char -> Bool) -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'\'')))
  where
    sQuote :: ParsecT Text u Identity Char
sQuote = Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\''


multiLiteralStr :: Parser Text
multiLiteralStr :: Parser Text
multiLiteralStr = (ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
openSQuote3 ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text -> ParsecT Text s Identity Text
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ((SourceName -> Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall a b.
(a -> b) -> ParsecT Text s Identity a -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap SourceName -> Text
pack (ParsecT Text s Identity SourceName
 -> ParsecT Text s Identity Text)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Text
forall a b. (a -> b) -> a -> b
$ ParsecT Text s Identity Char
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
manyTill ParsecT Text s Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
sQuote3))
  where
    -- | Parse the a tripple-single quote, with possibly a newline attached
    openSQuote3 :: ParsecT Text u Identity SourceName
openSQuote3 = ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
sQuote3 ParsecT Text u Identity SourceName
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\n') ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
sQuote3
    -- | Parse tripple-single quotes
    sQuote3 :: ParsecT Text u Identity SourceName
sQuote3     = ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text u Identity SourceName
 -> ParsecT Text u Identity SourceName)
-> (Char -> ParsecT Text u Identity SourceName)
-> Char
-> ParsecT Text u Identity SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall s (m :: * -> *) t u a.
Stream s m t =>
Int -> ParsecT s u m a -> ParsecT s u m [a]
count Int
3 (ParsecT Text u Identity Char
 -> ParsecT Text u Identity SourceName)
-> (Char -> ParsecT Text u Identity Char)
-> Char
-> ParsecT Text u Identity SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char (Char -> ParsecT Text u Identity SourceName)
-> Char -> ParsecT Text u Identity SourceName
forall a b. (a -> b) -> a -> b
$ Char
'\''


datetime :: Parser Node
datetime :: Parser Node
datetime = do
    SourceName
d <- ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text s Identity SourceName
 -> ParsecT Text s Identity SourceName)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall a b. (a -> b) -> a -> b
$ ParsecT Text s Identity Char
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity SourceName
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
manyTill ParsecT Text s Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'Z')
#if MIN_VERSION_time(1,5,0)
    let  mt :: Maybe UTCTime
mt = Bool -> TimeLocale -> SourceName -> SourceName -> Maybe UTCTime
forall (m :: * -> *) t.
(MonadFail m, ParseTime t) =>
Bool -> TimeLocale -> SourceName -> SourceName -> m t
parseTimeM Bool
True TimeLocale
defaultTimeLocale (Maybe SourceName -> SourceName
iso8601DateFormat (Maybe SourceName -> SourceName) -> Maybe SourceName -> SourceName
forall a b. (a -> b) -> a -> b
$ SourceName -> Maybe SourceName
forall a. a -> Maybe a
Just SourceName
"%X") SourceName
d
#else
    let  mt = parseTime defaultTimeLocale (iso8601DateFormat $ Just "%X") d
#endif
    case Maybe UTCTime
mt of Just UTCTime
t  -> Node -> Parsec Text s Node
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Node -> Parsec Text s Node) -> Node -> Parsec Text s Node
forall a b. (a -> b) -> a -> b
$ UTCTime -> Node
VDatetime UTCTime
t
               Maybe UTCTime
Nothing -> SourceName -> Parsec Text s Node
forall a. SourceName -> ParsecT Text s Identity a
forall (m :: * -> *) a. MonadFail m => SourceName -> m a
fail SourceName
"parsing datetime failed"


-- | Attoparsec 'double' parses scientific "e" notation; reimplement according to Toml spec.
float :: Parser Node
float :: Parser Node
float = Double -> Node
VFloat (Double -> Node)
-> ParsecT Text s Identity Double -> ParsecT Text s Identity Node
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do
    SourceName
n <- ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
intStr ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity SourceName
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text s Identity Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ((Char -> Bool) -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'.' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'e' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'E'))
    SourceName
d <- ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ((Char -> Bool) -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'.') ParsecT Text s Identity Char
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
uintStr) ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> SourceName -> ParsecT Text s Identity SourceName
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return SourceName
"0"
    SourceName
e <- ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ((Char -> Bool) -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\Char
c -> Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'e' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'E') ParsecT Text s Identity Char
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
intStr) ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> SourceName -> ParsecT Text s Identity SourceName
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return SourceName
"0"
    Double -> ParsecT Text s Identity Double
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Double -> ParsecT Text s Identity Double)
-> ([SourceName] -> Double)
-> [SourceName]
-> ParsecT Text s Identity Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceName -> Double
forall a. Read a => SourceName -> a
read (SourceName -> Double)
-> ([SourceName] -> SourceName) -> [SourceName] -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [SourceName] -> SourceName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
L.concat ([SourceName] -> ParsecT Text s Identity Double)
-> [SourceName] -> ParsecT Text s Identity Double
forall a b. (a -> b) -> a -> b
$ [SourceName
n, SourceName
".", SourceName
d, SourceName
"e", SourceName
e]
  where
    sign :: ParsecT Text u Identity SourceName
sign    = ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourceName -> ParsecT Text u Identity SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"-") ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'+') ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> SourceName -> ParsecT Text u Identity SourceName
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return SourceName
"") ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> SourceName -> ParsecT Text u Identity SourceName
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return SourceName
""
    uintStr :: ParsecT Text u Identity SourceName
uintStr = (:) (Char -> SourceName -> SourceName)
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity (SourceName -> SourceName)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text u Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit ParsecT Text u Identity (SourceName -> SourceName)
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity (a -> b)
-> ParsecT Text u Identity a -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT Text u Identity Char -> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT Text u Identity Char -> ParsecT Text u Identity ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'_') ParsecT Text u Identity ()
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text u Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit)
    intStr :: ParsecT Text u Identity SourceName
intStr  = do SourceName
s <- ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
sign
                 SourceName
u <- ParsecT Text u Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
uintStr
                 SourceName -> ParsecT Text u Identity SourceName
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (SourceName -> ParsecT Text u Identity SourceName)
-> ([SourceName] -> SourceName)
-> [SourceName]
-> ParsecT Text u Identity SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [SourceName] -> SourceName
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
L.concat ([SourceName] -> ParsecT Text u Identity SourceName)
-> [SourceName] -> ParsecT Text u Identity SourceName
forall a b. (a -> b) -> a -> b
$ [SourceName
s, SourceName
u]


integer :: Parser Node
integer :: Parser Node
integer = Int64 -> Node
VInteger (Int64 -> Node)
-> ParsecT Text s Identity Int64 -> ParsecT Text s Identity Node
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser Int64 -> Parser Int64
forall a. Num a => Parser a -> Parser a
signed (Parser Int64 -> Parser Int64) -> Parser Int64 -> Parser Int64
forall a b. (a -> b) -> a -> b
$ SourceName -> Int64
forall a. Read a => SourceName -> a
read (SourceName -> Int64)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity Int64
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity SourceName
forall {u}. ParsecT Text u Identity SourceName
uintStr)
  where
    uintStr :: Parser [Char]
    uintStr :: forall {u}. ParsecT Text u Identity SourceName
uintStr = (:) (Char -> SourceName -> SourceName)
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity (SourceName -> SourceName)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text s Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit ParsecT Text s Identity (SourceName -> SourceName)
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall a b.
ParsecT Text s Identity (a -> b)
-> ParsecT Text s Identity a -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT Text s Identity Char -> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT Text s Identity Char -> ParsecT Text s Identity ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'_') ParsecT Text s Identity ()
-> ParsecT Text s Identity Char -> ParsecT Text s Identity Char
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit)

--
-- * Utility functions
--

-- | Parses the elements of an array, while restricting them to a certain type.
arrayOf :: Parser Node -> Parser Node
arrayOf :: Parser Node -> Parser Node
arrayOf Parser Node
p = (VArray -> Node
VArray (VArray -> Node) -> ([Node] -> VArray) -> [Node] -> Node
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Node] -> VArray
forall a. [a] -> Vector a
V.fromList) ([Node] -> Node)
-> ParsecT Text s Identity [Node] -> ParsecT Text s Identity Node
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                ParsecT Text s Identity Char
-> ParsecT Text s Identity Char
-> ParsecT Text s Identity [Node]
-> ParsecT Text s Identity [Node]
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'[') (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
']') (Parsec Text s ()
Parser ()
skipBlanks Parsec Text s ()
-> ParsecT Text s Identity [Node] -> ParsecT Text s Identity [Node]
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity [Node]
forall {u}. ParsecT Text u Identity [Node]
separatedValues)
  where
    separatedValues :: ParsecT Text u Identity [Node]
separatedValues = ParsecT Text u Identity Node
-> ParsecT Text u Identity () -> ParsecT Text u Identity [Node]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
sepEndBy (ParsecT Text u Identity ()
Parser ()
skipBlanks ParsecT Text u Identity ()
-> ParsecT Text u Identity Node -> ParsecT Text u Identity Node
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text u Identity Node -> ParsecT Text u Identity Node
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text u Identity Node
Parser Node
p ParsecT Text u Identity Node
-> ParsecT Text u Identity () -> ParsecT Text u Identity Node
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text u Identity ()
Parser ()
skipBlanks) ParsecT Text u Identity ()
Parser ()
comma ParsecT Text u Identity [Node]
-> ParsecT Text u Identity () -> ParsecT Text u Identity [Node]
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Text u Identity ()
Parser ()
skipBlanks
    comma :: ParsecT Text s Identity ()
comma           = ParsecT Text s Identity ()
Parser ()
skipBlanks ParsecT Text s Identity ()
-> ParsecT Text s Identity Char -> ParsecT Text s Identity Char
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
',' ParsecT Text s Identity Char
-> ParsecT Text s Identity () -> ParsecT Text s Identity ()
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT Text s Identity ()
Parser ()
skipBlanks


-- | Parser for escape sequences.
escSeq :: Parser Char
escSeq :: forall {u}. ParsecT Text u Identity Char
escSeq = Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\\' ParsecT Text s Identity Char
-> ParsecT Text s Identity Char -> ParsecT Text s Identity Char
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity Char
forall {u}. ParsecT Text u Identity Char
escSeqChar
  where
    escSeqChar :: ParsecT Text u Identity Char
escSeqChar =  ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'"')  ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'"'
              ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\\') ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\\'
              ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'/')  ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'/'
              ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'b')  ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\b'
              ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
't')  ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\t'
              ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'n')  ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\n'
              ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'f')  ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\f'
              ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'r')  ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> ParsecT Text u Identity Char
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Char
'\r'
              ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'u')  ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Int -> forall {u}. ParsecT Text u Identity Char
unicodeHex Int
4
              ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'U')  ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Int -> forall {u}. ParsecT Text u Identity Char
unicodeHex Int
8
              ParsecT Text u Identity Char
-> SourceName -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> SourceName -> ParsecT s u m a
<?> SourceName
"escape character"


-- | Parser for unicode hexadecimal values of representation length 'n'.
unicodeHex :: Int -> Parser Char
unicodeHex :: Int -> forall {u}. ParsecT Text u Identity Char
unicodeHex Int
n = do
    SourceName
h <- Int -> Parsec Text s Char -> ParsecT Text s Identity SourceName
forall s (m :: * -> *) t u a.
Stream s m t =>
Int -> ParsecT s u m a -> ParsecT s u m [a]
count Int
n ((Char -> Bool) -> Parsec Text s Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy Char -> Bool
isHex)
    let v :: Int
v = (Int, SourceName) -> Int
forall a b. (a, b) -> a
fst ((Int, SourceName) -> Int)
-> (SourceName -> (Int, SourceName)) -> SourceName -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Int, SourceName)] -> (Int, SourceName)
forall a. HasCallStack => [a] -> a
head ([(Int, SourceName)] -> (Int, SourceName))
-> (SourceName -> [(Int, SourceName)])
-> SourceName
-> (Int, SourceName)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceName -> [(Int, SourceName)]
forall a. (Eq a, Num a) => ReadS a
readHex (SourceName -> Int) -> SourceName -> Int
forall a b. (a -> b) -> a -> b
$ SourceName
h
    Char -> Parsec Text s Char
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Char -> Parsec Text s Char) -> Char -> Parsec Text s Char
forall a b. (a -> b) -> a -> b
$ if Int
v Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
maxChar then Int -> Char
forall a. Enum a => Int -> a
toEnum Int
v else Char
'_'
  where
    isHex :: Char -> Bool
isHex Char
c = (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'0' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'9') Bool -> Bool -> Bool
|| (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'A' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'Z') Bool -> Bool -> Bool
|| (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'a' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'z')
    maxChar :: Int
maxChar = Char -> Int
forall a. Enum a => a -> Int
fromEnum (Char
forall a. Bounded a => a
maxBound :: Char)


-- | Parser for signs (a plus or a minus).
signed :: Num a => Parser a -> Parser a
signed :: forall a. Num a => Parser a -> Parser a
signed Parser a
p =  ParsecT Text s Identity a -> ParsecT Text s Identity a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (a -> a
forall a. Num a => a -> a
negate (a -> a) -> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'-' ParsecT Text s Identity Char
-> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity a
Parser a
p))
        ParsecT Text s Identity a
-> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> ParsecT Text s Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'+' ParsecT Text s Identity Char
-> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text s Identity a
Parser a
p)
        ParsecT Text s Identity a
-> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text s Identity a -> ParsecT Text s Identity a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text s Identity a
Parser a
p


-- | Parses the (rest of the) line including an EOF, whitespace and comments.
skipBlanks :: Parser ()
skipBlanks :: Parser ()
skipBlanks = ParsecT Text s Identity () -> ParsecT Text s Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany ParsecT Text s Identity ()
Parser ()
blank
  where
    blank :: ParsecT Text u Identity ()
blank   = ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ((ParsecT Text u Identity Char -> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT Text u Identity Char
 -> ParsecT Text u Identity SourceName)
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy Char -> Bool
isSpc) ParsecT Text u Identity SourceName
-> ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> ParsecT Text u Identity ()
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ()) ParsecT Text u Identity ()
-> ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text u Identity ()
Parser ()
comment ParsecT Text u Identity ()
-> ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text u Identity ()
Parser ()
eol
    comment :: ParsecT Text u Identity ()
comment = Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'#' ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (ParsecT Text u Identity Char -> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT Text u Identity Char
 -> ParsecT Text u Identity SourceName)
-> ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'\n')) ParsecT Text u Identity SourceName
-> ParsecT Text u Identity () -> ParsecT Text u Identity ()
forall a b.
ParsecT Text u Identity a
-> ParsecT Text u Identity b -> ParsecT Text u Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> ParsecT Text u Identity ()
forall a. a -> ParsecT Text u Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | Results in 'True' for whitespace chars, tab or space, according to spec.
isSpc :: Char -> Bool
isSpc :: Char -> Bool
isSpc Char
c = Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
' ' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'\t'


-- | Parse an EOL, as per TOML spec this is 0x0A a.k.a. '\n' or 0x0D a.k.a. '\r'.
eol :: Parser ()
eol :: Parser ()
eol = (SourceName -> ParsecT Text s Identity SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"\n" ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
-> ParsecT Text s Identity SourceName
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> SourceName -> ParsecT Text s Identity SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"\r\n") ParsecT Text s Identity SourceName
-> ParsecT Text s Identity () -> ParsecT Text s Identity ()
forall a b.
ParsecT Text s Identity a
-> ParsecT Text s Identity b -> ParsecT Text s Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> ParsecT Text s Identity ()
forall a. a -> ParsecT Text s Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ()