packages feed

gigaparsec-0.2.3.0: src/Text/Gigaparsec/Errors/Patterns.hs

{-# LANGUAGE Safe #-}
{-# OPTIONS_GHC -Wno-incomplete-record-updates #-}
module Text.Gigaparsec.Errors.Patterns (
    verifiedWith,
    verifiedFail, verifiedUnexpected, verifiedExplain,
    preventWith,
    preventativeFail, preventativeExplain
  ) where

import Text.Gigaparsec (Parsec, atomic, (<+>), unit)
import Text.Gigaparsec.Position (withWidth)
import Text.Gigaparsec.Errors.Combinator (amend, hide)
import Text.Gigaparsec.Errors.ErrorGen (ErrorGen)
import Text.Gigaparsec.Errors.ErrorGen qualified as ErrorGen (
    asFail, asSelect, UnexpectedItem(RawItem),
    vanillaGen, specializedGen, unexpected, reason, messages
  )

{-
@since 0.2.3.0
-}
verifiedWith :: ErrorGen a -> Parsec a -> Parsec b
verifiedWith err p = amend (ErrorGen.asFail err (hide (withWidth (atomic p))))

verifiedWithVanilla :: (a -> ErrorGen.UnexpectedItem) -> (a -> Maybe String) -> Parsec a -> Parsec b
verifiedWithVanilla unexGen reasonGen = verifiedWith $
  ErrorGen.vanillaGen {
    ErrorGen.unexpected = unexGen,
    ErrorGen.reason = reasonGen
  }

verifiedWithVanillaRaw :: (a -> Maybe String) -> Parsec a -> Parsec b
verifiedWithVanillaRaw = verifiedWithVanilla (const ErrorGen.RawItem)

{-
@since 0.2.3.0
-}
verifiedFail :: (a -> [String]) -> Parsec a -> Parsec b
verifiedFail msggen = verifiedWith $
  ErrorGen.specializedGen {
    ErrorGen.messages = msggen
  }

{-
@since 0.2.3.0
-}
verifiedUnexpected :: Parsec a -> Parsec b
verifiedUnexpected = verifiedWithVanillaRaw (const Nothing)

{-
@since 0.2.3.0
-}
verifiedExplain :: (a -> String) -> Parsec a -> Parsec b
verifiedExplain reasongen = verifiedWithVanillaRaw (Just . reasongen)

{-
@since 0.2.3.0
-}
preventWith :: ErrorGen a -> Parsec a -> Parsec ()
preventWith err p = amend (ErrorGen.asSelect err (withWidth (hide (atomic p)) <+> unit))

preventWithVanilla :: (a -> ErrorGen.UnexpectedItem) -> (a -> Maybe String) -> Parsec a -> Parsec ()
preventWithVanilla unexGen reasonGen = preventWith $
  ErrorGen.vanillaGen {
    ErrorGen.unexpected = unexGen,
    ErrorGen.reason = reasonGen
  }

preventWithVanillaRaw :: (a -> Maybe String) -> Parsec a -> Parsec ()
preventWithVanillaRaw = preventWithVanilla (const ErrorGen.RawItem)

{-
@since 0.2.3.0
-}
preventativeFail :: (a -> [String]) -> Parsec a -> Parsec ()
preventativeFail msggen = preventWith $
  ErrorGen.specializedGen {
    ErrorGen.messages = msggen
  }

{-
@since 0.2.3.0
-}
preventativeExplain :: (a -> String) -> Parsec a -> Parsec ()
preventativeExplain reasongen = preventWithVanillaRaw (Just . reasongen)