packages feed

keiro-dsl-0.2.0.0: test/conformance-skeletons/SkelIntake/Generated/MyService/MyContract/Contract.hs

{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wno-unused-top-binds #-}

-- @generated by keiro-dsl; do not edit. Regenerated from the .keiro spec.
module SkelIntake.Generated.MyService.MyContract.Contract (
    MyContractPayload (..),
    ThingHappenedData (..),
    messageTypeOf,
    encodeMyContractPayload,
    parseMyContractPayload,
) where

import Data.Aeson (Value, object, withObject, (.:), (.=))
import Data.Aeson.Types (Parser, parseEither)
import Data.Text (Text)
import Data.Text qualified as T

-- topic constants
eventsTopic :: Text
eventsTopic = "my-service.events"

-- the closed payload set (discriminated by "messageType")
data ThingHappenedData = ThingHappenedData {thingId :: !Text}
    deriving stock (Eq, Show)

data MyContractPayload = ThingHappened !ThingHappenedData
    deriving stock (Eq, Show)

messageTypeOf :: MyContractPayload -> Text
messageTypeOf = \case
    ThingHappened{} -> "ThingHappened"

encodeMyContractPayload :: MyContractPayload -> Value
encodeMyContractPayload = \case
    ThingHappened payload ->
        object
            [ "messageType" .= ("ThingHappened" :: Text)
            , "thingId" .= payload.thingId
            ]

parseMyContractPayload :: Value -> Either Text MyContractPayload
parseMyContractPayload = mapLeftText . parseEither (withObject "MyContractPayload" go)
  where
    go o = do
        kind <- o .: "messageType" :: Parser Text
        case kind of
            "ThingHappened" ->
                ThingHappened <$> (ThingHappenedData <$> o .: "thingId")
            _ -> fail "unknown message type"

mapLeftText :: Either String b -> Either Text b
mapLeftText = either (Left . T.pack) Right