packages feed

keiro-dsl-0.12.0.0: test/conformance-mapped-queue/Generated/MappedQueue/MappedJobs/Queue.hs

{-# LANGUAGE OverloadedRecordDot #-}
-- @generated by keiro-dsl 0.12.0.0 (language keiro-dsl 5) from workqueue mapped_jobs; do not edit.
module Generated.MappedQueue.MappedJobs.Queue
  ( MappedJob (..)
  , encodeMappedJob
  , parseMappedJob
  , encodeJobMetadataMapped
  , decodeJobMetadataMapped
  , encodeJobPayloadMapped
  , decodeJobPayloadMapped
  , 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 Conformance.MappedQueue.Bindings qualified as Bindings
import Conformance.MappedQueue.Domain (JobMetadata, JobPayload)
import Generated.MappedQueue.Structural.Shape.JobMetadata qualified as ShapeJobMetadata
import Generated.MappedQueue.Structural.Shape.JobPayload qualified as ShapeJobPayload

queuePhysical, queueDlq, queueTable :: Text
queuePhysical = "mapped_jobs"
queueDlq = "mapped_jobs_dlq"
queueTable = "pgmq.q_mapped_jobs"

data MappedJob = MappedJob
  { job :: !JobPayload
  , maybeJob :: !(Maybe JobPayload)
  , trace :: !Value
  }
  deriving stock (Eq, Show)

encodeJobMetadataMapped :: JobMetadata -> Value
encodeJobMetadataMapped = encodeJobMetadataShape . bindingToShape Bindings.jobMetadataBinding

parseJobMetadataMapped :: Value -> Parser JobMetadata
parseJobMetadataMapped value = bindingFromShape Bindings.jobMetadataBinding <$> parseJobMetadataShape value

decodeJobMetadataMapped :: Value -> Either Text JobMetadata
decodeJobMetadataMapped = mapLeftText . parseEither parseJobMetadataMapped

encodeJobMetadataShape :: ShapeJobMetadata.JobMetadataShape -> Value
encodeJobMetadataShape shape =
  object
      [ "note" .= maybe Null (\item -> toJSON (item)) (ShapeJobMetadata.note shape)
      ]

parseJobMetadataShape :: Value -> Parser ShapeJobMetadata.JobMetadataShape
parseJobMetadataShape = withObject "JobMetadataShape" $ \objectValue -> do
  ShapeJobMetadata.JobMetadata
    <$> explicitParseField (\value -> case value of Null -> pure Nothing; other -> Just <$> parseJSON other) objectValue "note"

encodeJobPayloadMapped :: JobPayload -> Value
encodeJobPayloadMapped = encodeJobPayloadShape . bindingToShape Bindings.jobPayloadBinding

parseJobPayloadMapped :: Value -> Parser JobPayload
parseJobPayloadMapped value = bindingFromShape Bindings.jobPayloadBinding <$> parseJobPayloadShape value

decodeJobPayloadMapped :: Value -> Either Text JobPayload
decodeJobPayloadMapped = mapLeftText . parseEither parseJobPayloadMapped

encodeJobPayloadShape :: ShapeJobPayload.JobPayloadShape -> Value
encodeJobPayloadShape shape =
  object
      [ "job_id" .= toJSON (ShapeJobPayload.jobId shape)
      , "label" .= toJSON (ShapeJobPayload.label shape)
      , "metadata" .= maybe Null (\item -> encodeJobMetadataShape (item)) (ShapeJobPayload.metadata shape)
      , "geometry" .= toJSON (ShapeJobPayload.geometry shape)
      ]

parseJobPayloadShape :: Value -> Parser ShapeJobPayload.JobPayloadShape
parseJobPayloadShape = withObject "JobPayloadShape" $ \objectValue -> do
  rejectUnknownFields "JobPayload" ["job_id", "label", "metadata", "geometry"] objectValue
  ShapeJobPayload.JobPayload
    <$> explicitParseField (parseJSON) objectValue "job_id"
    <*> explicitParseField (parseJSON) objectValue "label"
    <*> explicitParseField (\value -> case value of Null -> pure Nothing; other -> Just <$> parseJobMetadataShape other) objectValue "metadata"
    <*> explicitParseField (parseJSON) objectValue "geometry"

encodeMappedJob :: MappedJob -> Value
encodeMappedJob payload =
  object
    [ "job" .= encodeJobPayloadMapped payload.job
    , "maybe_job" .= maybe Null (\item -> encodeJobPayloadMapped item) (payload.maybeJob)
    , "trace" .= payload.trace
    ]

parseMappedJob :: Value -> Either Text MappedJob
parseMappedJob = mapLeftText . parseEither (withObject "MappedJob" go)
  where
    go objectValue = MappedJob <$> explicitParseField (parseJobPayloadMapped) objectValue "job" <*> explicitParseField (\value -> case value of Null -> pure Nothing; other -> Just <$> parseJobPayloadMapped other) objectValue "maybe_job" <*> 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))