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
(Frame -> Frame -> Bool) -> (Frame -> Frame -> Bool) -> Eq Frame
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Frame -> Frame -> Bool
== :: Frame -> Frame -> Bool
$c/= :: Frame -> Frame -> Bool
/= :: Frame -> Frame -> Bool
Eq, Int -> Frame -> ShowS
[Frame] -> ShowS
Frame -> String
(Int -> Frame -> ShowS)
-> (Frame -> String) -> ([Frame] -> ShowS) -> Show Frame
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Frame -> ShowS
showsPrec :: Int -> Frame -> ShowS
$cshow :: Frame -> String
show :: Frame -> String
$cshowList :: [Frame] -> ShowS
showList :: [Frame] -> ShowS
Show)

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

fromSrcLoc :: Stack.SrcLoc -> Frame
fromSrcLoc :: SrcLoc -> Frame
fromSrcLoc SrcLoc
srcLoc =
  Frame
empty
    { colno = Just $ Stack.srcLocStartCol srcLoc,
      filename = Text.pack $ Stack.srcLocFile srcLoc,
      lineno = Just $ Stack.srcLocStartLine srcLoc,
      module_ = Text.pack $ Stack.srcLocModule srcLoc,
      package = Text.pack $ Stack.srcLocPackage srcLoc
    }