keiro-dsl-0.12.0.0: test/conformance-projection-catalog/Generated/CatalogDemo/QualificationJobs/Queue.hs
{-# LANGUAGE OverloadedRecordDot #-}
-- @generated by keiro-dsl 0.12.0.0 (language keiro-dsl 5) from workqueue qualification_jobs; do not edit.
module Generated.CatalogDemo.QualificationJobs.Queue
( QualificationJob (..)
, encodeQualificationJob
, parseQualificationJob
, encodeQualificationPayloadMapped
, decodeQualificationPayloadMapped
, queuePhysical, queueDlq, queueTable
) where
import Control.Monad (unless)
import Data.Aeson (Value (..), object, parseJSON, toJSON, withObject, (.:), (.=))
import Data.Aeson.Key qualified as Key
import Data.Aeson.KeyMap qualified as KeyMap
import Data.Aeson.Types (Parser, explicitParseField, parseEither)
import Data.Text (Text)
import qualified Data.Text as T
import Keiro.Codec.Structural (bindingFromShape, bindingToShape)
import CatalogDemo.MappedBindings qualified as MappedBindings
import CatalogDemo.MappedDomain (QualificationPayload, QueueMetadata, SharedReference)
import Generated.CatalogDemo.Structural.Shape.QualificationPayload qualified as ShapeQualificationPayload
queuePhysical, queueDlq, queueTable :: Text
queuePhysical = "catalog_demo_qualification_jobs"
queueDlq = "catalog_demo_qualification_jobs_dlq"
queueTable = "pgmq.q_catalog_demo_qualification_jobs"
data QualificationJob = QualificationJob
{ sharedReference :: !SharedReference
, qualification :: !QualificationPayload
, metadata :: !QueueMetadata
, maybeMetadata :: !(Maybe QueueMetadata)
, attempt :: !Int
, trace :: !Value
}
deriving stock (Eq, Show)
encodeQualificationPayloadMapped :: QualificationPayload -> Value
encodeQualificationPayloadMapped = encodeQualificationPayloadShape . bindingToShape MappedBindings.qualificationPayloadBinding
parseQualificationPayloadMapped :: Value -> Parser QualificationPayload
parseQualificationPayloadMapped value = bindingFromShape MappedBindings.qualificationPayloadBinding <$> parseQualificationPayloadShape value
decodeQualificationPayloadMapped :: Value -> Either Text QualificationPayload
decodeQualificationPayloadMapped = mapLeftText . parseEither parseQualificationPayloadMapped
encodeQualificationPayloadShape :: ShapeQualificationPayload.QualificationPayloadShape -> Value
encodeQualificationPayloadShape shape =
object
[ "qualification_id" .= toJSON (ShapeQualificationPayload.qualificationId shape)
, "note" .= maybe Null (\item -> toJSON (item)) (ShapeQualificationPayload.note shape)
]
parseQualificationPayloadShape :: Value -> Parser ShapeQualificationPayload.QualificationPayloadShape
parseQualificationPayloadShape = withObject "QualificationPayloadShape" $ \objectValue -> do
rejectUnknownFields "QualificationPayload" ["qualification_id", "note"] objectValue
ShapeQualificationPayload.QualificationPayload
<$> explicitParseField (parseJSON) objectValue "qualification_id"
<*> explicitParseField (\value -> case value of Null -> pure Nothing; other -> Just <$> parseJSON other) objectValue "note"
encodeQualificationJob :: QualificationJob -> Value
encodeQualificationJob payload =
object
[ "shared_reference" .= toJSON payload.sharedReference
, "payload" .= encodeQualificationPayloadMapped payload.qualification
, "metadata" .= toJSON payload.metadata
, "maybe_metadata" .= maybe Null (\item -> toJSON item) (payload.maybeMetadata)
, "attempt" .= payload.attempt
, "trace" .= payload.trace
]
parseQualificationJob :: Value -> Either Text QualificationJob
parseQualificationJob = mapLeftText . parseEither (withObject "QualificationJob" go)
where
go objectValue = QualificationJob <$> explicitParseField (parseJSON) objectValue "shared_reference" <*> explicitParseField (parseQualificationPayloadMapped) objectValue "payload" <*> explicitParseField (parseJSON) objectValue "metadata" <*> explicitParseField (\value -> case value of Null -> pure Nothing; other -> Just <$> parseJSON other) objectValue "maybe_metadata" <*> objectValue .: "attempt" <*> explicitParseField (pure) objectValue "trace"
mapLeftText :: Either String b -> Either Text b
mapLeftText = either (Left . T.pack) Right
rejectUnknownFields :: String -> [Text] -> KeyMap.KeyMap Value -> Parser ()
rejectUnknownFields label allowed objectValue =
unless (null extras) (fail (label <> " contains unknown fields: " <> show extras))
where
extras = filter (`notElem` allowed) (map Key.toText (KeyMap.keys objectValue))