packages feed

cloudevents-haskell-0.1.0.0: src/CloudEvent/V1/Event/Data.hs

module CloudEvent.V1.Event.Data
  ( CloudEvent
  , MkCloudEventArg (..)
  , mkCloudEvent
  , EmptyExtension (..)
  ) where

import Prelude

import Autodocodec
  ( Autodocodec (..)
  , HasCodec (..)
  , HasObjectCodec (objectCodec)
  , object
  )
import CloudEvent.V1.Event.Internal.Data (CloudEvent (..))
import Data.Aeson (FromJSON, ToJSON)
import Data.Binary (Binary)
import Data.Text (Text)
import Data.Time (UTCTime)
import GHC.Generics (Generic)
import Iri.Data (Iri)

-- | Arguments for creating a CloudEvent
data MkCloudEventArg = MkCloudEventArg
  { ceId :: Text
  -- ^ Unique identifier for the event
  , ceSource :: Iri
  -- ^ Identifies the context where the event occurred
  , ceEventType :: Text
  -- ^ Describes the type of event
  , ceDataContentType :: Maybe Text
  -- ^ Content type of the event data (e.g., application/json)
  , ceDataSchema :: Maybe Iri
  -- ^ Schema that the event data adheres to
  , ceSubject :: Maybe Text
  -- ^ Subject of the event within the context
  , ceTime :: UTCTime
  -- ^ Timestamp when the event occurred
  }

mkCloudEvent
  :: MkCloudEventArg
  -> eventData
  -> extensionAttributeRecord
  -> CloudEvent extensionAttributeRecord eventData
mkCloudEvent x eventData ext =
  CloudEvent
    { ceId = x.ceId
    , ceSource = x.ceSource
    , ceSpecVersion = "1.0"
    , ceType = x.ceEventType
    , ceDataContentType = x.ceDataContentType
    , ceDataSchema = x.ceDataSchema
    , ceSubject = x.ceSubject
    , ceTime = x.ceTime
    , ceData = eventData
    , ceDatabase64 = Nothing
    , extensionAttributes = ext
    }

-- | A placeholder type representing an empty set of extension attributes.
--
-- This type is useful when you need to create a CloudEvent with no extension
-- attributes but require a concrete type parameter for the extension.
-- It encodes and decodes to an empty JSON object.
--
-- Example usage:
--
-- @
-- myEvent :: CloudEvent EmptyExtension MyDataType
-- myEvent = mkCloudEvent args myData EmptyExtension
-- @
data EmptyExtension = EmptyExtension
  deriving stock (Eq, Generic, Show)
  deriving anyclass (Binary)
  deriving (FromJSON, ToJSON) via (Autodocodec EmptyExtension)

instance HasCodec EmptyExtension where
  codec = object "EmptyExtension" objectCodec

instance HasObjectCodec EmptyExtension where
  objectCodec = pure EmptyExtension