packages feed

keiro-dsl-0.2.0.0: test/conformance-contract/Generated/HospitalCapacity/Emergency/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 Generated.HospitalCapacity.Emergency.Contract
  ( EmergencyPayload (..)
  , IncidentTransferNeedDeclaredData (..)
  , TransferReservationAcceptedData (..)
  , messageTypeOf
  , encodeEmergencyPayload
  , parseEmergencyPayload
  ) where

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

-- topic constants
incidentEventsTopic :: Text
incidentEventsTopic = "emergency.incident.events"
hospitalEventsTopic :: Text
hospitalEventsTopic = "emergency.hospital.events"

-- the closed payload set (discriminated by "messageType")
data IncidentTransferNeedDeclaredData = IncidentTransferNeedDeclaredData { incidentId :: !Text, triageRecordId :: !Text, region :: !Text, redCount :: !Int }
  deriving stock (Eq, Show)

data TransferReservationAcceptedData = TransferReservationAcceptedData { incidentId :: !Text, reservationId :: !Text, hospitalId :: !Text, expirationDeadline :: !Text }
  deriving stock (Eq, Show)

data EmergencyPayload = IncidentTransferNeedDeclared !IncidentTransferNeedDeclaredData
  | TransferReservationAccepted !TransferReservationAcceptedData
  deriving stock (Eq, Show)

messageTypeOf :: EmergencyPayload -> Text
messageTypeOf = \case
  IncidentTransferNeedDeclared {} -> "IncidentTransferNeedDeclared"
  TransferReservationAccepted {} -> "TransferReservationAccepted"

encodeEmergencyPayload :: EmergencyPayload -> Value
encodeEmergencyPayload = \case
  IncidentTransferNeedDeclared payload ->
    object
      [ "messageType" .= ("IncidentTransferNeedDeclared" :: Text)
      , "incidentId" .= payload.incidentId
      , "triageRecordId" .= payload.triageRecordId
      , "region" .= payload.region
      , "redCount" .= payload.redCount
      ]
  TransferReservationAccepted payload ->
    object
      [ "messageType" .= ("TransferReservationAccepted" :: Text)
      , "incidentId" .= payload.incidentId
      , "reservationId" .= payload.reservationId
      , "hospitalId" .= payload.hospitalId
      , "expirationDeadline" .= payload.expirationDeadline
      ]

parseEmergencyPayload :: Value -> Either Text EmergencyPayload
parseEmergencyPayload = mapLeftText . parseEither (withObject "EmergencyPayload" go)
  where
    go o = do
      kind <- o .: "messageType" :: Parser Text
      case kind of
        "IncidentTransferNeedDeclared" ->
          IncidentTransferNeedDeclared <$> (IncidentTransferNeedDeclaredData <$> o .: "incidentId" <*> o .: "triageRecordId" <*> o .: "region" <*> o .: "redCount")
        "TransferReservationAccepted" ->
          TransferReservationAccepted <$> (TransferReservationAcceptedData <$> o .: "incidentId" <*> o .: "reservationId" <*> o .: "hospitalId" <*> o .: "expirationDeadline")
        _ -> fail "unknown message type"

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