keiro-dsl-0.18.0.0: test/conformance-checked-mapping-replay/Generated/CheckedMappingReplay/ReplayEvents/Contract.hs
-- @generated by keiro-dsl 0.18.0.0 (language keiro-dsl 6) from contract replay_events; do not edit.
module Generated.CheckedMappingReplay.ReplayEvents.Contract
( ReplayEventsPayload (..)
, ReplayLinkedData (..)
, replayEventsTopic
, messageTypeOf
, encodeReplayEventsPayload
, parseReplayEventsPayload
) where
import Data.Aeson (Value, object, withObject, withText, (.=))
import Data.Aeson.Types (Parser, explicitParseField, parseEither)
import Generated.CheckedMappingReplay.Nominals qualified as Nominals
import Generated.CheckedMappingReplay.Structural.NominalLeaves qualified as NominalLeaves
import Data.Text (Text)
import qualified Data.Text as T
-- topic constants
replayEventsTopic :: Text
replayEventsTopic = "checked.mapping.replay.events"
-- the closed payload set (discriminated by "messageType")
data ReplayLinkedData = ReplayLinkedData {retainedId :: !Nominals.RetainedId}
deriving stock (Eq, Show)
data ReplayEventsPayload
= ReplayLinked !ReplayLinkedData
deriving stock (Eq, Show)
messageTypeOf :: ReplayEventsPayload -> Text
messageTypeOf = \case
ReplayLinked {} -> "ReplayLinked"
encodeReplayEventsPayload :: ReplayEventsPayload -> Value
encodeReplayEventsPayload = \case
ReplayLinked payload ->
object
[ "messageType" .= ("ReplayLinked" :: Text),
"retainedId" .= NominalLeaves.encodeRetainedIdLeaf payload.retainedId
]
parseReplayEventsPayload :: Value -> Either Text ReplayEventsPayload
parseReplayEventsPayload = mapLeftText . parseEither (withObject "ReplayEventsPayload" go)
where
go o = do
kind <- explicitParseField (withText "messageType" validateMessageType) o "messageType"
case kind of
"ReplayLinked" ->
ReplayLinked
<$> ( ReplayLinkedData
<$> explicitParseField NominalLeaves.parseRetainedIdLeaf o "retainedId"
)
_ -> fail "validated message type was not handled"
mapLeftText :: Either String b -> Either Text b
mapLeftText = either (Left . T.pack) Right
validateMessageType :: Text -> Parser Text
validateMessageType kind
| kind `elem` ["ReplayLinked"] = pure kind
| otherwise = fail ("unknown message type " <> show kind <> "; expected one of: ReplayLinked")