module Patrol.Type.Frame where

import qualified Data.Aeson as Aeson
import qualified Data.Map as Map
import qualified Data.Text as Text
import qualified GHC.Stack as Stack
import qualified Patrol.Extra.Aeson as Aeson
import qualified Patrol.Type.Platform as Platform

-- | <https://develop.sentry.dev/sdk/event-payloads/types/#frame>
data Frame = Frame
  { Frame -> Text
absPath :: Text.Text,
    Frame -> Text
addrMode :: Text.Text,
    Frame -> Maybe Int
colno :: Maybe Int,
    Frame -> Text
contextLine :: Text.Text,
    Frame -> Text
filename :: Text.Text,
    Frame -> Text
function :: Text.Text,
    Frame -> Text
imageAddr :: Text.Text,
    Frame -> Maybe Bool
inApp :: Maybe Bool,
    Frame -> Text
instructionAddr :: Text.Text,
    Frame -> Maybe Int
lineno :: Maybe Int,
    Frame -> Text
module_ :: Text.Text,
    Frame -> Text
package :: Text.Text,
    Frame -> Maybe Platform
platform :: Maybe Platform.Platform,
    Frame -> [Text]
postContext :: [Text.Text],
    Frame -> [Text]
preContext :: [Text.Text],
    Frame -> Text
rawFunction :: Text.Text,
    Frame -> Maybe Bool
stackStart :: Maybe Bool,
    Frame -> Text
symbolAddr :: Text.Text,
    Frame -> Map Text Value
vars :: Map.Map Text.Text Aeson.Value
  }
  deriving (Frame -> Frame -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Frame -> Frame -> Bool
$c/= :: Frame -> Frame -> Bool
== :: Frame -> Frame -> Bool
$c== :: Frame -> Frame -> Bool
Eq, Int -> Frame -> ShowS
[Frame] -> ShowS
Frame -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Frame] -> ShowS
$cshowList :: [Frame] -> ShowS
show :: Frame -> String
$cshow :: Frame -> String
showsPrec :: Int -> Frame -> ShowS
$cshowsPrec :: Int -> Frame -> ShowS
Show)

instance Aeson.ToJSON Frame where
  toJSON :: Frame -> Value
toJSON Frame
frame =
    [Pair] -> Value
Aeson.intoObject
      [ forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"abs_path" forall a b. (a -> b) -> a -> b
$ Frame -> Text
absPath Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"addr_mode" forall a b. (a -> b) -> a -> b
$ Frame -> Text
addrMode Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"colno" forall a b. (a -> b) -> a -> b
$ Frame -> Maybe Int
colno Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"context_line" forall a b. (a -> b) -> a -> b
$ Frame -> Text
contextLine Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"filename" forall a b. (a -> b) -> a -> b
$ Frame -> Text
filename Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"function" forall a b. (a -> b) -> a -> b
$ Frame -> Text
function Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"image_addr" forall a b. (a -> b) -> a -> b
$ Frame -> Text
imageAddr Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"in_app" forall a b. (a -> b) -> a -> b
$ Frame -> Maybe Bool
inApp Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"instruction_addr" forall a b. (a -> b) -> a -> b
$ Frame -> Text
instructionAddr Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"lineno" forall a b. (a -> b) -> a -> b
$ Frame -> Maybe Int
lineno Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"module" forall a b. (a -> b) -> a -> b
$ Frame -> Text
module_ Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"package" forall a b. (a -> b) -> a -> b
$ Frame -> Text
package Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"platform" forall a b. (a -> b) -> a -> b
$ Frame -> Maybe Platform
platform Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"post_context" forall a b. (a -> b) -> a -> b
$ Frame -> [Text]
postContext Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"pre_context" forall a b. (a -> b) -> a -> b
$ Frame -> [Text]
preContext Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"raw_function" forall a b. (a -> b) -> a -> b
$ Frame -> Text
rawFunction Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"stack_start" forall a b. (a -> b) -> a -> b
$ Frame -> Maybe Bool
stackStart Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"symbol_addr" forall a b. (a -> b) -> a -> b
$ Frame -> Text
symbolAddr Frame
frame,
        forall a. ToJSON a => String -> a -> Pair
Aeson.pair String
"vars" forall a b. (a -> b) -> a -> b
$ Frame -> Map Text Value
vars Frame
frame
      ]

empty :: Frame
empty :: Frame
empty =
  Frame
    { absPath :: Text
absPath = Text
Text.empty,
      addrMode :: Text
addrMode = Text
Text.empty,
      colno :: Maybe Int
colno = forall a. Maybe a
Nothing,
      contextLine :: Text
contextLine = Text
Text.empty,
      filename :: Text
filename = Text
Text.empty,
      function :: Text
function = Text
Text.empty,
      imageAddr :: Text
imageAddr = Text
Text.empty,
      inApp :: Maybe Bool
inApp = forall a. Maybe a
Nothing,
      instructionAddr :: Text
instructionAddr = Text
Text.empty,
      lineno :: Maybe Int
lineno = forall a. Maybe a
Nothing,
      module_ :: Text
module_ = Text
Text.empty,
      package :: Text
package = Text
Text.empty,
      platform :: Maybe Platform
platform = forall a. Maybe a
Nothing,
      postContext :: [Text]
postContext = [],
      preContext :: [Text]
preContext = [],
      rawFunction :: Text
rawFunction = Text
Text.empty,
      stackStart :: Maybe Bool
stackStart = forall a. Maybe a
Nothing,
      symbolAddr :: Text
symbolAddr = Text
Text.empty,
      vars :: Map Text Value
vars = forall k a. Map k a
Map.empty
    }

fromSrcLoc :: Stack.SrcLoc -> Frame
fromSrcLoc :: SrcLoc -> Frame
fromSrcLoc SrcLoc
srcLoc =
  Frame
empty
    { colno :: Maybe Int
colno = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ SrcLoc -> Int
Stack.srcLocStartCol SrcLoc
srcLoc,
      filename :: Text
filename = String -> Text
Text.pack forall a b. (a -> b) -> a -> b
$ SrcLoc -> String
Stack.srcLocFile SrcLoc
srcLoc,
      lineno :: Maybe Int
lineno = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ SrcLoc -> Int
Stack.srcLocStartLine SrcLoc
srcLoc,
      module_ :: Text
module_ = String -> Text
Text.pack forall a b. (a -> b) -> a -> b
$ SrcLoc -> String
Stack.srcLocModule SrcLoc
srcLoc,
      package :: Text
package = String -> Text
Text.pack forall a b. (a -> b) -> a -> b
$ SrcLoc -> String
Stack.srcLocPackage SrcLoc
srcLoc
    }