packages feed

keiro-dsl-0.8.0.0: src/Keiro/Dsl/Parser.hs

-- | Stable compatibility facade for the Keiro DSL language frontend.
module Keiro.Dsl.Parser
  ( ParseError,
    ParseFailure (..),
    ParsedSource (..),
    parseSource,
    parseSpec,
    parseSpecText,
    renderParseFailure,
  )
where

import Data.Bifunctor (first)
import Data.Text (Text)
import Keiro.Dsl.Frontend (lowerSurfaceSource, parseSurfaceSource)
import Keiro.Dsl.Frontend.Internal
  ( frontendCompatibilityFailure,
    frontendFailureFromLowering,
  )
import Keiro.Dsl.Grammar (Spec)
import Keiro.Dsl.LanguageVersion

-- | A rendered, line-numbered parse error, ready to print to the user.
type ParseError = Text

-- | Parse a @.keiro@ source. The 'FilePath' is used only as the source name in
-- diagnostics; it need not exist on disk.
parseSpec :: FilePath -> Text -> Either ParseError Spec
parseSpec sourceName input = parsedSpec <$> first renderParseFailure (parseSource sourceName input)

-- | Convenience wrapper for callers without a source name (tests, stdin).
parseSpecText :: Text -> Either ParseError Spec
parseSpecText = parseSpec "<input>"

-- | Parse a source without discarding its selected language contract.
parseSource :: FilePath -> Text -> Either ParseFailure ParsedSource
parseSource sourceName input = do
  surface <- first frontendCompatibilityFailure (parseSurfaceSource sourceName input)
  first (frontendCompatibilityFailure . frontendFailureFromLowering) (lowerSurfaceSource surface)