{-# 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 CustomerBalanceTransaction
module StripeAPI.Types.CustomerBalanceTransaction 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.CreditNote
import {-# SOURCE #-} StripeAPI.Types.Customer
import {-# SOURCE #-} StripeAPI.Types.Invoice
import qualified Prelude as GHC.Integer.Type
import qualified Prelude as GHC.Maybe

-- | Defines the object schema located at @components.schemas.customer_balance_transaction@ in the specification.
--
-- Each customer has a [\`balance\`](https:\/\/stripe.com\/docs\/api\/customers\/object\#customer_object-balance) value,
-- which denotes a debit or credit that\'s automatically applied to their next invoice upon finalization.
-- You may modify the value directly by using the [update customer API](https:\/\/stripe.com\/docs\/api\/customers\/update),
-- or by creating a Customer Balance Transaction, which increments or decrements the customer\'s \`balance\` by the specified \`amount\`.
--
-- Related guide: [Customer Balance](https:\/\/stripe.com\/docs\/billing\/customer\/balance) to learn more.
data CustomerBalanceTransaction = CustomerBalanceTransaction
  { -- | amount: The amount of the transaction. A negative value is a credit for the customer\'s balance, and a positive value is a debit to the customer\'s \`balance\`.
    CustomerBalanceTransaction -> Int
customerBalanceTransactionAmount :: GHC.Types.Int,
    -- | created: Time at which the object was created. Measured in seconds since the Unix epoch.
    CustomerBalanceTransaction -> Int
customerBalanceTransactionCreated :: GHC.Types.Int,
    -- | credit_note: The ID of the credit note (if any) related to the transaction.
    CustomerBalanceTransaction
-> Maybe CustomerBalanceTransactionCreditNote'Variants
customerBalanceTransactionCreditNote :: (GHC.Maybe.Maybe CustomerBalanceTransactionCreditNote'Variants),
    -- | 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).
    CustomerBalanceTransaction -> Text
customerBalanceTransactionCurrency :: Data.Text.Internal.Text,
    -- | customer: The ID of the customer the transaction belongs to.
    CustomerBalanceTransaction
-> CustomerBalanceTransactionCustomer'Variants
customerBalanceTransactionCustomer :: CustomerBalanceTransactionCustomer'Variants,
    -- | description: An arbitrary string attached to the object. Often useful for displaying to users.
    --
    -- Constraints:
    --
    -- * Maximum length of 5000
    CustomerBalanceTransaction -> Maybe Text
customerBalanceTransactionDescription :: (GHC.Maybe.Maybe Data.Text.Internal.Text),
    -- | ending_balance: The customer\'s \`balance\` after the transaction was applied. A negative value decreases the amount due on the customer\'s next invoice. A positive value increases the amount due on the customer\'s next invoice.
    CustomerBalanceTransaction -> Int
customerBalanceTransactionEndingBalance :: GHC.Types.Int,
    -- | id: Unique identifier for the object.
    --
    -- Constraints:
    --
    -- * Maximum length of 5000
    CustomerBalanceTransaction -> Text
customerBalanceTransactionId :: Data.Text.Internal.Text,
    -- | invoice: The ID of the invoice (if any) related to the transaction.
    CustomerBalanceTransaction
-> Maybe CustomerBalanceTransactionInvoice'Variants
customerBalanceTransactionInvoice :: (GHC.Maybe.Maybe CustomerBalanceTransactionInvoice'Variants),
    -- | livemode: Has the value \`true\` if the object exists in live mode or the value \`false\` if the object exists in test mode.
    CustomerBalanceTransaction -> Bool
customerBalanceTransactionLivemode :: 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.
    CustomerBalanceTransaction -> Maybe Object
customerBalanceTransactionMetadata :: (GHC.Maybe.Maybe Data.Aeson.Types.Internal.Object),
    -- | type: Transaction type: \`adjustment\`, \`applied_to_invoice\`, \`credit_note\`, \`initial\`, \`invoice_too_large\`, \`invoice_too_small\`, \`unspent_receiver_credit\`, or \`unapplied_from_invoice\`. See the [Customer Balance page](https:\/\/stripe.com\/docs\/billing\/customer\/balance\#types) to learn more about transaction types.
    CustomerBalanceTransaction -> CustomerBalanceTransactionType'
customerBalanceTransactionType :: CustomerBalanceTransactionType'
  }
  deriving
    ( Int -> CustomerBalanceTransaction -> ShowS
[CustomerBalanceTransaction] -> ShowS
CustomerBalanceTransaction -> String
(Int -> CustomerBalanceTransaction -> ShowS)
-> (CustomerBalanceTransaction -> String)
-> ([CustomerBalanceTransaction] -> ShowS)
-> Show CustomerBalanceTransaction
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CustomerBalanceTransaction] -> ShowS
$cshowList :: [CustomerBalanceTransaction] -> ShowS
show :: CustomerBalanceTransaction -> String
$cshow :: CustomerBalanceTransaction -> String
showsPrec :: Int -> CustomerBalanceTransaction -> ShowS
$cshowsPrec :: Int -> CustomerBalanceTransaction -> ShowS
GHC.Show.Show,
      CustomerBalanceTransaction -> CustomerBalanceTransaction -> Bool
(CustomerBalanceTransaction -> CustomerBalanceTransaction -> Bool)
-> (CustomerBalanceTransaction
    -> CustomerBalanceTransaction -> Bool)
-> Eq CustomerBalanceTransaction
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CustomerBalanceTransaction -> CustomerBalanceTransaction -> Bool
$c/= :: CustomerBalanceTransaction -> CustomerBalanceTransaction -> Bool
== :: CustomerBalanceTransaction -> CustomerBalanceTransaction -> Bool
$c== :: CustomerBalanceTransaction -> CustomerBalanceTransaction -> Bool
GHC.Classes.Eq
    )

instance Data.Aeson.Types.ToJSON.ToJSON CustomerBalanceTransaction where
  toJSON :: CustomerBalanceTransaction -> Value
toJSON CustomerBalanceTransaction
obj = [Pair] -> Value
Data.Aeson.Types.Internal.object (Text
"amount" Text -> Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction -> Int
customerBalanceTransactionAmount CustomerBalanceTransaction
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..= CustomerBalanceTransaction -> Int
customerBalanceTransactionCreated CustomerBalanceTransaction
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"credit_note" Text -> Maybe CustomerBalanceTransactionCreditNote'Variants -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction
-> Maybe CustomerBalanceTransactionCreditNote'Variants
customerBalanceTransactionCreditNote CustomerBalanceTransaction
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..= CustomerBalanceTransaction -> Text
customerBalanceTransactionCurrency CustomerBalanceTransaction
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"customer" Text -> CustomerBalanceTransactionCustomer'Variants -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction
-> CustomerBalanceTransactionCustomer'Variants
customerBalanceTransactionCustomer CustomerBalanceTransaction
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"description" Text -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction -> Maybe Text
customerBalanceTransactionDescription CustomerBalanceTransaction
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"ending_balance" Text -> Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction -> Int
customerBalanceTransactionEndingBalance CustomerBalanceTransaction
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..= CustomerBalanceTransaction -> Text
customerBalanceTransactionId CustomerBalanceTransaction
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"invoice" Text -> Maybe CustomerBalanceTransactionInvoice'Variants -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction
-> Maybe CustomerBalanceTransactionInvoice'Variants
customerBalanceTransactionInvoice CustomerBalanceTransaction
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..= CustomerBalanceTransaction -> Bool
customerBalanceTransactionLivemode CustomerBalanceTransaction
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..= CustomerBalanceTransaction -> Maybe Object
customerBalanceTransactionMetadata CustomerBalanceTransaction
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"type" Text -> CustomerBalanceTransactionType' -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction -> CustomerBalanceTransactionType'
customerBalanceTransactionType CustomerBalanceTransaction
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
"customer_balance_transaction" Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: [Pair]
forall a. Monoid a => a
GHC.Base.mempty)
  toEncoding :: CustomerBalanceTransaction -> Encoding
toEncoding CustomerBalanceTransaction
obj = Series -> Encoding
Data.Aeson.Encoding.Internal.pairs ((Text
"amount" Text -> Int -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction -> Int
customerBalanceTransactionAmount CustomerBalanceTransaction
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..= CustomerBalanceTransaction -> Int
customerBalanceTransactionCreated CustomerBalanceTransaction
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"credit_note" Text
-> Maybe CustomerBalanceTransactionCreditNote'Variants -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction
-> Maybe CustomerBalanceTransactionCreditNote'Variants
customerBalanceTransactionCreditNote CustomerBalanceTransaction
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..= CustomerBalanceTransaction -> Text
customerBalanceTransactionCurrency CustomerBalanceTransaction
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"customer" Text -> CustomerBalanceTransactionCustomer'Variants -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction
-> CustomerBalanceTransactionCustomer'Variants
customerBalanceTransactionCustomer CustomerBalanceTransaction
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"description" Text -> Maybe Text -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction -> Maybe Text
customerBalanceTransactionDescription CustomerBalanceTransaction
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"ending_balance" Text -> Int -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction -> Int
customerBalanceTransactionEndingBalance CustomerBalanceTransaction
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..= CustomerBalanceTransaction -> Text
customerBalanceTransactionId CustomerBalanceTransaction
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"invoice" Text -> Maybe CustomerBalanceTransactionInvoice'Variants -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction
-> Maybe CustomerBalanceTransactionInvoice'Variants
customerBalanceTransactionInvoice CustomerBalanceTransaction
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..= CustomerBalanceTransaction -> Bool
customerBalanceTransactionLivemode CustomerBalanceTransaction
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..= CustomerBalanceTransaction -> Maybe Object
customerBalanceTransactionMetadata CustomerBalanceTransaction
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> ((Text
"type" Text -> CustomerBalanceTransactionType' -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= CustomerBalanceTransaction -> CustomerBalanceTransactionType'
customerBalanceTransactionType CustomerBalanceTransaction
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
"customer_balance_transaction")))))))))))))

instance Data.Aeson.Types.FromJSON.FromJSON CustomerBalanceTransaction where
  parseJSON :: Value -> Parser CustomerBalanceTransaction
parseJSON = String
-> (Object -> Parser CustomerBalanceTransaction)
-> Value
-> Parser CustomerBalanceTransaction
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.Aeson.Types.FromJSON.withObject String
"CustomerBalanceTransaction" (\Object
obj -> ((((((((((((Int
 -> Int
 -> Maybe CustomerBalanceTransactionCreditNote'Variants
 -> Text
 -> CustomerBalanceTransactionCustomer'Variants
 -> Maybe Text
 -> Int
 -> Text
 -> Maybe CustomerBalanceTransactionInvoice'Variants
 -> Bool
 -> Maybe Object
 -> CustomerBalanceTransactionType'
 -> CustomerBalanceTransaction)
-> Parser
     (Int
      -> Int
      -> Maybe CustomerBalanceTransactionCreditNote'Variants
      -> Text
      -> CustomerBalanceTransactionCustomer'Variants
      -> Maybe Text
      -> Int
      -> Text
      -> Maybe CustomerBalanceTransactionInvoice'Variants
      -> Bool
      -> Maybe Object
      -> CustomerBalanceTransactionType'
      -> CustomerBalanceTransaction)
forall (f :: * -> *) a. Applicative f => a -> f a
GHC.Base.pure Int
-> Int
-> Maybe CustomerBalanceTransactionCreditNote'Variants
-> Text
-> CustomerBalanceTransactionCustomer'Variants
-> Maybe Text
-> Int
-> Text
-> Maybe CustomerBalanceTransactionInvoice'Variants
-> Bool
-> Maybe Object
-> CustomerBalanceTransactionType'
-> CustomerBalanceTransaction
CustomerBalanceTransaction Parser
  (Int
   -> Int
   -> Maybe CustomerBalanceTransactionCreditNote'Variants
   -> Text
   -> CustomerBalanceTransactionCustomer'Variants
   -> Maybe Text
   -> Int
   -> Text
   -> Maybe CustomerBalanceTransactionInvoice'Variants
   -> Bool
   -> Maybe Object
   -> CustomerBalanceTransactionType'
   -> CustomerBalanceTransaction)
-> Parser Int
-> Parser
     (Int
      -> Maybe CustomerBalanceTransactionCreditNote'Variants
      -> Text
      -> CustomerBalanceTransactionCustomer'Variants
      -> Maybe Text
      -> Int
      -> Text
      -> Maybe CustomerBalanceTransactionInvoice'Variants
      -> Bool
      -> Maybe Object
      -> CustomerBalanceTransactionType'
      -> CustomerBalanceTransaction)
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
"amount")) Parser
  (Int
   -> Maybe CustomerBalanceTransactionCreditNote'Variants
   -> Text
   -> CustomerBalanceTransactionCustomer'Variants
   -> Maybe Text
   -> Int
   -> Text
   -> Maybe CustomerBalanceTransactionInvoice'Variants
   -> Bool
   -> Maybe Object
   -> CustomerBalanceTransactionType'
   -> CustomerBalanceTransaction)
-> Parser Int
-> Parser
     (Maybe CustomerBalanceTransactionCreditNote'Variants
      -> Text
      -> CustomerBalanceTransactionCustomer'Variants
      -> Maybe Text
      -> Int
      -> Text
      -> Maybe CustomerBalanceTransactionInvoice'Variants
      -> Bool
      -> Maybe Object
      -> CustomerBalanceTransactionType'
      -> CustomerBalanceTransaction)
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
  (Maybe CustomerBalanceTransactionCreditNote'Variants
   -> Text
   -> CustomerBalanceTransactionCustomer'Variants
   -> Maybe Text
   -> Int
   -> Text
   -> Maybe CustomerBalanceTransactionInvoice'Variants
   -> Bool
   -> Maybe Object
   -> CustomerBalanceTransactionType'
   -> CustomerBalanceTransaction)
-> Parser (Maybe CustomerBalanceTransactionCreditNote'Variants)
-> Parser
     (Text
      -> CustomerBalanceTransactionCustomer'Variants
      -> Maybe Text
      -> Int
      -> Text
      -> Maybe CustomerBalanceTransactionInvoice'Variants
      -> Bool
      -> Maybe Object
      -> CustomerBalanceTransactionType'
      -> CustomerBalanceTransaction)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object
-> Text
-> Parser (Maybe CustomerBalanceTransactionCreditNote'Variants)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"credit_note")) Parser
  (Text
   -> CustomerBalanceTransactionCustomer'Variants
   -> Maybe Text
   -> Int
   -> Text
   -> Maybe CustomerBalanceTransactionInvoice'Variants
   -> Bool
   -> Maybe Object
   -> CustomerBalanceTransactionType'
   -> CustomerBalanceTransaction)
-> Parser Text
-> Parser
     (CustomerBalanceTransactionCustomer'Variants
      -> Maybe Text
      -> Int
      -> Text
      -> Maybe CustomerBalanceTransactionInvoice'Variants
      -> Bool
      -> Maybe Object
      -> CustomerBalanceTransactionType'
      -> CustomerBalanceTransaction)
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
  (CustomerBalanceTransactionCustomer'Variants
   -> Maybe Text
   -> Int
   -> Text
   -> Maybe CustomerBalanceTransactionInvoice'Variants
   -> Bool
   -> Maybe Object
   -> CustomerBalanceTransactionType'
   -> CustomerBalanceTransaction)
-> Parser CustomerBalanceTransactionCustomer'Variants
-> Parser
     (Maybe Text
      -> Int
      -> Text
      -> Maybe CustomerBalanceTransactionInvoice'Variants
      -> Bool
      -> Maybe Object
      -> CustomerBalanceTransactionType'
      -> CustomerBalanceTransaction)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object
-> Text -> Parser CustomerBalanceTransactionCustomer'Variants
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"customer")) Parser
  (Maybe Text
   -> Int
   -> Text
   -> Maybe CustomerBalanceTransactionInvoice'Variants
   -> Bool
   -> Maybe Object
   -> CustomerBalanceTransactionType'
   -> CustomerBalanceTransaction)
-> Parser (Maybe Text)
-> Parser
     (Int
      -> Text
      -> Maybe CustomerBalanceTransactionInvoice'Variants
      -> Bool
      -> Maybe Object
      -> CustomerBalanceTransactionType'
      -> CustomerBalanceTransaction)
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
"description")) Parser
  (Int
   -> Text
   -> Maybe CustomerBalanceTransactionInvoice'Variants
   -> Bool
   -> Maybe Object
   -> CustomerBalanceTransactionType'
   -> CustomerBalanceTransaction)
-> Parser Int
-> Parser
     (Text
      -> Maybe CustomerBalanceTransactionInvoice'Variants
      -> Bool
      -> Maybe Object
      -> CustomerBalanceTransactionType'
      -> CustomerBalanceTransaction)
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
"ending_balance")) Parser
  (Text
   -> Maybe CustomerBalanceTransactionInvoice'Variants
   -> Bool
   -> Maybe Object
   -> CustomerBalanceTransactionType'
   -> CustomerBalanceTransaction)
-> Parser Text
-> Parser
     (Maybe CustomerBalanceTransactionInvoice'Variants
      -> Bool
      -> Maybe Object
      -> CustomerBalanceTransactionType'
      -> CustomerBalanceTransaction)
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
  (Maybe CustomerBalanceTransactionInvoice'Variants
   -> Bool
   -> Maybe Object
   -> CustomerBalanceTransactionType'
   -> CustomerBalanceTransaction)
-> Parser (Maybe CustomerBalanceTransactionInvoice'Variants)
-> Parser
     (Bool
      -> Maybe Object
      -> CustomerBalanceTransactionType'
      -> CustomerBalanceTransaction)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object
-> Text
-> Parser (Maybe CustomerBalanceTransactionInvoice'Variants)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Data.Aeson.Types.FromJSON..:? Text
"invoice")) Parser
  (Bool
   -> Maybe Object
   -> CustomerBalanceTransactionType'
   -> CustomerBalanceTransaction)
-> Parser Bool
-> Parser
     (Maybe Object
      -> CustomerBalanceTransactionType' -> CustomerBalanceTransaction)
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
   -> CustomerBalanceTransactionType' -> CustomerBalanceTransaction)
-> Parser (Maybe Object)
-> Parser
     (CustomerBalanceTransactionType' -> CustomerBalanceTransaction)
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
  (CustomerBalanceTransactionType' -> CustomerBalanceTransaction)
-> Parser CustomerBalanceTransactionType'
-> Parser CustomerBalanceTransaction
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser CustomerBalanceTransactionType'
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"type"))

-- | Create a new 'CustomerBalanceTransaction' with all required fields.
mkCustomerBalanceTransaction ::
  -- | 'customerBalanceTransactionAmount'
  GHC.Types.Int ->
  -- | 'customerBalanceTransactionCreated'
  GHC.Types.Int ->
  -- | 'customerBalanceTransactionCurrency'
  Data.Text.Internal.Text ->
  -- | 'customerBalanceTransactionCustomer'
  CustomerBalanceTransactionCustomer'Variants ->
  -- | 'customerBalanceTransactionEndingBalance'
  GHC.Types.Int ->
  -- | 'customerBalanceTransactionId'
  Data.Text.Internal.Text ->
  -- | 'customerBalanceTransactionLivemode'
  GHC.Types.Bool ->
  -- | 'customerBalanceTransactionType'
  CustomerBalanceTransactionType' ->
  CustomerBalanceTransaction
mkCustomerBalanceTransaction :: Int
-> Int
-> Text
-> CustomerBalanceTransactionCustomer'Variants
-> Int
-> Text
-> Bool
-> CustomerBalanceTransactionType'
-> CustomerBalanceTransaction
mkCustomerBalanceTransaction Int
customerBalanceTransactionAmount Int
customerBalanceTransactionCreated Text
customerBalanceTransactionCurrency CustomerBalanceTransactionCustomer'Variants
customerBalanceTransactionCustomer Int
customerBalanceTransactionEndingBalance Text
customerBalanceTransactionId Bool
customerBalanceTransactionLivemode CustomerBalanceTransactionType'
customerBalanceTransactionType =
  CustomerBalanceTransaction :: Int
-> Int
-> Maybe CustomerBalanceTransactionCreditNote'Variants
-> Text
-> CustomerBalanceTransactionCustomer'Variants
-> Maybe Text
-> Int
-> Text
-> Maybe CustomerBalanceTransactionInvoice'Variants
-> Bool
-> Maybe Object
-> CustomerBalanceTransactionType'
-> CustomerBalanceTransaction
CustomerBalanceTransaction
    { customerBalanceTransactionAmount :: Int
customerBalanceTransactionAmount = Int
customerBalanceTransactionAmount,
      customerBalanceTransactionCreated :: Int
customerBalanceTransactionCreated = Int
customerBalanceTransactionCreated,
      customerBalanceTransactionCreditNote :: Maybe CustomerBalanceTransactionCreditNote'Variants
customerBalanceTransactionCreditNote = Maybe CustomerBalanceTransactionCreditNote'Variants
forall a. Maybe a
GHC.Maybe.Nothing,
      customerBalanceTransactionCurrency :: Text
customerBalanceTransactionCurrency = Text
customerBalanceTransactionCurrency,
      customerBalanceTransactionCustomer :: CustomerBalanceTransactionCustomer'Variants
customerBalanceTransactionCustomer = CustomerBalanceTransactionCustomer'Variants
customerBalanceTransactionCustomer,
      customerBalanceTransactionDescription :: Maybe Text
customerBalanceTransactionDescription = Maybe Text
forall a. Maybe a
GHC.Maybe.Nothing,
      customerBalanceTransactionEndingBalance :: Int
customerBalanceTransactionEndingBalance = Int
customerBalanceTransactionEndingBalance,
      customerBalanceTransactionId :: Text
customerBalanceTransactionId = Text
customerBalanceTransactionId,
      customerBalanceTransactionInvoice :: Maybe CustomerBalanceTransactionInvoice'Variants
customerBalanceTransactionInvoice = Maybe CustomerBalanceTransactionInvoice'Variants
forall a. Maybe a
GHC.Maybe.Nothing,
      customerBalanceTransactionLivemode :: Bool
customerBalanceTransactionLivemode = Bool
customerBalanceTransactionLivemode,
      customerBalanceTransactionMetadata :: Maybe Object
customerBalanceTransactionMetadata = Maybe Object
forall a. Maybe a
GHC.Maybe.Nothing,
      customerBalanceTransactionType :: CustomerBalanceTransactionType'
customerBalanceTransactionType = CustomerBalanceTransactionType'
customerBalanceTransactionType
    }

-- | Defines the oneOf schema located at @components.schemas.customer_balance_transaction.properties.credit_note.anyOf@ in the specification.
--
-- The ID of the credit note (if any) related to the transaction.
data CustomerBalanceTransactionCreditNote'Variants
  = CustomerBalanceTransactionCreditNote'Text Data.Text.Internal.Text
  | CustomerBalanceTransactionCreditNote'CreditNote CreditNote
  deriving (Int -> CustomerBalanceTransactionCreditNote'Variants -> ShowS
[CustomerBalanceTransactionCreditNote'Variants] -> ShowS
CustomerBalanceTransactionCreditNote'Variants -> String
(Int -> CustomerBalanceTransactionCreditNote'Variants -> ShowS)
-> (CustomerBalanceTransactionCreditNote'Variants -> String)
-> ([CustomerBalanceTransactionCreditNote'Variants] -> ShowS)
-> Show CustomerBalanceTransactionCreditNote'Variants
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CustomerBalanceTransactionCreditNote'Variants] -> ShowS
$cshowList :: [CustomerBalanceTransactionCreditNote'Variants] -> ShowS
show :: CustomerBalanceTransactionCreditNote'Variants -> String
$cshow :: CustomerBalanceTransactionCreditNote'Variants -> String
showsPrec :: Int -> CustomerBalanceTransactionCreditNote'Variants -> ShowS
$cshowsPrec :: Int -> CustomerBalanceTransactionCreditNote'Variants -> ShowS
GHC.Show.Show, CustomerBalanceTransactionCreditNote'Variants
-> CustomerBalanceTransactionCreditNote'Variants -> Bool
(CustomerBalanceTransactionCreditNote'Variants
 -> CustomerBalanceTransactionCreditNote'Variants -> Bool)
-> (CustomerBalanceTransactionCreditNote'Variants
    -> CustomerBalanceTransactionCreditNote'Variants -> Bool)
-> Eq CustomerBalanceTransactionCreditNote'Variants
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CustomerBalanceTransactionCreditNote'Variants
-> CustomerBalanceTransactionCreditNote'Variants -> Bool
$c/= :: CustomerBalanceTransactionCreditNote'Variants
-> CustomerBalanceTransactionCreditNote'Variants -> Bool
== :: CustomerBalanceTransactionCreditNote'Variants
-> CustomerBalanceTransactionCreditNote'Variants -> Bool
$c== :: CustomerBalanceTransactionCreditNote'Variants
-> CustomerBalanceTransactionCreditNote'Variants -> Bool
GHC.Classes.Eq)

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

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

-- | Defines the oneOf schema located at @components.schemas.customer_balance_transaction.properties.customer.anyOf@ in the specification.
--
-- The ID of the customer the transaction belongs to.
data CustomerBalanceTransactionCustomer'Variants
  = CustomerBalanceTransactionCustomer'Text Data.Text.Internal.Text
  | CustomerBalanceTransactionCustomer'Customer Customer
  deriving (Int -> CustomerBalanceTransactionCustomer'Variants -> ShowS
[CustomerBalanceTransactionCustomer'Variants] -> ShowS
CustomerBalanceTransactionCustomer'Variants -> String
(Int -> CustomerBalanceTransactionCustomer'Variants -> ShowS)
-> (CustomerBalanceTransactionCustomer'Variants -> String)
-> ([CustomerBalanceTransactionCustomer'Variants] -> ShowS)
-> Show CustomerBalanceTransactionCustomer'Variants
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CustomerBalanceTransactionCustomer'Variants] -> ShowS
$cshowList :: [CustomerBalanceTransactionCustomer'Variants] -> ShowS
show :: CustomerBalanceTransactionCustomer'Variants -> String
$cshow :: CustomerBalanceTransactionCustomer'Variants -> String
showsPrec :: Int -> CustomerBalanceTransactionCustomer'Variants -> ShowS
$cshowsPrec :: Int -> CustomerBalanceTransactionCustomer'Variants -> ShowS
GHC.Show.Show, CustomerBalanceTransactionCustomer'Variants
-> CustomerBalanceTransactionCustomer'Variants -> Bool
(CustomerBalanceTransactionCustomer'Variants
 -> CustomerBalanceTransactionCustomer'Variants -> Bool)
-> (CustomerBalanceTransactionCustomer'Variants
    -> CustomerBalanceTransactionCustomer'Variants -> Bool)
-> Eq CustomerBalanceTransactionCustomer'Variants
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CustomerBalanceTransactionCustomer'Variants
-> CustomerBalanceTransactionCustomer'Variants -> Bool
$c/= :: CustomerBalanceTransactionCustomer'Variants
-> CustomerBalanceTransactionCustomer'Variants -> Bool
== :: CustomerBalanceTransactionCustomer'Variants
-> CustomerBalanceTransactionCustomer'Variants -> Bool
$c== :: CustomerBalanceTransactionCustomer'Variants
-> CustomerBalanceTransactionCustomer'Variants -> Bool
GHC.Classes.Eq)

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

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

-- | Defines the oneOf schema located at @components.schemas.customer_balance_transaction.properties.invoice.anyOf@ in the specification.
--
-- The ID of the invoice (if any) related to the transaction.
data CustomerBalanceTransactionInvoice'Variants
  = CustomerBalanceTransactionInvoice'Text Data.Text.Internal.Text
  | CustomerBalanceTransactionInvoice'Invoice Invoice
  deriving (Int -> CustomerBalanceTransactionInvoice'Variants -> ShowS
[CustomerBalanceTransactionInvoice'Variants] -> ShowS
CustomerBalanceTransactionInvoice'Variants -> String
(Int -> CustomerBalanceTransactionInvoice'Variants -> ShowS)
-> (CustomerBalanceTransactionInvoice'Variants -> String)
-> ([CustomerBalanceTransactionInvoice'Variants] -> ShowS)
-> Show CustomerBalanceTransactionInvoice'Variants
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CustomerBalanceTransactionInvoice'Variants] -> ShowS
$cshowList :: [CustomerBalanceTransactionInvoice'Variants] -> ShowS
show :: CustomerBalanceTransactionInvoice'Variants -> String
$cshow :: CustomerBalanceTransactionInvoice'Variants -> String
showsPrec :: Int -> CustomerBalanceTransactionInvoice'Variants -> ShowS
$cshowsPrec :: Int -> CustomerBalanceTransactionInvoice'Variants -> ShowS
GHC.Show.Show, CustomerBalanceTransactionInvoice'Variants
-> CustomerBalanceTransactionInvoice'Variants -> Bool
(CustomerBalanceTransactionInvoice'Variants
 -> CustomerBalanceTransactionInvoice'Variants -> Bool)
-> (CustomerBalanceTransactionInvoice'Variants
    -> CustomerBalanceTransactionInvoice'Variants -> Bool)
-> Eq CustomerBalanceTransactionInvoice'Variants
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CustomerBalanceTransactionInvoice'Variants
-> CustomerBalanceTransactionInvoice'Variants -> Bool
$c/= :: CustomerBalanceTransactionInvoice'Variants
-> CustomerBalanceTransactionInvoice'Variants -> Bool
== :: CustomerBalanceTransactionInvoice'Variants
-> CustomerBalanceTransactionInvoice'Variants -> Bool
$c== :: CustomerBalanceTransactionInvoice'Variants
-> CustomerBalanceTransactionInvoice'Variants -> Bool
GHC.Classes.Eq)

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

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

-- | Defines the enum schema located at @components.schemas.customer_balance_transaction.properties.type@ in the specification.
--
-- Transaction type: \`adjustment\`, \`applied_to_invoice\`, \`credit_note\`, \`initial\`, \`invoice_too_large\`, \`invoice_too_small\`, \`unspent_receiver_credit\`, or \`unapplied_from_invoice\`. See the [Customer Balance page](https:\/\/stripe.com\/docs\/billing\/customer\/balance\#types) to learn more about transaction types.
data CustomerBalanceTransactionType'
  = -- | This case is used if the value encountered during decoding does not match any of the provided cases in the specification.
    CustomerBalanceTransactionType'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.
    CustomerBalanceTransactionType'Typed Data.Text.Internal.Text
  | -- | Represents the JSON value @"adjustment"@
    CustomerBalanceTransactionType'EnumAdjustment
  | -- | Represents the JSON value @"applied_to_invoice"@
    CustomerBalanceTransactionType'EnumAppliedToInvoice
  | -- | Represents the JSON value @"credit_note"@
    CustomerBalanceTransactionType'EnumCreditNote
  | -- | Represents the JSON value @"initial"@
    CustomerBalanceTransactionType'EnumInitial
  | -- | Represents the JSON value @"invoice_too_large"@
    CustomerBalanceTransactionType'EnumInvoiceTooLarge
  | -- | Represents the JSON value @"invoice_too_small"@
    CustomerBalanceTransactionType'EnumInvoiceTooSmall
  | -- | Represents the JSON value @"migration"@
    CustomerBalanceTransactionType'EnumMigration
  | -- | Represents the JSON value @"unapplied_from_invoice"@
    CustomerBalanceTransactionType'EnumUnappliedFromInvoice
  | -- | Represents the JSON value @"unspent_receiver_credit"@
    CustomerBalanceTransactionType'EnumUnspentReceiverCredit
  deriving (Int -> CustomerBalanceTransactionType' -> ShowS
[CustomerBalanceTransactionType'] -> ShowS
CustomerBalanceTransactionType' -> String
(Int -> CustomerBalanceTransactionType' -> ShowS)
-> (CustomerBalanceTransactionType' -> String)
-> ([CustomerBalanceTransactionType'] -> ShowS)
-> Show CustomerBalanceTransactionType'
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CustomerBalanceTransactionType'] -> ShowS
$cshowList :: [CustomerBalanceTransactionType'] -> ShowS
show :: CustomerBalanceTransactionType' -> String
$cshow :: CustomerBalanceTransactionType' -> String
showsPrec :: Int -> CustomerBalanceTransactionType' -> ShowS
$cshowsPrec :: Int -> CustomerBalanceTransactionType' -> ShowS
GHC.Show.Show, CustomerBalanceTransactionType'
-> CustomerBalanceTransactionType' -> Bool
(CustomerBalanceTransactionType'
 -> CustomerBalanceTransactionType' -> Bool)
-> (CustomerBalanceTransactionType'
    -> CustomerBalanceTransactionType' -> Bool)
-> Eq CustomerBalanceTransactionType'
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CustomerBalanceTransactionType'
-> CustomerBalanceTransactionType' -> Bool
$c/= :: CustomerBalanceTransactionType'
-> CustomerBalanceTransactionType' -> Bool
== :: CustomerBalanceTransactionType'
-> CustomerBalanceTransactionType' -> Bool
$c== :: CustomerBalanceTransactionType'
-> CustomerBalanceTransactionType' -> Bool
GHC.Classes.Eq)

instance Data.Aeson.Types.ToJSON.ToJSON CustomerBalanceTransactionType' where
  toJSON :: CustomerBalanceTransactionType' -> Value
toJSON (CustomerBalanceTransactionType'Other Value
val) = Value
val
  toJSON (CustomerBalanceTransactionType'Typed Text
val) = Text -> Value
forall a. ToJSON a => a -> Value
Data.Aeson.Types.ToJSON.toJSON Text
val
  toJSON (CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumAdjustment) = Value
"adjustment"
  toJSON (CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumAppliedToInvoice) = Value
"applied_to_invoice"
  toJSON (CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumCreditNote) = Value
"credit_note"
  toJSON (CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumInitial) = Value
"initial"
  toJSON (CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumInvoiceTooLarge) = Value
"invoice_too_large"
  toJSON (CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumInvoiceTooSmall) = Value
"invoice_too_small"
  toJSON (CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumMigration) = Value
"migration"
  toJSON (CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumUnappliedFromInvoice) = Value
"unapplied_from_invoice"
  toJSON (CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumUnspentReceiverCredit) = Value
"unspent_receiver_credit"

instance Data.Aeson.Types.FromJSON.FromJSON CustomerBalanceTransactionType' where
  parseJSON :: Value -> Parser CustomerBalanceTransactionType'
parseJSON Value
val =
    CustomerBalanceTransactionType'
-> Parser CustomerBalanceTransactionType'
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
"adjustment" -> CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumAdjustment
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"applied_to_invoice" -> CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumAppliedToInvoice
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"credit_note" -> CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumCreditNote
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"initial" -> CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumInitial
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"invoice_too_large" -> CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumInvoiceTooLarge
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"invoice_too_small" -> CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumInvoiceTooSmall
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"migration" -> CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumMigration
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"unapplied_from_invoice" -> CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumUnappliedFromInvoice
            | Value
val Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
GHC.Classes.== Value
"unspent_receiver_credit" -> CustomerBalanceTransactionType'
CustomerBalanceTransactionType'EnumUnspentReceiverCredit
            | Bool
GHC.Base.otherwise -> Value -> CustomerBalanceTransactionType'
CustomerBalanceTransactionType'Other Value
val
      )