packages feed

patrol-1.2.0.0: source/library/Patrol/Type/Item.hs

{-# LANGUAGE OverloadedStrings #-}

module Patrol.Type.Item where

import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Key as Key
import qualified Data.ByteString as ByteString
import qualified Data.ByteString.Builder as Builder
import qualified Data.ByteString.Lazy as LazyByteString
import qualified Patrol.Type.Event as Event

-- | <https://develop.sentry.dev/sdk/data-model/envelope-items/>
data Item
  = -- | An 'Patrol.Type.Event.Event' item.
    --
    -- <https://develop.sentry.dev/sdk/envelopes/#event>
    Event Event.Event
  | -- | A sentinel item used to filter raw envelopes.
    Raw
  deriving (Eq, Show)

serialize :: Item -> Builder.Builder
serialize item = case item of
  Event event ->
    let payload = LazyByteString.toStrict $ Aeson.encode event
        headers = buildHeaders "event" (ByteString.length payload)
     in headers <> Builder.char7 '\n' <> Builder.byteString payload
  Raw -> mempty
  where
    buildHeaders :: Key.Key -> Int -> Builder.Builder
    buildHeaders type_ length_ =
      Aeson.fromEncoding $
        Aeson.pairs ("type" Aeson..= type_ <> "length" Aeson..= length_)