packages feed

keiro-dsl-0.9.0.0: test/conformance-coldstart/Generated/Billing/Nominals.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
-- @generated by keiro-dsl 0.8.0.0 (language keiro-dsl 4) from context billing generated nominal declarations; do not edit.
module Generated.Billing.Nominals
  ( CustomerId
  , parseCustomerId
  , mkCustomerId
  , customerIdText
  , Plan (..)
  , planText
  , PlanEqualityProjection
  , planEqualityWitness
  , SubscriptionId
  , parseSubscriptionId
  , mkSubscriptionId
  , subscriptionIdText
  ) where

import Data.Aeson (FromJSON, ToJSON)
import Data.Text (Text)
import GHC.Generics (Generic)
import Keiki.Shape (CanonicalTypeName)
import Generated.Billing.Nominals.Internal (CustomerId, mkCustomerId, parseCustomerId, customerIdText, SubscriptionId, mkSubscriptionId, parseSubscriptionId, subscriptionIdText)
import Keiki.Core (ExactFieldProjection (..), FieldProjection (..), FieldWitness, exactFieldWitness, fieldWitness)
import Data.List.NonEmpty (NonEmpty (..))
import Keiki.ProjectionDomain (TextPattern, finiteProjectionDomain, textProjectionDomain)
import Keiro.Codec.IdDomain (idDomainTextPattern, typeIdV7Domain)

instance CanonicalTypeName CustomerId

data Plan = Paid | Free
  deriving stock (Generic, Eq, Ord, Show, Enum, Bounded)
  deriving anyclass (ToJSON, FromJSON)

instance CanonicalTypeName Plan

planText :: Plan -> Text
planText = \case
  Paid -> "paid"
  Free -> "free"

data PlanEqualityProjection

instance FieldProjection PlanEqualityProjection where
  type FieldName PlanEqualityProjection = "Plan"
  type FieldOwner PlanEqualityProjection = Plan
  type FieldResult PlanEqualityProjection = Text
  fieldShapeId _ = "nominal-equality|name=Plan|contract=keiro-dsl/nominal-equality/1|key=Text|domain=finite-text:paid,free|owner=generated"
  projectFieldValue _ = planText

instance ExactFieldProjection PlanEqualityProjection where
  fieldProjectionDomain _ = finiteProjectionDomain ("paid" :| ["free"])
  reconstructFieldOwner _ = \case
    "paid" -> Just Paid
    "free" -> Just Free
    _ -> Nothing

planEqualityWitness :: FieldWitness PlanEqualityProjection
planEqualityWitness = exactFieldWitness @PlanEqualityProjection

instance CanonicalTypeName SubscriptionId