{-# LANGUAGE MultiWayIf #-}
-- CHANGE WITH CAUTION: This is a generated code file generated by https://github.com/Haskell-OpenAPI-Code-Generator/Haskell-OpenAPI-Client-Code-Generator.
{-# LANGUAGE OverloadedStrings #-}

-- | Contains the types generated from the schema Plan
module StripeAPI.Types.Plan where

import qualified Control.Monad.Fail
import qualified Data.Aeson
import qualified Data.Aeson as Data.Aeson.Encoding.Internal
import qualified Data.Aeson as Data.Aeson.Types
import qualified Data.Aeson as Data.Aeson.Types.FromJSON
import qualified Data.Aeson as Data.Aeson.Types.Internal
import qualified Data.Aeson as Data.Aeson.Types.ToJSON
import qualified Data.ByteString.Char8
import qualified Data.ByteString.Char8 as Data.ByteString.Internal
import qualified Data.Functor
import qualified Data.Scientific
import qualified Data.Text
import qualified Data.Text.Internal
import qualified Data.Time.Calendar as Data.Time.Calendar.Days
import qualified Data.Time.LocalTime as Data.Time.LocalTime.Internal.ZonedTime
import qualified GHC.Base
import qualified GHC.Classes
import qualified GHC.Int
import qualified GHC.Show
import qualified GHC.Types
import qualified StripeAPI.Common
import StripeAPI.TypeAlias
import {-# SOURCE #-} StripeAPI.Types.DeletedProduct
import {-# SOURCE #-} StripeAPI.Types.PlanTier
import {-# SOURCE #-} StripeAPI.Types.Product
import {-# SOURCE #-} StripeAPI.Types.TransformUsage
import qualified Prelude as GHC.Integer.Type
import qualified Prelude as GHC.Maybe

-- | Defines the object schema located at @components.schemas.plan@ in the specification.
--
-- You can now model subscriptions more flexibly using the [Prices API](https:\/\/stripe.com\/docs\/api\#prices). It replaces the Plans API and is backwards compatible to simplify your migration.
--
-- Plans define the base price, currency, and billing cycle for recurring purchases of products.
-- [Products](https:\/\/stripe.com\/docs\/api\#products) help you track inventory or provisioning, and plans help you track pricing. Different physical goods or levels of service should be represented by products, and pricing options should be represented by plans. This approach lets you change prices without having to change your provisioning scheme.
--
-- For example, you might have a single \"gold\" product that has plans for \$10\/month, \$100\/year, €9\/month, and €90\/year.
--
-- Related guides: [Set up a subscription](https:\/\/stripe.com\/docs\/billing\/subscriptions\/set-up-subscription) and more about [products and prices](https:\/\/stripe.com\/docs\/billing\/prices-guide).
data Plan = Plan
  { -- | active: Whether the plan can be used for new purchases.
    Plan -> Bool
planActive :: GHC.Types.Bool,
    -- | aggregate_usage: Specifies a usage aggregation strategy for plans of \`usage_type=metered\`. Allowed values are \`sum\` for summing up all usage during a period, \`last_during_period\` for using the last usage record reported within a period, \`last_ever\` for using the last usage record ever (across period bounds) or \`max\` which uses the usage record with the maximum reported usage during a period. Defaults to \`sum\`.
    Plan -> Maybe PlanAggregateUsage'
planAggregateUsage :: (GHC.Maybe.Maybe PlanAggregateUsage'),
    -- | amount: The unit amount in %s to be charged, represented as a whole integer if possible. Only set if \`billing_scheme=per_unit\`.
    Plan -> Maybe Int
planAmount :: (GHC.Maybe.Maybe GHC.Types.Int),
    -- | amount_decimal: The unit amount in %s to be charged, represented as a decimal string with at most 12 decimal places. Only set if \`billing_scheme=per_unit\`.
    Plan -> Maybe Text
planAmountDecimal :: (GHC.Maybe.Maybe Data.Text.Internal.Text),
    -- | billing_scheme: Describes how to compute the price per period. Either \`per_unit\` or \`tiered\`. \`per_unit\` indicates that the fixed amount (specified in \`amount\`) will be charged per unit in \`quantity\` (for plans with \`usage_type=licensed\`), or per unit of total usage (for plans with \`usage_type=metered\`). \`tiered\` indicates that the unit pricing will be computed using a tiering strategy as defined using the \`tiers\` and \`tiers_mode\` attributes.
    Plan -> PlanBillingScheme'
planBillingScheme :: PlanBillingScheme',
    -- | created: Time at which the object was created. Measured in seconds since the Unix epoch.
    Plan -> Int
planCreated :: GHC.Types.Int,
    -- | currency: Three-letter [ISO currency code](https:\/\/www.iso.org\/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https:\/\/stripe.com\/docs\/currencies).
    Plan -> Text
planCurrency :: Data.Text.Internal.Text,
    -- | id: Unique identifier for the object.
    --
    -- Constraints:
    --
    -- * Maximum length of 5000
    Plan -> Text
planId :: Data.Text.Internal.Text,
    -- | interval: The frequency at which a subscription is billed. One of \`day\`, \`week\`, \`month\` or \`year\`.
    Plan -> PlanInterval'
planInterval :: PlanInterval',
    -- | interval_count: The number of intervals (specified in the \`interval\` attribute) between subscription billings. For example, \`interval=month\` and \`interval_count=3\` bills every 3 months.
    Plan -> Int
planIntervalCount :: GHC.Types.Int,
    -- | livemode: Has the value \`true\` if the object exists in live mode or the value \`false\` if the object exists in test mode.
    Plan -> Bool
planLivemode :: GHC.Types.Bool,
    -- | metadata: Set of [key-value pairs](https:\/\/stripe.com\/docs\/api\/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.
    Plan -> Maybe Object
planMetadata :: (GHC.Maybe.Maybe Data.Aeson.Types.Internal.Object),
    -- | nickname: A brief description of the plan, hidden from customers.
    --
    -- Constraints:
    --
    -- * Maximum length of 5000
    Plan -> Maybe Text
planNickname :: (GHC.Maybe.Maybe Data.Text.Internal.Text),
    -- | product: The product whose pricing this plan determines.
    Plan -> Maybe PlanProduct'Variants
planProduct :: (GHC.Maybe.Maybe PlanProduct'Variants),
    -- | tiers: Each element represents a pricing tier. This parameter requires \`billing_scheme\` to be set to \`tiered\`. See also the documentation for \`billing_scheme\`.
    Plan -> Maybe [PlanTier]
planTiers :: (GHC.Maybe.Maybe ([PlanTier])),
    -- | tiers_mode: Defines if the tiering price should be \`graduated\` or \`volume\` based. In \`volume\`-based tiering, the maximum quantity within a period determines the per unit price. In \`graduated\` tiering, pricing can change as the quantity grows.
    Plan -> Maybe PlanTiersMode'
planTiersMode :: (GHC.Maybe.Maybe PlanTiersMode'),
    -- | transform_usage: Apply a transformation to the reported usage or set quantity before computing the amount billed. Cannot be combined with \`tiers\`.
    Plan -> Maybe PlanTransformUsage'
planTransformUsage :: (GHC.Maybe.Maybe PlanTransformUsage'),
    -- | trial_period_days: Default number of trial days when subscribing a customer to this plan using [\`trial_from_plan=true\`](https:\/\/stripe.com\/docs\/api\#create_subscription-trial_from_plan).
    Plan -> Maybe Int
planTrialPeriodDays :: (GHC.Maybe.Maybe GHC.Types.Int),
    -- | usage_type: Configures how the quantity per period should be determined. Can be either \`metered\` or \`licensed\`. \`licensed\` automatically bills the \`quantity\` set when adding it to a subscription. \`metered\` aggregates the total usage based on usage records. Defaults to \`licensed\`.
    Plan -> PlanUsageType'
planUsageType :: PlanUsageType'
  }
  deriving
    ( Int -> Plan -> ShowS
[Plan] -> ShowS
Plan -> String
(Int -> Plan -> ShowS)
-> (Plan -> String) -> ([Plan] -> ShowS) -> Show Plan
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Plan] -> ShowS
$cshowList :: [Plan] -> ShowS
show :: Plan -> String
$cshow :: Plan -> String
showsPrec :: Int -> Plan -> ShowS
$cshowsPrec :: Int -> Plan -> ShowS
GHC.Show.Show,
      Plan -> Plan -> Bool
(Plan -> Plan -> Bool) -> (Plan -> Plan -> Bool) -> Eq Plan
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Plan -> Plan -> Bool
$c/= :: Plan -> Plan -> Bool
== :: Plan -> Plan -> Bool
$c== :: Plan -> Plan -> Bool
GHC.Classes.Eq
    )

instance Data.Aeson.Types.ToJSON.ToJSON Plan where
  toJSON :: Plan -> Value
toJSON Plan
obj = [Pair] -> Value
Data.Aeson.Types.Internal.object (Text
"active" Text -> Bool -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Bool
planActive Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"aggregate_usage" Text -> Maybe PlanAggregateUsage' -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe PlanAggregateUsage'
planAggregateUsage Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"amount" Text -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe Int
planAmount Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"amount_decimal" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe Text
planAmountDecimal Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"billing_scheme" Text -> PlanBillingScheme' -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> PlanBillingScheme'
planBillingScheme Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"created" Text -> Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Int
planCreated Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"currency" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Text
planCurrency Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"id" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Text
planId Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"interval" Text -> PlanInterval' -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> PlanInterval'
planInterval Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"interval_count" Text -> Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Int
planIntervalCount Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"livemode" Text -> Bool -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Bool
planLivemode Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"metadata" Text -> Maybe Object -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe Object
planMetadata Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"nickname" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe Text
planNickname Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"product" Text -> Maybe PlanProduct'Variants -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe PlanProduct'Variants
planProduct Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"tiers" Text -> Maybe [PlanTier] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe [PlanTier]
planTiers Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"tiers_mode" Text -> Maybe PlanTiersMode' -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe PlanTiersMode'
planTiersMode Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"transform_usage" Text -> Maybe PlanTransformUsage' -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe PlanTransformUsage'
planTransformUsage Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"trial_period_days" Text -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe Int
planTrialPeriodDays Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"usage_type" Text -> PlanUsageType' -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> PlanUsageType'
planUsageType Plan
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"object" Text -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Text -> Value
Data.Aeson.Types.Internal.String Text
"plan" Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: [Pair]
forall a. Monoid a => a
GHC.Base.mempty)
  toEncoding :: Plan -> Encoding
toEncoding Plan
obj = Series -> Encoding
Data.Aeson.Encoding.Internal.pairs ((Text
"active" Text -> Bool -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Bool
planActive Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"aggregate_usage" Text -> Maybe PlanAggregateUsage' -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe PlanAggregateUsage'
planAggregateUsage Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"amount" Text -> Maybe Int -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe Int
planAmount Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"amount_decimal" Text -> Maybe Text -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe Text
planAmountDecimal Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"billing_scheme" Text -> PlanBillingScheme' -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> PlanBillingScheme'
planBillingScheme Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"created" Text -> Int -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Int
planCreated Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"currency" Text -> Text -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Text
planCurrency Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"id" Text -> Text -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Text
planId Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"interval" Text -> PlanInterval' -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> PlanInterval'
planInterval Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"interval_count" Text -> Int -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Int
planIntervalCount Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"livemode" Text -> Bool -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Bool
planLivemode Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"metadata" Text -> Maybe Object -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe Object
planMetadata Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"nickname" Text -> Maybe Text -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe Text
planNickname Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"product" Text -> Maybe PlanProduct'Variants -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe PlanProduct'Variants
planProduct Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"tiers" Text -> Maybe [PlanTier] -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe [PlanTier]
planTiers Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"tiers_mode" Text -> Maybe PlanTiersMode' -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe PlanTiersMode'
planTiersMode Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"transform_usage" Text -> Maybe PlanTransformUsage' -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe PlanTransformUsage'
planTransformUsage Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"trial_period_days" Text -> Maybe Int -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> Maybe Int
planTrialPeriodDays Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"usage_type" Text -> PlanUsageType' -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Plan -> PlanUsageType'
planUsageType Plan
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> (Text
"object" Text -> Value -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= Text -> Value
Data.Aeson.Types.Internal.String Text
"plan"))))))))))))))))))))

instance Data.Aeson.Types.FromJSON.FromJSON Plan where
  parseJSON :: Value -> Parser Plan
parseJSON = String -> (Object -> Parser Plan) -> Value -> Parser Plan
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.Aeson.Types.FromJSON.withObject String
"Plan" (\Object
obj -> (((((((((((((((((((Bool
 -> Maybe PlanAggregateUsage'
 -> Maybe Int
 -> Maybe Text
 -> PlanBillingScheme'
 -> Int
 -> Text
 -> Text
 -> PlanInterval'
 -> Int
 -> Bool
 -> Maybe Object
 -> Maybe Text
 -> Maybe PlanProduct'Variants
 -> Maybe [PlanTier]
 -> Maybe PlanTiersMode'
 -> Maybe PlanTransformUsage'
 -> Maybe Int
 -> PlanUsageType'
 -> Plan)
-> Parser
     (Bool
      -> Maybe PlanAggregateUsage'
      -> Maybe Int
      -> Maybe Text
      -> PlanBillingScheme'
      -> Int
      -> Text
      -> Text
      -> PlanInterval'
      -> Int
      -> Bool
      -> Maybe Object
      -> Maybe Text
      -> Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a. Applicative f => a -> f a
GHC.Base.pure Bool
-> Maybe PlanAggregateUsage'
-> Maybe Int
-> Maybe Text
-> PlanBillingScheme'
-> Int
-> Text
-> Text
-> PlanInterval'
-> Int
-> Bool
-> Maybe Object
-> Maybe Text
-> Maybe PlanProduct'Variants
-> Maybe [PlanTier]
-> Maybe PlanTiersMode'
-> Maybe PlanTransformUsage'
-> Maybe Int
-> PlanUsageType'
-> Plan
Plan Parser
  (Bool
   -> Maybe PlanAggregateUsage'
   -> Maybe Int
   -> Maybe Text
   -> PlanBillingScheme'
   -> Int
   -> Text
   -> Text
   -> PlanInterval'
   -> Int
   -> Bool
   -> Maybe Object
   -> Maybe Text
   -> Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser Bool
-> Parser
     (Maybe PlanAggregateUsage'
      -> Maybe Int
      -> Maybe Text
      -> PlanBillingScheme'
      -> Int
      -> Text
      -> Text
      -> PlanInterval'
      -> Int
      -> Bool
      -> Maybe Object
      -> Maybe Text
      -> Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser Bool
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"active")) Parser
  (Maybe PlanAggregateUsage'
   -> Maybe Int
   -> Maybe Text
   -> PlanBillingScheme'
   -> Int
   -> Text
   -> Text
   -> PlanInterval'
   -> Int
   -> Bool
   -> Maybe Object
   -> Maybe Text
   -> Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser (Maybe PlanAggregateUsage')
-> Parser
     (Maybe Int
      -> Maybe Text
      -> PlanBillingScheme'
      -> Int
      -> Text
      -> Text
      -> PlanInterval'
      -> Int
      -> Bool
      -> Maybe Object
      -> Maybe Text
      -> Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe PlanAggregateUsage')
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"aggregate_usage")) Parser
  (Maybe Int
   -> Maybe Text
   -> PlanBillingScheme'
   -> Int
   -> Text
   -> Text
   -> PlanInterval'
   -> Int
   -> Bool
   -> Maybe Object
   -> Maybe Text
   -> Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser (Maybe Int)
-> Parser
     (Maybe Text
      -> PlanBillingScheme'
      -> Int
      -> Text
      -> Text
      -> PlanInterval'
      -> Int
      -> Bool
      -> Maybe Object
      -> Maybe Text
      -> Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe Int)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"amount")) Parser
  (Maybe Text
   -> PlanBillingScheme'
   -> Int
   -> Text
   -> Text
   -> PlanInterval'
   -> Int
   -> Bool
   -> Maybe Object
   -> Maybe Text
   -> Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser (Maybe Text)
-> Parser
     (PlanBillingScheme'
      -> Int
      -> Text
      -> Text
      -> PlanInterval'
      -> Int
      -> Bool
      -> Maybe Object
      -> Maybe Text
      -> Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"amount_decimal")) Parser
  (PlanBillingScheme'
   -> Int
   -> Text
   -> Text
   -> PlanInterval'
   -> Int
   -> Bool
   -> Maybe Object
   -> Maybe Text
   -> Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser PlanBillingScheme'
-> Parser
     (Int
      -> Text
      -> Text
      -> PlanInterval'
      -> Int
      -> Bool
      -> Maybe Object
      -> Maybe Text
      -> Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser PlanBillingScheme'
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"billing_scheme")) Parser
  (Int
   -> Text
   -> Text
   -> PlanInterval'
   -> Int
   -> Bool
   -> Maybe Object
   -> Maybe Text
   -> Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser Int
-> Parser
     (Text
      -> Text
      -> PlanInterval'
      -> Int
      -> Bool
      -> Maybe Object
      -> Maybe Text
      -> Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser Int
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"created")) Parser
  (Text
   -> Text
   -> PlanInterval'
   -> Int
   -> Bool
   -> Maybe Object
   -> Maybe Text
   -> Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser Text
-> Parser
     (Text
      -> PlanInterval'
      -> Int
      -> Bool
      -> Maybe Object
      -> Maybe Text
      -> Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"currency")) Parser
  (Text
   -> PlanInterval'
   -> Int
   -> Bool
   -> Maybe Object
   -> Maybe Text
   -> Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser Text
-> Parser
     (PlanInterval'
      -> Int
      -> Bool
      -> Maybe Object
      -> Maybe Text
      -> Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"id")) Parser
  (PlanInterval'
   -> Int
   -> Bool
   -> Maybe Object
   -> Maybe Text
   -> Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser PlanInterval'
-> Parser
     (Int
      -> Bool
      -> Maybe Object
      -> Maybe Text
      -> Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser PlanInterval'
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"interval")) Parser
  (Int
   -> Bool
   -> Maybe Object
   -> Maybe Text
   -> Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser Int
-> Parser
     (Bool
      -> Maybe Object
      -> Maybe Text
      -> Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser Int
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"interval_count")) Parser
  (Bool
   -> Maybe Object
   -> Maybe Text
   -> Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser Bool
-> Parser
     (Maybe Object
      -> Maybe Text
      -> Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser Bool
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"livemode")) Parser
  (Maybe Object
   -> Maybe Text
   -> Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser (Maybe Object)
-> Parser
     (Maybe Text
      -> Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe Object)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"metadata")) Parser
  (Maybe Text
   -> Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser (Maybe Text)
-> Parser
     (Maybe PlanProduct'Variants
      -> Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"nickname")) Parser
  (Maybe PlanProduct'Variants
   -> Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser (Maybe PlanProduct'Variants)
-> Parser
     (Maybe [PlanTier]
      -> Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe PlanProduct'Variants)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"product")) Parser
  (Maybe [PlanTier]
   -> Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser (Maybe [PlanTier])
-> Parser
     (Maybe PlanTiersMode'
      -> Maybe PlanTransformUsage'
      -> Maybe Int
      -> PlanUsageType'
      -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe [PlanTier])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"tiers")) Parser
  (Maybe PlanTiersMode'
   -> Maybe PlanTransformUsage'
   -> Maybe Int
   -> PlanUsageType'
   -> Plan)
-> Parser (Maybe PlanTiersMode')
-> Parser
     (Maybe PlanTransformUsage' -> Maybe Int -> PlanUsageType' -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe PlanTiersMode')
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"tiers_mode")) Parser
  (Maybe PlanTransformUsage' -> Maybe Int -> PlanUsageType' -> Plan)
-> Parser (Maybe PlanTransformUsage')
-> Parser (Maybe Int -> PlanUsageType' -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe PlanTransformUsage')
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"transform_usage")) Parser (Maybe Int -> PlanUsageType' -> Plan)
-> Parser (Maybe Int) -> Parser (PlanUsageType' -> Plan)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe Int)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"trial_period_days")) Parser (PlanUsageType' -> Plan)
-> Parser PlanUsageType' -> Parser Plan
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser PlanUsageType'
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"usage_type"))

-- | Create a new 'Plan' with all required fields.
mkPlan ::
  -- | 'planActive'
  GHC.Types.Bool ->
  -- | 'planBillingScheme'
  PlanBillingScheme' ->
  -- | 'planCreated'
  GHC.Types.Int ->
  -- | 'planCurrency'
  Data.Text.Internal.Text ->
  -- | 'planId'
  Data.Text.Internal.Text ->
  -- | 'planInterval'
  PlanInterval' ->
  -- | 'planIntervalCount'
  GHC.Types.Int ->
  -- | 'planLivemode'
  GHC.Types.Bool ->
  -- | 'planUsageType'
  PlanUsageType' ->
  Plan
mkPlan :: Bool
-> PlanBillingScheme'
-> Int
-> Text
-> Text
-> PlanInterval'
-> Int
-> Bool
-> PlanUsageType'
-> Plan
mkPlan Bool
planActive PlanBillingScheme'
planBillingScheme Int
planCreated Text
planCurrency Text
planId PlanInterval'
planInterval Int
planIntervalCount Bool
planLivemode PlanUsageType'
planUsageType =
  Plan :: Bool
-> Maybe PlanAggregateUsage'
-> Maybe Int
-> Maybe Text
-> PlanBillingScheme'
-> Int
-> Text
-> Text
-> PlanInterval'
-> Int
-> Bool
-> Maybe Object
-> Maybe Text
-> Maybe PlanProduct'Variants
-> Maybe [PlanTier]
-> Maybe PlanTiersMode'
-> Maybe PlanTransformUsage'
-> Maybe Int
-> PlanUsageType'
-> Plan
Plan
    { planActive :: Bool
planActive = Bool
planActive,
      planAggregateUsage :: Maybe PlanAggregateUsage'
planAggregateUsage = Maybe PlanAggregateUsage'
forall a. Maybe a
GHC.Maybe.Nothing,
      planAmount :: Maybe Int
planAmount = Maybe Int
forall a. Maybe a
GHC.Maybe.Nothing,
      planAmountDecimal :: Maybe Text
planAmountDecimal = Maybe Text
forall a. Maybe a
GHC.Maybe.Nothing,
      planBillingScheme :: PlanBillingScheme'
planBillingScheme = PlanBillingScheme'
planBillingScheme,
      planCreated :: Int
planCreated = Int
planCreated,
      planCurrency :: Text
planCurrency = Text
planCurrency,
      planId :: Text
planId = Text
planId,
      planInterval :: PlanInterval'
planInterval = PlanInterval'
planInterval,
      planIntervalCount :: Int
planIntervalCount = Int
planIntervalCount,
      planLivemode :: Bool
planLivemode = Bool
planLivemode,
      planMetadata :: Maybe Object
planMetadata = Maybe Object
forall a. Maybe a
GHC.Maybe.Nothing,
      planNickname :: Maybe Text
planNickname = Maybe Text
forall a. Maybe a
GHC.Maybe.Nothing,
      planProduct :: Maybe PlanProduct'Variants
planProduct = Maybe PlanProduct'Variants
forall a. Maybe a
GHC.Maybe.Nothing,
      planTiers :: Maybe [PlanTier]
planTiers = Maybe [PlanTier]
forall a. Maybe a
GHC.Maybe.Nothing,
      planTiersMode :: Maybe PlanTiersMode'
planTiersMode = Maybe PlanTiersMode'
forall a. Maybe a
GHC.Maybe.Nothing,
      planTransformUsage :: Maybe PlanTransformUsage'
planTransformUsage = Maybe PlanTransformUsage'
forall a. Maybe a
GHC.Maybe.Nothing,
      planTrialPeriodDays :: Maybe Int
planTrialPeriodDays = Maybe Int
forall a. Maybe a
GHC.Maybe.Nothing,
      planUsageType :: PlanUsageType'
planUsageType = PlanUsageType'
planUsageType
    }

-- | Defines the enum schema located at @components.schemas.plan.properties.aggregate_usage@ in the specification.
--
-- Specifies a usage aggregation strategy for plans of \`usage_type=metered\`. Allowed values are \`sum\` for summing up all usage during a period, \`last_during_period\` for using the last usage record reported within a period, \`last_ever\` for using the last usage record ever (across period bounds) or \`max\` which uses the usage record with the maximum reported usage during a period. Defaults to \`sum\`.
data PlanAggregateUsage'
  = -- | This case is used if the value encountered during decoding does not match any of the provided cases in the specification.
    PlanAggregateUsage'Other Data.Aeson.Types.Internal.Value
  | -- | This constructor can be used to send values to the server which are not present in the specification yet.
    PlanAggregateUsage'Typed Data.Text.Internal.Text
  | -- | Represents the JSON value @"last_during_period"@
    PlanAggregateUsage'EnumLastDuringPeriod
  | -- | Represents the JSON value @"last_ever"@
    PlanAggregateUsage'EnumLastEver
  | -- | Represents the JSON value @"max"@
    PlanAggregateUsage'EnumMax
  | -- | Represents the JSON value @"sum"@
    PlanAggregateUsage'EnumSum
  deriving (Int -> PlanAggregateUsage' -> ShowS
[PlanAggregateUsage'] -> ShowS
PlanAggregateUsage' -> String
(Int -> PlanAggregateUsage' -> ShowS)
-> (PlanAggregateUsage' -> String)
-> ([PlanAggregateUsage'] -> ShowS)
-> Show PlanAggregateUsage'
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PlanAggregateUsage'] -> ShowS
$cshowList :: [PlanAggregateUsage'] -> ShowS
show :: PlanAggregateUsage' -> String
$cshow :: PlanAggregateUsage' -> String
showsPrec :: Int -> PlanAggregateUsage' -> ShowS
$cshowsPrec :: Int -> PlanAggregateUsage' -> ShowS
GHC.Show.Show, PlanAggregateUsage' -> PlanAggregateUsage' -> Bool
(PlanAggregateUsage' -> PlanAggregateUsage' -> Bool)
-> (PlanAggregateUsage' -> PlanAggregateUsage' -> Bool)
-> Eq PlanAggregateUsage'
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PlanAggregateUsage' -> PlanAggregateUsage' -> Bool
$c/= :: PlanAggregateUsage' -> PlanAggregateUsage' -> Bool
== :: PlanAggregateUsage' -> PlanAggregateUsage' -> Bool
$c== :: PlanAggregateUsage' -> PlanAggregateUsage' -> Bool
GHC.Classes.Eq)

instance Data.Aeson.Types.ToJSON.ToJSON PlanAggregateUsage' where
  toJSON :: PlanAggregateUsage' -> Value
toJSON (PlanAggregateUsage'Other Value
val) = Value
val
  toJSON (PlanAggregateUsage'Typed Text
val) = Text -> Value
forall a. ToJSON a => a -> Value
Data.Aeson.Types.ToJSON.toJSON Text
val
  toJSON (PlanAggregateUsage'
PlanAggregateUsage'EnumLastDuringPeriod) = Value
"last_during_period"
  toJSON (PlanAggregateUsage'
PlanAggregateUsage'EnumLastEver) = Value
"last_ever"
  toJSON (PlanAggregateUsage'
PlanAggregateUsage'EnumMax) = Value
"max"
  toJSON (PlanAggregateUsage'
PlanAggregateUsage'EnumSum) = Value
"sum"

instance Data.Aeson.Types.FromJSON.FromJSON PlanAggregateUsage' where
  parseJSON :: Value -> Parser PlanAggregateUsage'
parseJSON Value
val =
    PlanAggregateUsage' -> Parser PlanAggregateUsage'
forall (f :: * -> *) a. Applicative f => a -> f a
GHC.Base.pure
      ( if
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"last_during_period" -> PlanAggregateUsage'
PlanAggregateUsage'EnumLastDuringPeriod
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"last_ever" -> PlanAggregateUsage'
PlanAggregateUsage'EnumLastEver
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"max" -> PlanAggregateUsage'
PlanAggregateUsage'EnumMax
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"sum" -> PlanAggregateUsage'
PlanAggregateUsage'EnumSum
            | Bool
GHC.Base.otherwise -> Value -> PlanAggregateUsage'
PlanAggregateUsage'Other Value
val
      )

-- | Defines the enum schema located at @components.schemas.plan.properties.billing_scheme@ in the specification.
--
-- Describes how to compute the price per period. Either \`per_unit\` or \`tiered\`. \`per_unit\` indicates that the fixed amount (specified in \`amount\`) will be charged per unit in \`quantity\` (for plans with \`usage_type=licensed\`), or per unit of total usage (for plans with \`usage_type=metered\`). \`tiered\` indicates that the unit pricing will be computed using a tiering strategy as defined using the \`tiers\` and \`tiers_mode\` attributes.
data PlanBillingScheme'
  = -- | This case is used if the value encountered during decoding does not match any of the provided cases in the specification.
    PlanBillingScheme'Other Data.Aeson.Types.Internal.Value
  | -- | This constructor can be used to send values to the server which are not present in the specification yet.
    PlanBillingScheme'Typed Data.Text.Internal.Text
  | -- | Represents the JSON value @"per_unit"@
    PlanBillingScheme'EnumPerUnit
  | -- | Represents the JSON value @"tiered"@
    PlanBillingScheme'EnumTiered
  deriving (Int -> PlanBillingScheme' -> ShowS
[PlanBillingScheme'] -> ShowS
PlanBillingScheme' -> String
(Int -> PlanBillingScheme' -> ShowS)
-> (PlanBillingScheme' -> String)
-> ([PlanBillingScheme'] -> ShowS)
-> Show PlanBillingScheme'
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PlanBillingScheme'] -> ShowS
$cshowList :: [PlanBillingScheme'] -> ShowS
show :: PlanBillingScheme' -> String
$cshow :: PlanBillingScheme' -> String
showsPrec :: Int -> PlanBillingScheme' -> ShowS
$cshowsPrec :: Int -> PlanBillingScheme' -> ShowS
GHC.Show.Show, PlanBillingScheme' -> PlanBillingScheme' -> Bool
(PlanBillingScheme' -> PlanBillingScheme' -> Bool)
-> (PlanBillingScheme' -> PlanBillingScheme' -> Bool)
-> Eq PlanBillingScheme'
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PlanBillingScheme' -> PlanBillingScheme' -> Bool
$c/= :: PlanBillingScheme' -> PlanBillingScheme' -> Bool
== :: PlanBillingScheme' -> PlanBillingScheme' -> Bool
$c== :: PlanBillingScheme' -> PlanBillingScheme' -> Bool
GHC.Classes.Eq)

instance Data.Aeson.Types.ToJSON.ToJSON PlanBillingScheme' where
  toJSON :: PlanBillingScheme' -> Value
toJSON (PlanBillingScheme'Other Value
val) = Value
val
  toJSON (PlanBillingScheme'Typed Text
val) = Text -> Value
forall a. ToJSON a => a -> Value
Data.Aeson.Types.ToJSON.toJSON Text
val
  toJSON (PlanBillingScheme'
PlanBillingScheme'EnumPerUnit) = Value
"per_unit"
  toJSON (PlanBillingScheme'
PlanBillingScheme'EnumTiered) = Value
"tiered"

instance Data.Aeson.Types.FromJSON.FromJSON PlanBillingScheme' where
  parseJSON :: Value -> Parser PlanBillingScheme'
parseJSON Value
val =
    PlanBillingScheme' -> Parser PlanBillingScheme'
forall (f :: * -> *) a. Applicative f => a -> f a
GHC.Base.pure
      ( if
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"per_unit" -> PlanBillingScheme'
PlanBillingScheme'EnumPerUnit
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"tiered" -> PlanBillingScheme'
PlanBillingScheme'EnumTiered
            | Bool
GHC.Base.otherwise -> Value -> PlanBillingScheme'
PlanBillingScheme'Other Value
val
      )

-- | Defines the enum schema located at @components.schemas.plan.properties.interval@ in the specification.
--
-- The frequency at which a subscription is billed. One of \`day\`, \`week\`, \`month\` or \`year\`.
data PlanInterval'
  = -- | This case is used if the value encountered during decoding does not match any of the provided cases in the specification.
    PlanInterval'Other Data.Aeson.Types.Internal.Value
  | -- | This constructor can be used to send values to the server which are not present in the specification yet.
    PlanInterval'Typed Data.Text.Internal.Text
  | -- | Represents the JSON value @"day"@
    PlanInterval'EnumDay
  | -- | Represents the JSON value @"month"@
    PlanInterval'EnumMonth
  | -- | Represents the JSON value @"week"@
    PlanInterval'EnumWeek
  | -- | Represents the JSON value @"year"@
    PlanInterval'EnumYear
  deriving (Int -> PlanInterval' -> ShowS
[PlanInterval'] -> ShowS
PlanInterval' -> String
(Int -> PlanInterval' -> ShowS)
-> (PlanInterval' -> String)
-> ([PlanInterval'] -> ShowS)
-> Show PlanInterval'
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PlanInterval'] -> ShowS
$cshowList :: [PlanInterval'] -> ShowS
show :: PlanInterval' -> String
$cshow :: PlanInterval' -> String
showsPrec :: Int -> PlanInterval' -> ShowS
$cshowsPrec :: Int -> PlanInterval' -> ShowS
GHC.Show.Show, PlanInterval' -> PlanInterval' -> Bool
(PlanInterval' -> PlanInterval' -> Bool)
-> (PlanInterval' -> PlanInterval' -> Bool) -> Eq PlanInterval'
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PlanInterval' -> PlanInterval' -> Bool
$c/= :: PlanInterval' -> PlanInterval' -> Bool
== :: PlanInterval' -> PlanInterval' -> Bool
$c== :: PlanInterval' -> PlanInterval' -> Bool
GHC.Classes.Eq)

instance Data.Aeson.Types.ToJSON.ToJSON PlanInterval' where
  toJSON :: PlanInterval' -> Value
toJSON (PlanInterval'Other Value
val) = Value
val
  toJSON (PlanInterval'Typed Text
val) = Text -> Value
forall a. ToJSON a => a -> Value
Data.Aeson.Types.ToJSON.toJSON Text
val
  toJSON (PlanInterval'
PlanInterval'EnumDay) = Value
"day"
  toJSON (PlanInterval'
PlanInterval'EnumMonth) = Value
"month"
  toJSON (PlanInterval'
PlanInterval'EnumWeek) = Value
"week"
  toJSON (PlanInterval'
PlanInterval'EnumYear) = Value
"year"

instance Data.Aeson.Types.FromJSON.FromJSON PlanInterval' where
  parseJSON :: Value -> Parser PlanInterval'
parseJSON Value
val =
    PlanInterval' -> Parser PlanInterval'
forall (f :: * -> *) a. Applicative f => a -> f a
GHC.Base.pure
      ( if
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"day" -> PlanInterval'
PlanInterval'EnumDay
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"month" -> PlanInterval'
PlanInterval'EnumMonth
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"week" -> PlanInterval'
PlanInterval'EnumWeek
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"year" -> PlanInterval'
PlanInterval'EnumYear
            | Bool
GHC.Base.otherwise -> Value -> PlanInterval'
PlanInterval'Other Value
val
      )

-- | Defines the oneOf schema located at @components.schemas.plan.properties.product.anyOf@ in the specification.
--
-- The product whose pricing this plan determines.
data PlanProduct'Variants
  = PlanProduct'Text Data.Text.Internal.Text
  | PlanProduct'Product Product
  | PlanProduct'DeletedProduct DeletedProduct
  deriving (Int -> PlanProduct'Variants -> ShowS
[PlanProduct'Variants] -> ShowS
PlanProduct'Variants -> String
(Int -> PlanProduct'Variants -> ShowS)
-> (PlanProduct'Variants -> String)
-> ([PlanProduct'Variants] -> ShowS)
-> Show PlanProduct'Variants
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PlanProduct'Variants] -> ShowS
$cshowList :: [PlanProduct'Variants] -> ShowS
show :: PlanProduct'Variants -> String
$cshow :: PlanProduct'Variants -> String
showsPrec :: Int -> PlanProduct'Variants -> ShowS
$cshowsPrec :: Int -> PlanProduct'Variants -> ShowS
GHC.Show.Show, PlanProduct'Variants -> PlanProduct'Variants -> Bool
(PlanProduct'Variants -> PlanProduct'Variants -> Bool)
-> (PlanProduct'Variants -> PlanProduct'Variants -> Bool)
-> Eq PlanProduct'Variants
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PlanProduct'Variants -> PlanProduct'Variants -> Bool
$c/= :: PlanProduct'Variants -> PlanProduct'Variants -> Bool
== :: PlanProduct'Variants -> PlanProduct'Variants -> Bool
$c== :: PlanProduct'Variants -> PlanProduct'Variants -> Bool
GHC.Classes.Eq)

instance Data.Aeson.Types.ToJSON.ToJSON PlanProduct'Variants where
  toJSON :: PlanProduct'Variants -> Value
toJSON (PlanProduct'Text Text
a) = Text -> Value
forall a. ToJSON a => a -> Value
Data.Aeson.Types.ToJSON.toJSON Text
a
  toJSON (PlanProduct'Product Product
a) = Product -> Value
forall a. ToJSON a => a -> Value
Data.Aeson.Types.ToJSON.toJSON Product
a
  toJSON (PlanProduct'DeletedProduct DeletedProduct
a) = DeletedProduct -> Value
forall a. ToJSON a => a -> Value
Data.Aeson.Types.ToJSON.toJSON DeletedProduct
a

instance Data.Aeson.Types.FromJSON.FromJSON PlanProduct'Variants where
  parseJSON :: Value -> Parser PlanProduct'Variants
parseJSON Value
val = case (Text -> PlanProduct'Variants
PlanProduct'Text (Text -> PlanProduct'Variants)
-> Result Text -> Result PlanProduct'Variants
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Data.Functor.<$> Value -> Result Text
forall a. FromJSON a => Value -> Result a
Data.Aeson.Types.FromJSON.fromJSON Value
val) Result PlanProduct'Variants
-> Result PlanProduct'Variants -> Result PlanProduct'Variants
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
GHC.Base.<|> ((Product -> PlanProduct'Variants
PlanProduct'Product (Product -> PlanProduct'Variants)
-> Result Product -> Result PlanProduct'Variants
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Data.Functor.<$> Value -> Result Product
forall a. FromJSON a => Value -> Result a
Data.Aeson.Types.FromJSON.fromJSON Value
val) Result PlanProduct'Variants
-> Result PlanProduct'Variants -> Result PlanProduct'Variants
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
GHC.Base.<|> ((DeletedProduct -> PlanProduct'Variants
PlanProduct'DeletedProduct (DeletedProduct -> PlanProduct'Variants)
-> Result DeletedProduct -> Result PlanProduct'Variants
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Data.Functor.<$> Value -> Result DeletedProduct
forall a. FromJSON a => Value -> Result a
Data.Aeson.Types.FromJSON.fromJSON Value
val) Result PlanProduct'Variants
-> Result PlanProduct'Variants -> Result PlanProduct'Variants
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
GHC.Base.<|> String -> Result PlanProduct'Variants
forall a. String -> Result a
Data.Aeson.Types.Internal.Error String
"No variant matched")) of
    Data.Aeson.Types.Internal.Success PlanProduct'Variants
a -> PlanProduct'Variants -> Parser PlanProduct'Variants
forall (f :: * -> *) a. Applicative f => a -> f a
GHC.Base.pure PlanProduct'Variants
a
    Data.Aeson.Types.Internal.Error String
a -> String -> Parser PlanProduct'Variants
forall (m :: * -> *) a. MonadFail m => String -> m a
Control.Monad.Fail.fail String
a

-- | Defines the enum schema located at @components.schemas.plan.properties.tiers_mode@ in the specification.
--
-- Defines if the tiering price should be \`graduated\` or \`volume\` based. In \`volume\`-based tiering, the maximum quantity within a period determines the per unit price. In \`graduated\` tiering, pricing can change as the quantity grows.
data PlanTiersMode'
  = -- | This case is used if the value encountered during decoding does not match any of the provided cases in the specification.
    PlanTiersMode'Other Data.Aeson.Types.Internal.Value
  | -- | This constructor can be used to send values to the server which are not present in the specification yet.
    PlanTiersMode'Typed Data.Text.Internal.Text
  | -- | Represents the JSON value @"graduated"@
    PlanTiersMode'EnumGraduated
  | -- | Represents the JSON value @"volume"@
    PlanTiersMode'EnumVolume
  deriving (Int -> PlanTiersMode' -> ShowS
[PlanTiersMode'] -> ShowS
PlanTiersMode' -> String
(Int -> PlanTiersMode' -> ShowS)
-> (PlanTiersMode' -> String)
-> ([PlanTiersMode'] -> ShowS)
-> Show PlanTiersMode'
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PlanTiersMode'] -> ShowS
$cshowList :: [PlanTiersMode'] -> ShowS
show :: PlanTiersMode' -> String
$cshow :: PlanTiersMode' -> String
showsPrec :: Int -> PlanTiersMode' -> ShowS
$cshowsPrec :: Int -> PlanTiersMode' -> ShowS
GHC.Show.Show, PlanTiersMode' -> PlanTiersMode' -> Bool
(PlanTiersMode' -> PlanTiersMode' -> Bool)
-> (PlanTiersMode' -> PlanTiersMode' -> Bool) -> Eq PlanTiersMode'
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PlanTiersMode' -> PlanTiersMode' -> Bool
$c/= :: PlanTiersMode' -> PlanTiersMode' -> Bool
== :: PlanTiersMode' -> PlanTiersMode' -> Bool
$c== :: PlanTiersMode' -> PlanTiersMode' -> Bool
GHC.Classes.Eq)

instance Data.Aeson.Types.ToJSON.ToJSON PlanTiersMode' where
  toJSON :: PlanTiersMode' -> Value
toJSON (PlanTiersMode'Other Value
val) = Value
val
  toJSON (PlanTiersMode'Typed Text
val) = Text -> Value
forall a. ToJSON a => a -> Value
Data.Aeson.Types.ToJSON.toJSON Text
val
  toJSON (PlanTiersMode'
PlanTiersMode'EnumGraduated) = Value
"graduated"
  toJSON (PlanTiersMode'
PlanTiersMode'EnumVolume) = Value
"volume"

instance Data.Aeson.Types.FromJSON.FromJSON PlanTiersMode' where
  parseJSON :: Value -> Parser PlanTiersMode'
parseJSON Value
val =
    PlanTiersMode' -> Parser PlanTiersMode'
forall (f :: * -> *) a. Applicative f => a -> f a
GHC.Base.pure
      ( if
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"graduated" -> PlanTiersMode'
PlanTiersMode'EnumGraduated
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"volume" -> PlanTiersMode'
PlanTiersMode'EnumVolume
            | Bool
GHC.Base.otherwise -> Value -> PlanTiersMode'
PlanTiersMode'Other Value
val
      )

-- | Defines the object schema located at @components.schemas.plan.properties.transform_usage.anyOf@ in the specification.
--
-- Apply a transformation to the reported usage or set quantity before computing the amount billed. Cannot be combined with \\\`tiers\\\`.
data PlanTransformUsage' = PlanTransformUsage'
  { -- | divide_by: Divide usage by this number.
    PlanTransformUsage' -> Maybe Int
planTransformUsage'DivideBy :: (GHC.Maybe.Maybe GHC.Types.Int),
    -- | round: After division, either round the result \`up\` or \`down\`.
    PlanTransformUsage' -> Maybe PlanTransformUsage'Round'
planTransformUsage'Round :: (GHC.Maybe.Maybe PlanTransformUsage'Round')
  }
  deriving
    ( Int -> PlanTransformUsage' -> ShowS
[PlanTransformUsage'] -> ShowS
PlanTransformUsage' -> String
(Int -> PlanTransformUsage' -> ShowS)
-> (PlanTransformUsage' -> String)
-> ([PlanTransformUsage'] -> ShowS)
-> Show PlanTransformUsage'
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PlanTransformUsage'] -> ShowS
$cshowList :: [PlanTransformUsage'] -> ShowS
show :: PlanTransformUsage' -> String
$cshow :: PlanTransformUsage' -> String
showsPrec :: Int -> PlanTransformUsage' -> ShowS
$cshowsPrec :: Int -> PlanTransformUsage' -> ShowS
GHC.Show.Show,
      PlanTransformUsage' -> PlanTransformUsage' -> Bool
(PlanTransformUsage' -> PlanTransformUsage' -> Bool)
-> (PlanTransformUsage' -> PlanTransformUsage' -> Bool)
-> Eq PlanTransformUsage'
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PlanTransformUsage' -> PlanTransformUsage' -> Bool
$c/= :: PlanTransformUsage' -> PlanTransformUsage' -> Bool
== :: PlanTransformUsage' -> PlanTransformUsage' -> Bool
$c== :: PlanTransformUsage' -> PlanTransformUsage' -> Bool
GHC.Classes.Eq
    )

instance Data.Aeson.Types.ToJSON.ToJSON PlanTransformUsage' where
  toJSON :: PlanTransformUsage' -> Value
toJSON PlanTransformUsage'
obj = [Pair] -> Value
Data.Aeson.Types.Internal.object (Text
"divide_by" Text -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= PlanTransformUsage' -> Maybe Int
planTransformUsage'DivideBy PlanTransformUsage'
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"round" Text -> Maybe PlanTransformUsage'Round' -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= PlanTransformUsage' -> Maybe PlanTransformUsage'Round'
planTransformUsage'Round PlanTransformUsage'
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: [Pair]
forall a. Monoid a => a
GHC.Base.mempty)
  toEncoding :: PlanTransformUsage' -> Encoding
toEncoding PlanTransformUsage'
obj = Series -> Encoding
Data.Aeson.Encoding.Internal.pairs ((Text
"divide_by" Text -> Maybe Int -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= PlanTransformUsage' -> Maybe Int
planTransformUsage'DivideBy PlanTransformUsage'
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> (Text
"round" Text -> Maybe PlanTransformUsage'Round' -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= PlanTransformUsage' -> Maybe PlanTransformUsage'Round'
planTransformUsage'Round PlanTransformUsage'
obj))

instance Data.Aeson.Types.FromJSON.FromJSON PlanTransformUsage' where
  parseJSON :: Value -> Parser PlanTransformUsage'
parseJSON = String
-> (Object -> Parser PlanTransformUsage')
-> Value
-> Parser PlanTransformUsage'
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.Aeson.Types.FromJSON.withObject String
"PlanTransformUsage'" (\Object
obj -> ((Maybe Int
 -> Maybe PlanTransformUsage'Round' -> PlanTransformUsage')
-> Parser
     (Maybe Int
      -> Maybe PlanTransformUsage'Round' -> PlanTransformUsage')
forall (f :: * -> *) a. Applicative f => a -> f a
GHC.Base.pure Maybe Int -> Maybe PlanTransformUsage'Round' -> PlanTransformUsage'
PlanTransformUsage' Parser
  (Maybe Int
   -> Maybe PlanTransformUsage'Round' -> PlanTransformUsage')
-> Parser (Maybe Int)
-> Parser (Maybe PlanTransformUsage'Round' -> PlanTransformUsage')
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe Int)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"divide_by")) Parser (Maybe PlanTransformUsage'Round' -> PlanTransformUsage')
-> Parser (Maybe PlanTransformUsage'Round')
-> Parser PlanTransformUsage'
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser (Maybe PlanTransformUsage'Round')
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"round"))

-- | Create a new 'PlanTransformUsage'' with all required fields.
mkPlanTransformUsage' :: PlanTransformUsage'
mkPlanTransformUsage' :: PlanTransformUsage'
mkPlanTransformUsage' =
  PlanTransformUsage' :: Maybe Int -> Maybe PlanTransformUsage'Round' -> PlanTransformUsage'
PlanTransformUsage'
    { planTransformUsage'DivideBy :: Maybe Int
planTransformUsage'DivideBy = Maybe Int
forall a. Maybe a
GHC.Maybe.Nothing,
      planTransformUsage'Round :: Maybe PlanTransformUsage'Round'
planTransformUsage'Round = Maybe PlanTransformUsage'Round'
forall a. Maybe a
GHC.Maybe.Nothing
    }

-- | Defines the enum schema located at @components.schemas.plan.properties.transform_usage.anyOf.properties.round@ in the specification.
--
-- After division, either round the result \`up\` or \`down\`.
data PlanTransformUsage'Round'
  = -- | This case is used if the value encountered during decoding does not match any of the provided cases in the specification.
    PlanTransformUsage'Round'Other Data.Aeson.Types.Internal.Value
  | -- | This constructor can be used to send values to the server which are not present in the specification yet.
    PlanTransformUsage'Round'Typed Data.Text.Internal.Text
  | -- | Represents the JSON value @"down"@
    PlanTransformUsage'Round'EnumDown
  | -- | Represents the JSON value @"up"@
    PlanTransformUsage'Round'EnumUp
  deriving (Int -> PlanTransformUsage'Round' -> ShowS
[PlanTransformUsage'Round'] -> ShowS
PlanTransformUsage'Round' -> String
(Int -> PlanTransformUsage'Round' -> ShowS)
-> (PlanTransformUsage'Round' -> String)
-> ([PlanTransformUsage'Round'] -> ShowS)
-> Show PlanTransformUsage'Round'
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PlanTransformUsage'Round'] -> ShowS
$cshowList :: [PlanTransformUsage'Round'] -> ShowS
show :: PlanTransformUsage'Round' -> String
$cshow :: PlanTransformUsage'Round' -> String
showsPrec :: Int -> PlanTransformUsage'Round' -> ShowS
$cshowsPrec :: Int -> PlanTransformUsage'Round' -> ShowS
GHC.Show.Show, PlanTransformUsage'Round' -> PlanTransformUsage'Round' -> Bool
(PlanTransformUsage'Round' -> PlanTransformUsage'Round' -> Bool)
-> (PlanTransformUsage'Round' -> PlanTransformUsage'Round' -> Bool)
-> Eq PlanTransformUsage'Round'
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PlanTransformUsage'Round' -> PlanTransformUsage'Round' -> Bool
$c/= :: PlanTransformUsage'Round' -> PlanTransformUsage'Round' -> Bool
== :: PlanTransformUsage'Round' -> PlanTransformUsage'Round' -> Bool
$c== :: PlanTransformUsage'Round' -> PlanTransformUsage'Round' -> Bool
GHC.Classes.Eq)

instance Data.Aeson.Types.ToJSON.ToJSON PlanTransformUsage'Round' where
  toJSON :: PlanTransformUsage'Round' -> Value
toJSON (PlanTransformUsage'Round'Other Value
val) = Value
val
  toJSON (PlanTransformUsage'Round'Typed Text
val) = Text -> Value
forall a. ToJSON a => a -> Value
Data.Aeson.Types.ToJSON.toJSON Text
val
  toJSON (PlanTransformUsage'Round'
PlanTransformUsage'Round'EnumDown) = Value
"down"
  toJSON (PlanTransformUsage'Round'
PlanTransformUsage'Round'EnumUp) = Value
"up"

instance Data.Aeson.Types.FromJSON.FromJSON PlanTransformUsage'Round' where
  parseJSON :: Value -> Parser PlanTransformUsage'Round'
parseJSON Value
val =
    PlanTransformUsage'Round' -> Parser PlanTransformUsage'Round'
forall (f :: * -> *) a. Applicative f => a -> f a
GHC.Base.pure
      ( if
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"down" -> PlanTransformUsage'Round'
PlanTransformUsage'Round'EnumDown
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"up" -> PlanTransformUsage'Round'
PlanTransformUsage'Round'EnumUp
            | Bool
GHC.Base.otherwise -> Value -> PlanTransformUsage'Round'
PlanTransformUsage'Round'Other Value
val
      )

-- | Defines the enum schema located at @components.schemas.plan.properties.usage_type@ in the specification.
--
-- Configures how the quantity per period should be determined. Can be either \`metered\` or \`licensed\`. \`licensed\` automatically bills the \`quantity\` set when adding it to a subscription. \`metered\` aggregates the total usage based on usage records. Defaults to \`licensed\`.
data PlanUsageType'
  = -- | This case is used if the value encountered during decoding does not match any of the provided cases in the specification.
    PlanUsageType'Other Data.Aeson.Types.Internal.Value
  | -- | This constructor can be used to send values to the server which are not present in the specification yet.
    PlanUsageType'Typed Data.Text.Internal.Text
  | -- | Represents the JSON value @"licensed"@
    PlanUsageType'EnumLicensed
  | -- | Represents the JSON value @"metered"@
    PlanUsageType'EnumMetered
  deriving (Int -> PlanUsageType' -> ShowS
[PlanUsageType'] -> ShowS
PlanUsageType' -> String
(Int -> PlanUsageType' -> ShowS)
-> (PlanUsageType' -> String)
-> ([PlanUsageType'] -> ShowS)
-> Show PlanUsageType'
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PlanUsageType'] -> ShowS
$cshowList :: [PlanUsageType'] -> ShowS
show :: PlanUsageType' -> String
$cshow :: PlanUsageType' -> String
showsPrec :: Int -> PlanUsageType' -> ShowS
$cshowsPrec :: Int -> PlanUsageType' -> ShowS
GHC.Show.Show, PlanUsageType' -> PlanUsageType' -> Bool
(PlanUsageType' -> PlanUsageType' -> Bool)
-> (PlanUsageType' -> PlanUsageType' -> Bool) -> Eq PlanUsageType'
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PlanUsageType' -> PlanUsageType' -> Bool
$c/= :: PlanUsageType' -> PlanUsageType' -> Bool
== :: PlanUsageType' -> PlanUsageType' -> Bool
$c== :: PlanUsageType' -> PlanUsageType' -> Bool
GHC.Classes.Eq)

instance Data.Aeson.Types.ToJSON.ToJSON PlanUsageType' where
  toJSON :: PlanUsageType' -> Value
toJSON (PlanUsageType'Other Value
val) = Value
val
  toJSON (PlanUsageType'Typed Text
val) = Text -> Value
forall a. ToJSON a => a -> Value
Data.Aeson.Types.ToJSON.toJSON Text
val
  toJSON (PlanUsageType'
PlanUsageType'EnumLicensed) = Value
"licensed"
  toJSON (PlanUsageType'
PlanUsageType'EnumMetered) = Value
"metered"

instance Data.Aeson.Types.FromJSON.FromJSON PlanUsageType' where
  parseJSON :: Value -> Parser PlanUsageType'
parseJSON Value
val =
    PlanUsageType' -> Parser PlanUsageType'
forall (f :: * -> *) a. Applicative f => a -> f a
GHC.Base.pure
      ( if
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"licensed" -> PlanUsageType'
PlanUsageType'EnumLicensed
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"metered" -> PlanUsageType'
PlanUsageType'EnumMetered
            | Bool
GHC.Base.otherwise -> Value -> PlanUsageType'
PlanUsageType'Other Value
val
      )