packages feed

bugsnag-1.2.0.3: src/Network/Bugsnag/Exception/Context.hs

{-# LANGUAGE CPP #-}

module Network.Bugsnag.Exception.Context
  ( backtraceStackFrames
  ) where

import Prelude

import Data.Bugsnag hiding (Exception)

#if MIN_VERSION_base(4,20,0)
import Control.Exception (SomeException, someExceptionContext)
import Control.Exception.Backtrace (Backtraces, displayBacktraces)
import Control.Exception.Context (getExceptionAnnotations)
import Control.Monad (guard)
import Data.Foldable (toList)
import Data.List.NonEmpty (nonEmpty)
import qualified Data.List.NonEmpty as NE
import Network.Bugsnag.Exception.Parse (backtraceParser)
import Text.Parsec (parse)
#else
import Control.Exception (SomeException)
#endif

-- | Stack frames from an exception's attached 'Backtraces', if any
backtraceStackFrames :: SomeException -> Maybe [StackFrame]

#if MIN_VERSION_base(4,20,0)
backtraceStackFrames ex = fmap NE.last $ nonEmpty $ do
  backtrace <- getExceptionAnnotations @Backtraces (someExceptionContext ex)
  toList @Maybe $ do
    let
      frames =
        either (const []) id $
          parse backtraceParser "" $
            displayBacktraces backtrace
    guard $ not $ null frames
    pure frames
#else
backtraceStackFrames = const Nothing
#endif