{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Network.Bugsnag
(
sendEvents,
queueSingleEvent,
Batcher,
newBatcher,
flushBatcher,
ApiKey,
apiKey,
Report,
defaultReport,
report_apiKey,
report_payloadVersion,
report_notifier,
report_events,
Event,
defaultEvent,
event_exceptions,
event_breadcrumbs,
event_request,
event_threads,
event_context,
event_groupingHash,
event_unhandled,
event_severity,
event_severityReason,
event_user,
event_app,
event_device,
event_session,
event_metaData,
Exception,
defaultException,
exception_errorClass,
exception_message,
exception_stacktrace,
exception_type,
StackFrame,
defaultStackFrame,
stackFrame_file,
stackFrame_lineNumber,
stackFrame_columnNumber,
stackFrame_method,
stackFrame_inProject,
stackFrame_code,
Breadcrumb,
defaultBreadcrumb,
breadcrumb_timestamp,
breadcrumb_name,
breadcrumb_type,
breadcrumb_metaData,
Request,
defaultRequest,
request_clientIp,
request_headers,
request_httpMethod,
request_url,
request_referer,
Thread,
defaultThread,
thread_id,
thread_name,
thread_errorReportingThread,
thread_stacktrace,
thread_type,
SeverityReason,
defaultSeverityReason,
severityReason_type,
severityReason_attributes,
SeverityReasonAttributes,
defaultSeverityReasonAttributes,
severityReasonAttributes_errorType,
severityReasonAttributes_level,
severityReasonAttributes_signalType,
severityReasonAttributes_violationType,
severityReasonAttributes_errorClass,
User,
defaultUser,
user_id,
user_name,
user_email,
App,
defaultApp,
app_id,
app_version,
app_versionCode,
app_bundleVersion,
app_codeBundleId,
app_buildUUID,
app_releaseStage,
app_type,
app_dsymUUIDs,
app_duration,
app_durationInForeground,
app_inForeground,
app_binaryArch,
Device,
defaultDevice,
device_hostname,
device_id,
device_manufacturer,
device_model,
device_modelNumber,
device_osName,
device_osVersion,
device_freeMemory,
device_totalMemory,
device_freeDisk,
device_browserName,
device_browserVersion,
device_jailBroken,
device_orientation,
device_time,
device_cpuAbi,
device_runtimeVersions,
RuntimeVersions,
defaultRuntimeVersions,
runtimeVersions_androidApi,
runtimeVersions_bottle,
runtimeVersions_celery,
runtimeVersions_clangVersion,
runtimeVersions_cocos2dx,
runtimeVersions_delayedJob,
runtimeVersions_django,
runtimeVersions_dotnet,
runtimeVersions_dotnetApiCompatibility,
runtimeVersions_dotnetClr,
runtimeVersions_dotnetScriptingRuntime,
runtimeVersions_eventMachine,
runtimeVersions_expoApp,
runtimeVersions_expoSdk,
runtimeVersions_flask,
runtimeVersions_gin,
runtimeVersions_go,
runtimeVersions_javaType,
runtimeVersions_javaVersion,
runtimeVersions_jruby,
runtimeVersions_laravel,
runtimeVersions_lumen,
runtimeVersions_magento,
runtimeVersions_mailman,
runtimeVersions_martini,
runtimeVersions_negroni,
runtimeVersions_node,
runtimeVersions_osBuild,
runtimeVersions_php,
runtimeVersions_python,
runtimeVersions_que,
runtimeVersions_rack,
runtimeVersions_rails,
runtimeVersions_rake,
runtimeVersions_reactNative,
runtimeVersions_reactNativeJsEngine,
runtimeVersions_resque,
runtimeVersions_revel,
runtimeVersions_ruby,
runtimeVersions_shoryoken,
runtimeVersions_sidekiq,
runtimeVersions_silex,
runtimeVersions_sinatra,
runtimeVersions_springBoot,
runtimeVersions_springFramework,
runtimeVersions_swift,
runtimeVersions_symfony,
runtimeVersions_tornado,
runtimeVersions_unity,
runtimeVersions_unityScriptingBackend,
runtimeVersions_wordpress,
Session,
defaultSession,
session_id,
session_startedAt,
session_events,
SessionEvents,
defaultSessionEvents,
sessionEvents_handled,
sessionEvents_unhandled,
PayloadVersion,
payloadVersion5,
Notifier,
thisNotifier,
ExceptionType,
cocoaExceptionType,
androidExceptionType,
browserjsExceptionType,
expojsExceptionType,
nodejsExceptionType,
BreadcrumbType,
navigationBreadcrumbType,
requestBreadcrumbType,
processBreadcrumbType,
logBreadcrumbType,
userBreadcrumbType,
stateBreadcrumbType,
errorBreadcrumbType,
manualBreadcrumbType,
ThreadType,
cocoaThreadType,
androidThreadType,
browserjsThreadType,
Severity,
errorSeverity,
warningSeverity,
infoSeverity,
SeverityReasonType,
unhandledExceptionSeverityReasonType,
unhandledErrorSeverityReasonType,
logSeverityReasonType,
signalSeverityReasonType,
strictModeSeverityReasonType,
unhandledPromiseRejectionSeverityReasonType,
callbackErrorInterceptSeverityReasonType,
errorClassSeverityReasonType,
unhandledPanicSeverityReasonType,
userCallbackSetSeveritySeverityReasonType,
userSpecifiedSeveritySeverityReasonType,
handledExceptionSeverityReasonType,
handledErrorSeverityReasonType,
handledPanicSeverityReasonType,
userContextSetSeveritySeverityReasonType,
anrErrorSeverityReasonType,
outOfMemorySeverityReasonType,
BinaryArch,
x86BinaryArch,
x86_64BinaryArch,
arm32BinaryArch,
arm64BinaryArch,
CpuAbi,
x86_64CpuAbi,
)
where
import Control.Exception (try)
import Control.Monad (void)
import qualified Data.Aeson
import qualified Data.Buffer as Buffer
import qualified Data.ByteString.Char8
import Data.Foldable (toList)
import Data.HashMap.Strict (HashMap)
import Data.Text (Text)
import qualified Data.Text.Encoding
import qualified Data.Time.Clock
import qualified Data.Time.Format
import GHC.Generics (Generic)
import qualified Network.HTTP.Client as HTTP
sendEvents :: HTTP.Manager -> ApiKey -> [Event] -> IO (Either HTTP.HttpException ())
sendEvents manager apiKey events = do
send manager apiKey Report
{ report_apiKey = Nothing,
report_payloadVersion = payloadVersion5,
report_notifier = thisNotifier,
report_events = events
}
newtype Batcher = Batcher (Buffer.Buffer Event)
newBatcher :: HTTP.Manager -> ApiKey -> (HTTP.HttpException -> IO ()) -> IO Batcher
newBatcher manager apiKey onError = do
buffer <-
Buffer.new
Buffer.defaultSettings
{ Buffer.write = \batch -> either onError pure =<< sendEvents manager apiKey (toList batch),
Buffer.size = 100,
Buffer.frequencyInMicroSeconds = 5000000
}
pure (Batcher buffer)
queueSingleEvent :: Batcher -> Event -> IO ()
queueSingleEvent (Batcher buffer) = Buffer.push buffer
flushBatcher :: Batcher -> IO ()
flushBatcher (Batcher buffer) = Buffer.flush buffer
send :: HTTP.Manager -> ApiKey -> Report -> IO (Either HTTP.HttpException ())
send manager (ApiKey apiKey) report = do
now <- Data.Time.Clock.getCurrentTime
initReq <- HTTP.parseUrlThrow "https://notify.bugsnag.com"
let req =
initReq
{ HTTP.method = "POST",
HTTP.requestHeaders =
[ ("Bugsnag-Api-Key", Data.Text.Encoding.encodeUtf8 apiKey),
("Content-Type", "application/json"),
("Bugsnag-Payload-Version", "5"),
("Bugsnag-Sent-At", Data.ByteString.Char8.pack (formatISO8601 now))
],
HTTP.requestBody = HTTP.RequestBodyLBS (Data.Aeson.encode report)
}
try . void $ HTTP.httpNoBody req manager
formatISO8601 :: Data.Time.Clock.UTCTime -> String
formatISO8601 = Data.Time.Format.formatTime Data.Time.Format.defaultTimeLocale "%FT%T%QZ"
data Report
= Report
{
report_apiKey :: Maybe ApiKey,
report_payloadVersion :: PayloadVersion,
report_notifier :: Notifier,
report_events :: [Event]
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON Report where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON Report where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultReport :: Report
defaultReport =
Report
{ report_apiKey = Nothing,
report_payloadVersion = payloadVersion5,
report_notifier = thisNotifier,
report_events = []
}
newtype ApiKey = ApiKey Text
deriving (Generic, Show)
instance Data.Aeson.ToJSON ApiKey where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON ApiKey where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
apiKey :: Text -> ApiKey
apiKey = ApiKey
newtype PayloadVersion = PayloadVersion Text
deriving (Generic, Show)
instance Data.Aeson.ToJSON PayloadVersion where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON PayloadVersion where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
payloadVersion5 :: PayloadVersion
payloadVersion5 = PayloadVersion "5"
data Notifier
= Notifier
{
notifier_name :: Text,
notifier_version :: Text,
notifier_url :: Text
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON Notifier where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON Notifier where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
thisNotifier :: Notifier
thisNotifier =
Notifier
{ notifier_name = "bugsnag-hs",
notifier_version = "0.1.0.0",
notifier_url = "https://github.com/jwoudenberg/bugsnag-hs#readme"
}
data Event
= Event
{
event_exceptions :: [Exception],
event_breadcrumbs :: Maybe [Breadcrumb],
event_request :: Maybe Request,
event_threads :: Maybe [Thread],
event_context :: Maybe Text,
event_groupingHash :: Maybe Text,
event_unhandled :: Maybe Bool,
event_severity :: Maybe Severity,
event_severityReason :: Maybe SeverityReason,
event_user :: Maybe User,
event_app :: Maybe App,
event_device :: Maybe Device,
event_session :: Maybe Session,
event_metaData :: Maybe Data.Aeson.Object
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON Event where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON Event where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultEvent :: Event
defaultEvent =
Event
{ event_exceptions = [],
event_breadcrumbs = Nothing,
event_request = Nothing,
event_threads = Nothing,
event_context = Nothing,
event_groupingHash = Nothing,
event_unhandled = Nothing,
event_severity = Nothing,
event_severityReason = Nothing,
event_user = Nothing,
event_app = Nothing,
event_device = Nothing,
event_session = Nothing,
event_metaData = Nothing
}
data Exception
= Exception
{
exception_errorClass :: Text,
exception_message :: Maybe Text,
exception_stacktrace :: [StackFrame],
exception_type :: Maybe ExceptionType
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON Exception where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON Exception where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultException :: Exception
defaultException =
Exception
{ exception_errorClass = "",
exception_message = Nothing,
exception_stacktrace = [],
exception_type = Nothing
}
data StackFrame
= StackFrame
{
stackFrame_file :: Text,
stackFrame_lineNumber :: Int,
stackFrame_columnNumber :: Maybe Int,
stackFrame_method :: Text,
stackFrame_inProject :: Maybe Bool,
stackFrame_code :: Maybe (HashMap Int Text)
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON StackFrame where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON StackFrame where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultStackFrame :: StackFrame
defaultStackFrame =
StackFrame
{ stackFrame_file = "",
stackFrame_lineNumber = 0,
stackFrame_columnNumber = Nothing,
stackFrame_method = "",
stackFrame_inProject = Nothing,
stackFrame_code = Nothing
}
newtype ExceptionType = ExceptionType Text
deriving (Generic, Show)
instance Data.Aeson.ToJSON ExceptionType where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON ExceptionType where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
cocoaExceptionType :: ExceptionType
cocoaExceptionType = ExceptionType "cocoa"
androidExceptionType :: ExceptionType
androidExceptionType = ExceptionType "android"
browserjsExceptionType :: ExceptionType
browserjsExceptionType = ExceptionType "browserjs"
expojsExceptionType :: ExceptionType
expojsExceptionType = ExceptionType "expojs"
nodejsExceptionType :: ExceptionType
nodejsExceptionType = ExceptionType "nodejs"
data Breadcrumb
= Breadcrumb
{
breadcrumb_timestamp :: Text,
breadcrumb_name :: Text,
breadcrumb_type :: BreadcrumbType,
breadcrumb_metaData :: Maybe (HashMap Text Text)
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON Breadcrumb where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON Breadcrumb where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultBreadcrumb :: Breadcrumb
defaultBreadcrumb =
Breadcrumb
{ breadcrumb_timestamp = "",
breadcrumb_name = "",
breadcrumb_type = navigationBreadcrumbType,
breadcrumb_metaData = Nothing
}
newtype BreadcrumbType = BreadcrumbType Text
deriving (Generic, Show)
instance Data.Aeson.ToJSON BreadcrumbType where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON BreadcrumbType where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
navigationBreadcrumbType :: BreadcrumbType
navigationBreadcrumbType = BreadcrumbType "navigation"
requestBreadcrumbType :: BreadcrumbType
requestBreadcrumbType = BreadcrumbType "request"
processBreadcrumbType :: BreadcrumbType
processBreadcrumbType = BreadcrumbType "process"
logBreadcrumbType :: BreadcrumbType
logBreadcrumbType = BreadcrumbType "log"
userBreadcrumbType :: BreadcrumbType
userBreadcrumbType = BreadcrumbType "user"
stateBreadcrumbType :: BreadcrumbType
stateBreadcrumbType = BreadcrumbType "state"
errorBreadcrumbType :: BreadcrumbType
errorBreadcrumbType = BreadcrumbType "error"
manualBreadcrumbType :: BreadcrumbType
manualBreadcrumbType = BreadcrumbType "manual"
data Request
= Request
{
request_clientIp :: Maybe Text,
request_headers :: Maybe (HashMap Text Text),
request_httpMethod :: Maybe Text,
request_url :: Maybe Text,
request_referer :: Maybe Text
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON Request where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON Request where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultRequest :: Request
defaultRequest =
Request
{ request_clientIp = Nothing,
request_headers = Nothing,
request_httpMethod = Nothing,
request_url = Nothing,
request_referer = Nothing
}
data Thread
= Thread
{
thread_id :: Maybe Text,
thread_name :: Maybe Text,
thread_errorReportingThread :: Maybe Bool,
thread_stacktrace :: Maybe [StackFrame],
thread_type :: Maybe ThreadType
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON Thread where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON Thread where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultThread :: Thread
defaultThread = Thread
{ thread_id = Nothing,
thread_name = Nothing,
thread_errorReportingThread = Nothing,
thread_stacktrace = Nothing,
thread_type = Nothing
}
newtype ThreadType = ThreadType Text
deriving (Generic, Show)
instance Data.Aeson.ToJSON ThreadType where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON ThreadType where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
cocoaThreadType :: ThreadType
cocoaThreadType = ThreadType "cocoa"
androidThreadType :: ThreadType
androidThreadType = ThreadType "android"
browserjsThreadType :: ThreadType
browserjsThreadType = ThreadType "browserjs"
newtype Severity = Severity Text
deriving (Generic, Show)
instance Data.Aeson.ToJSON Severity where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON Severity where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
errorSeverity :: Severity
errorSeverity = Severity "error"
warningSeverity :: Severity
warningSeverity = Severity "warning"
infoSeverity :: Severity
infoSeverity = Severity "info"
data SeverityReason
= SeverityReason
{
severityReason_type :: SeverityReasonType,
severityReason_attributes :: SeverityReasonAttributes
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON SeverityReason where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON SeverityReason where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultSeverityReason :: SeverityReason
defaultSeverityReason =
SeverityReason
{ severityReason_type = unhandledExceptionSeverityReasonType,
severityReason_attributes = defaultSeverityReasonAttributes
}
newtype SeverityReasonType = SeverityReasonType Text
deriving (Generic, Show)
instance Data.Aeson.ToJSON SeverityReasonType where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON SeverityReasonType where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
unhandledExceptionSeverityReasonType :: SeverityReasonType
unhandledExceptionSeverityReasonType = SeverityReasonType "unhandledException"
unhandledErrorSeverityReasonType :: SeverityReasonType
unhandledErrorSeverityReasonType = SeverityReasonType "unhandledError"
logSeverityReasonType :: SeverityReasonType
logSeverityReasonType = SeverityReasonType "log"
signalSeverityReasonType :: SeverityReasonType
signalSeverityReasonType = SeverityReasonType "signal"
strictModeSeverityReasonType :: SeverityReasonType
strictModeSeverityReasonType = SeverityReasonType "strictMode"
unhandledPromiseRejectionSeverityReasonType :: SeverityReasonType
unhandledPromiseRejectionSeverityReasonType = SeverityReasonType "unhandledPromiseRejection"
callbackErrorInterceptSeverityReasonType :: SeverityReasonType
callbackErrorInterceptSeverityReasonType = SeverityReasonType "callbackErrorIntercept"
errorClassSeverityReasonType :: SeverityReasonType
errorClassSeverityReasonType = SeverityReasonType "errorClass"
unhandledPanicSeverityReasonType :: SeverityReasonType
unhandledPanicSeverityReasonType = SeverityReasonType "unhandledPanic"
userCallbackSetSeveritySeverityReasonType :: SeverityReasonType
userCallbackSetSeveritySeverityReasonType = SeverityReasonType "userCallbackSetSeverity"
userSpecifiedSeveritySeverityReasonType :: SeverityReasonType
userSpecifiedSeveritySeverityReasonType = SeverityReasonType "userSpecifiedSeverity"
handledExceptionSeverityReasonType :: SeverityReasonType
handledExceptionSeverityReasonType = SeverityReasonType "handledException"
handledErrorSeverityReasonType :: SeverityReasonType
handledErrorSeverityReasonType = SeverityReasonType "handledError"
handledPanicSeverityReasonType :: SeverityReasonType
handledPanicSeverityReasonType = SeverityReasonType "handledPanic"
userContextSetSeveritySeverityReasonType :: SeverityReasonType
userContextSetSeveritySeverityReasonType = SeverityReasonType "userContextSetSeverity"
anrErrorSeverityReasonType :: SeverityReasonType
anrErrorSeverityReasonType = SeverityReasonType "anrError"
outOfMemorySeverityReasonType :: SeverityReasonType
outOfMemorySeverityReasonType = SeverityReasonType "outOfMemory"
data SeverityReasonAttributes
= SeverityReasonAttributes
{
severityReasonAttributes_errorType :: Maybe Text,
severityReasonAttributes_level :: Maybe Text,
severityReasonAttributes_signalType :: Maybe Text,
severityReasonAttributes_violationType :: Maybe Text,
severityReasonAttributes_errorClass :: Maybe Text
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON SeverityReasonAttributes where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON SeverityReasonAttributes where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultSeverityReasonAttributes :: SeverityReasonAttributes
defaultSeverityReasonAttributes =
SeverityReasonAttributes
{ severityReasonAttributes_errorType = Nothing,
severityReasonAttributes_level = Nothing,
severityReasonAttributes_signalType = Nothing,
severityReasonAttributes_violationType = Nothing,
severityReasonAttributes_errorClass = Nothing
}
data User
= User
{
user_id :: Maybe Text,
user_name :: Maybe Text,
user_email :: Maybe Text
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON User where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON User where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultUser :: User
defaultUser =
User
{ user_id = Nothing,
user_name = Nothing,
user_email = Nothing
}
data App
= App
{
app_id :: Maybe Text,
app_version :: Maybe Text,
app_versionCode :: Maybe Int,
app_bundleVersion :: Maybe Text,
app_codeBundleId :: Maybe Text,
app_buildUUID :: Maybe Text,
app_releaseStage :: Maybe Text,
app_type :: Maybe Text,
app_dsymUUIDs :: Maybe [Text],
app_duration :: Maybe Int,
app_durationInForeground :: Maybe Int,
app_inForeground :: Maybe Bool,
app_binaryArch :: Maybe BinaryArch
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON App where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON App where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultApp :: App
defaultApp =
App
{ app_id = Nothing,
app_version = Nothing,
app_versionCode = Nothing,
app_bundleVersion = Nothing,
app_codeBundleId = Nothing,
app_buildUUID = Nothing,
app_releaseStage = Nothing,
app_type = Nothing,
app_dsymUUIDs = Nothing,
app_duration = Nothing,
app_durationInForeground = Nothing,
app_inForeground = Nothing,
app_binaryArch = Nothing
}
newtype BinaryArch = BinaryArch Text
deriving (Generic, Show)
instance Data.Aeson.ToJSON BinaryArch where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON BinaryArch where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
x86BinaryArch :: BinaryArch
x86BinaryArch = BinaryArch "x86"
x86_64BinaryArch :: BinaryArch
x86_64BinaryArch = BinaryArch "x86_64"
arm32BinaryArch :: BinaryArch
arm32BinaryArch = BinaryArch "arm32"
arm64BinaryArch :: BinaryArch
arm64BinaryArch = BinaryArch "arm64"
data Device
= Device
{
device_hostname :: Maybe Text,
device_id :: Maybe Text,
device_manufacturer :: Maybe Text,
device_model :: Maybe Text,
device_modelNumber :: Maybe Text,
device_osName :: Maybe Text,
device_osVersion :: Maybe Text,
device_freeMemory :: Maybe Int,
device_totalMemory :: Maybe Int,
device_freeDisk :: Maybe Int,
device_browserName :: Maybe Text,
device_browserVersion :: Maybe Text,
device_jailBroken :: Maybe Bool,
device_orientation :: Maybe Text,
device_time :: Maybe Text,
device_cpuAbi :: Maybe [CpuAbi],
device_runtimeVersions :: Maybe RuntimeVersions
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON Device where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON Device where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultDevice :: Device
defaultDevice = Device
{ device_hostname = Nothing,
device_id = Nothing,
device_manufacturer = Nothing,
device_model = Nothing,
device_modelNumber = Nothing,
device_osName = Nothing,
device_osVersion = Nothing,
device_freeMemory = Nothing,
device_totalMemory = Nothing,
device_freeDisk = Nothing,
device_browserName = Nothing,
device_browserVersion = Nothing,
device_jailBroken = Nothing,
device_orientation = Nothing,
device_time = Nothing,
device_cpuAbi = Nothing,
device_runtimeVersions = Nothing
}
newtype CpuAbi = CpuAbi Text
deriving (Generic, Show)
instance Data.Aeson.ToJSON CpuAbi where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON CpuAbi where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
x86_64CpuAbi :: CpuAbi
x86_64CpuAbi = CpuAbi "x86_64"
data RuntimeVersions
= RuntimeVersions
{
runtimeVersions_androidApi :: Maybe Text,
runtimeVersions_bottle :: Maybe Text,
runtimeVersions_celery :: Maybe Text,
runtimeVersions_clangVersion :: Maybe Text,
runtimeVersions_cocos2dx :: Maybe Text,
runtimeVersions_delayedJob :: Maybe Text,
runtimeVersions_django :: Maybe Text,
runtimeVersions_dotnet :: Maybe Text,
runtimeVersions_dotnetApiCompatibility :: Maybe Text,
runtimeVersions_dotnetClr :: Maybe Text,
runtimeVersions_dotnetScriptingRuntime :: Maybe Text,
runtimeVersions_eventMachine :: Maybe Text,
runtimeVersions_expoApp :: Maybe Text,
runtimeVersions_expoSdk :: Maybe Text,
runtimeVersions_flask :: Maybe Text,
runtimeVersions_gin :: Maybe Text,
runtimeVersions_go :: Maybe Text,
runtimeVersions_javaType :: Maybe Text,
runtimeVersions_javaVersion :: Maybe Text,
runtimeVersions_jruby :: Maybe Text,
runtimeVersions_laravel :: Maybe Text,
runtimeVersions_lumen :: Maybe Text,
runtimeVersions_magento :: Maybe Text,
runtimeVersions_mailman :: Maybe Text,
runtimeVersions_martini :: Maybe Text,
runtimeVersions_negroni :: Maybe Text,
runtimeVersions_node :: Maybe Text,
runtimeVersions_osBuild :: Maybe Text,
runtimeVersions_php :: Maybe Text,
runtimeVersions_python :: Maybe Text,
runtimeVersions_que :: Maybe Text,
runtimeVersions_rack :: Maybe Text,
runtimeVersions_rails :: Maybe Text,
runtimeVersions_rake :: Maybe Text,
runtimeVersions_reactNative :: Maybe Text,
runtimeVersions_reactNativeJsEngine :: Maybe Text,
runtimeVersions_resque :: Maybe Text,
runtimeVersions_revel :: Maybe Text,
runtimeVersions_ruby :: Maybe Text,
runtimeVersions_shoryoken :: Maybe Text,
runtimeVersions_sidekiq :: Maybe Text,
runtimeVersions_silex :: Maybe Text,
runtimeVersions_sinatra :: Maybe Text,
runtimeVersions_springBoot :: Maybe Text,
runtimeVersions_springFramework :: Maybe Text,
runtimeVersions_swift :: Maybe Text,
runtimeVersions_symfony :: Maybe Text,
runtimeVersions_tornado :: Maybe Text,
runtimeVersions_unity :: Maybe Text,
runtimeVersions_unityScriptingBackend :: Maybe Text,
runtimeVersions_wordpress :: Maybe Text
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON RuntimeVersions where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON RuntimeVersions where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultRuntimeVersions :: RuntimeVersions
defaultRuntimeVersions =
RuntimeVersions
{ runtimeVersions_androidApi = Nothing,
runtimeVersions_bottle = Nothing,
runtimeVersions_celery = Nothing,
runtimeVersions_clangVersion = Nothing,
runtimeVersions_cocos2dx = Nothing,
runtimeVersions_delayedJob = Nothing,
runtimeVersions_django = Nothing,
runtimeVersions_dotnet = Nothing,
runtimeVersions_dotnetApiCompatibility = Nothing,
runtimeVersions_dotnetClr = Nothing,
runtimeVersions_dotnetScriptingRuntime = Nothing,
runtimeVersions_eventMachine = Nothing,
runtimeVersions_expoApp = Nothing,
runtimeVersions_expoSdk = Nothing,
runtimeVersions_flask = Nothing,
runtimeVersions_gin = Nothing,
runtimeVersions_go = Nothing,
runtimeVersions_javaType = Nothing,
runtimeVersions_javaVersion = Nothing,
runtimeVersions_jruby = Nothing,
runtimeVersions_laravel = Nothing,
runtimeVersions_lumen = Nothing,
runtimeVersions_magento = Nothing,
runtimeVersions_mailman = Nothing,
runtimeVersions_martini = Nothing,
runtimeVersions_negroni = Nothing,
runtimeVersions_node = Nothing,
runtimeVersions_osBuild = Nothing,
runtimeVersions_php = Nothing,
runtimeVersions_python = Nothing,
runtimeVersions_que = Nothing,
runtimeVersions_rack = Nothing,
runtimeVersions_rails = Nothing,
runtimeVersions_rake = Nothing,
runtimeVersions_reactNative = Nothing,
runtimeVersions_reactNativeJsEngine = Nothing,
runtimeVersions_resque = Nothing,
runtimeVersions_revel = Nothing,
runtimeVersions_ruby = Nothing,
runtimeVersions_shoryoken = Nothing,
runtimeVersions_sidekiq = Nothing,
runtimeVersions_silex = Nothing,
runtimeVersions_sinatra = Nothing,
runtimeVersions_springBoot = Nothing,
runtimeVersions_springFramework = Nothing,
runtimeVersions_swift = Nothing,
runtimeVersions_symfony = Nothing,
runtimeVersions_tornado = Nothing,
runtimeVersions_unity = Nothing,
runtimeVersions_unityScriptingBackend = Nothing,
runtimeVersions_wordpress = Nothing
}
data Session
= Session
{
session_id :: Text,
session_startedAt :: Text,
session_events :: SessionEvents
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON Session where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON Session where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultSession :: Session
defaultSession =
Session
{ session_id = "",
session_startedAt = "",
session_events = defaultSessionEvents
}
data SessionEvents
= SessionEvents
{
sessionEvents_handled :: Int,
sessionEvents_unhandled :: Int
}
deriving (Generic, Show)
instance Data.Aeson.ToJSON SessionEvents where
toJSON = Data.Aeson.genericToJSON aesonOptions
toEncoding = Data.Aeson.genericToEncoding aesonOptions
instance Data.Aeson.FromJSON SessionEvents where
parseJSON = Data.Aeson.genericParseJSON aesonOptions
defaultSessionEvents :: SessionEvents
defaultSessionEvents =
SessionEvents
{ sessionEvents_handled = 0,
sessionEvents_unhandled = 0
}
aesonOptions :: Data.Aeson.Options
aesonOptions =
Data.Aeson.defaultOptions
{ Data.Aeson.fieldLabelModifier = drop 1 . dropWhile (/= '_'),
Data.Aeson.omitNothingFields = True
}