tomland-1.2.0.0: src/Toml/Parser/Key.hs
{- | Parsers for keys and table names.
@since 1.2.0.0
-}
module Toml.Parser.Key
( keyP
, tableNameP
, tableArrayNameP
) where
import Control.Applicative (Alternative (..))
import Control.Applicative.Combinators.NonEmpty (sepBy1)
import Control.Monad.Combinators (between)
import Data.Semigroup ((<>))
import Data.Text (Text)
import Toml.Parser.Core (Parser, alphaNumChar, char, lexeme, text)
import Toml.Parser.String (basicStringP, literalStringP)
import Toml.PrefixTree (Key (..), Piece (..))
import qualified Data.Text as Text
-- | Parser for bare key piece, like @foo@.
bareKeyPieceP :: Parser Text
bareKeyPieceP = lexeme $ Text.pack <$> bareStrP
where
bareStrP :: Parser String
bareStrP = some $ alphaNumChar <|> char '_' <|> char '-'
-- | Parser for 'Piece'.
keyComponentP :: Parser Piece
keyComponentP = Piece <$>
(bareKeyPieceP <|> (quote "\"" <$> basicStringP) <|> (quote "'" <$> literalStringP))
where
-- adds " or ' to both sides
quote :: Text -> Text -> Text
quote q t = q <> t <> q
-- | Parser for 'Key': dot-separated list of 'Piece'.
keyP :: Parser Key
keyP = Key <$> keyComponentP `sepBy1` char '.'
-- | Parser for table name: 'Key' inside @[]@.
tableNameP :: Parser Key
tableNameP = between (text "[") (text "]") keyP
-- | Parser for array of tables name: 'Key' inside @[[]]@.
tableArrayNameP :: Parser Key
tableArrayNameP = between (text "[[") (text "]]") keyP