module Text.Trifecta.Diagnostic.Combinators
( panic, panicAt
, fatal, fatalAt
, err, errAt
, warn, warnAt
, note, noteAt
, verbose, verboseAt
) where
import Control.Applicative
import Control.Monad.Instances ()
import Text.Trifecta.Parser.Class
import Text.Trifecta.Diagnostic.Class
import Text.Trifecta.Diagnostic.Prim
import Text.Trifecta.Diagnostic.Level
import Text.Trifecta.Diagnostic.Rendering.Prim
import Text.Trifecta.Diagnostic.Rendering.Caret
import Text.Trifecta.Rope.Delta
rendCaret :: MonadParser m => m Rendering
rendCaret = (delta >>= addCaret) <$> rend
panicAt, fatalAt, errAt :: MonadDiagnostic e m => [Diagnostic e] -> e -> Rendering -> m a
panicAt es e r = throwDiagnostic $ Diagnostic (Right r) Panic e es
fatalAt es e r = throwDiagnostic $ Diagnostic (Right r) Fatal e es
errAt es e r = throwDiagnostic $ Diagnostic (Right r) Error e es
panic, fatal, err :: (MonadParser m, MonadDiagnostic e m) => [Diagnostic e] -> e -> m a
panic es e = rendCaret >>= panicAt es e
fatal es e = rendCaret >>= fatalAt es e
err es e = rendCaret >>= errAt es e
warnAt, noteAt :: MonadDiagnostic e m => [Diagnostic e] -> e -> Rendering -> m ()
warnAt es e r = logDiagnostic $ Diagnostic (Right r) Warning e es
noteAt es e r = logDiagnostic $ Diagnostic (Right r) Note e es
verboseAt :: MonadDiagnostic e m => Int -> [Diagnostic e] -> e -> Rendering -> m ()
verboseAt l es e r = logDiagnostic $ Diagnostic (Right r) (Verbose l) e es
warn, note :: (MonadParser m, MonadDiagnostic e m) => [Diagnostic e] -> e -> m ()
warn es e = rendCaret >>= warnAt es e
note es e = rendCaret >>= noteAt es e
verbose :: (MonadParser m, MonadDiagnostic e m) => Int -> [Diagnostic e] -> e -> m ()
verbose l es e = rendCaret >>= verboseAt l es e