{-| Parse puppet source code from text. -}
module Puppet.Parser (
  -- * Runner
    runPuppetParser
  -- * Parsers
  , puppetParser
  , prettyParseError
  -- * Pretty Print
  , module Puppet.Parser.PrettyPrinter
  , module Puppet.Parser.Types
  , module Puppet.Parser.Lens
) where

import           XPrelude

import           Text.Megaparsec

import           Puppet.Parser.PrettyPrinter
import           Puppet.Parser.Lens
import           Puppet.Parser.Internal
import           Puppet.Parser.Types


-- | Build a 'PrettyError' from a 'ParseError' given the text source.
-- The source is used to display the line on which the error occurs.
prettyParseError :: ParseErrorBundle Text Void -> PrettyError
prettyParseError err = PrettyError $ "cannot parse" <+> pretty (errorBundlePretty err)

-- | Run a puppet parser against some 'Text' input.
runPuppetParser :: String -> Text -> Either (ParseErrorBundle Text Void) (Vector Statement)
runPuppetParser = parse puppetParser

-- | Parse a collection of puppet 'Statement'.
puppetParser :: Parser (Vector Statement)
puppetParser = optional sc >> statementList