packages feed

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))