packages feed

patrol-0.0.1: src/lib/Patrol/Type/StackTrace.hs

module Patrol.Type.StackTrace
  ( StackTrace(..)
  , fromCallStack
  ) where

import qualified Data.Aeson as Aeson
import qualified Data.List.NonEmpty as NonEmpty
import qualified GHC.Stack as Stack
import qualified Patrol.Type.Frame as Frame
import qualified Patrol.Utility.Json as Json

-- | <https://develop.sentry.dev/sdk/event-payloads/stacktrace/>
newtype StackTrace = StackTrace
  { frames :: NonEmpty.NonEmpty Frame.Frame
  } deriving (Eq, Show)

instance Aeson.ToJSON StackTrace where
  toJSON stackTrace = Aeson.object
    [ Json.pair "frames" $ frames stackTrace
    ]

fromCallStack :: Stack.CallStack -> Maybe StackTrace
fromCallStack callStack = do
  frames <- NonEmpty.nonEmpty . fmap (uncurry Frame.fromSrcLoc) $ Stack.getCallStack callStack
  pure StackTrace { frames }