packages feed

keiro-dsl-0.12.0.0: test/conformance-mapped-queue/Conformance/MappedQueue/Bindings.hs

{-# LANGUAGE OverloadedRecordDot #-}

module Conformance.MappedQueue.Bindings
  ( geometryCases,
    jobMetadataBinding,
    jobMetadataCases,
    jobPayloadBinding,
    jobPayloadCases,
  )
where

import Conformance.MappedQueue.Domain qualified as Domain
import Data.List.NonEmpty (NonEmpty (..))
import Generated.MappedQueue.Structural.Shape.JobMetadata qualified as MetadataShape
import Generated.MappedQueue.Structural.Shape.JobPayload qualified as PayloadShape
import Keiro.Codec.Structural (FixtureCases (..), StructuralBinding (..))
import Keiro.Codec.Structural.Generic (genericStructuralBinding)

jobMetadataBinding :: StructuralBinding Domain.JobMetadata MetadataShape.JobMetadataShape
jobMetadataBinding = genericStructuralBinding

jobPayloadBinding :: StructuralBinding Domain.JobPayload PayloadShape.JobPayloadShape
jobPayloadBinding =
  StructuralBinding
    { bindingToShape = \value ->
        PayloadShape.JobPayload
          value.jobId
          value.label
          (bindingToShape jobMetadataBinding <$> value.metadata)
          value.geometry,
      bindingFromShape = \(PayloadShape.JobPayload jobId label metadata geometry) ->
        Domain.JobPayload
          jobId
          label
          (bindingFromShape jobMetadataBinding <$> metadata)
          geometry
    }

geometryCases :: FixtureCases Domain.Geometry
geometryCases =
  FixtureCases
    ( ("point", Domain.Geometry "POINT (1 2)")
        :| [("empty", Domain.Geometry "GEOMETRYCOLLECTION EMPTY")]
    )

jobMetadataCases :: FixtureCases Domain.JobMetadata
jobMetadataCases =
  FixtureCases
    ( ("none", Domain.JobMetadata Nothing)
        :| [("some", Domain.JobMetadata (Just "priority"))]
    )

jobPayloadCases :: FixtureCases Domain.JobPayload
jobPayloadCases =
  FixtureCases
    ( ( "without-metadata",
        Domain.JobPayload "job-1" "primary" Nothing (Domain.Geometry "POINT (1 2)")
      )
        :| [ ( "with-metadata",
               Domain.JobPayload "job-2" "secondary" (Just (Domain.JobMetadata (Just "priority"))) (Domain.Geometry "POINT (3 4)")
             )
           ]
    )