{-# 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 InvoiceTransferData
module StripeAPI.Types.InvoiceTransferData 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.Account
import qualified Prelude as GHC.Integer.Type
import qualified Prelude as GHC.Maybe

-- | Defines the object schema located at @components.schemas.invoice_transfer_data@ in the specification.
data InvoiceTransferData = InvoiceTransferData
  { -- | amount: The amount in %s that will be transferred to the destination account when the invoice is paid. By default, the entire amount is transferred to the destination.
    InvoiceTransferData -> Maybe Int
invoiceTransferDataAmount :: (GHC.Maybe.Maybe GHC.Types.Int),
    -- | destination: The account where funds from the payment will be transferred to upon payment success.
    InvoiceTransferData -> InvoiceTransferDataDestination'Variants
invoiceTransferDataDestination :: InvoiceTransferDataDestination'Variants
  }
  deriving
    ( Int -> InvoiceTransferData -> ShowS
[InvoiceTransferData] -> ShowS
InvoiceTransferData -> String
(Int -> InvoiceTransferData -> ShowS)
-> (InvoiceTransferData -> String)
-> ([InvoiceTransferData] -> ShowS)
-> Show InvoiceTransferData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InvoiceTransferData] -> ShowS
$cshowList :: [InvoiceTransferData] -> ShowS
show :: InvoiceTransferData -> String
$cshow :: InvoiceTransferData -> String
showsPrec :: Int -> InvoiceTransferData -> ShowS
$cshowsPrec :: Int -> InvoiceTransferData -> ShowS
GHC.Show.Show,
      InvoiceTransferData -> InvoiceTransferData -> Bool
(InvoiceTransferData -> InvoiceTransferData -> Bool)
-> (InvoiceTransferData -> InvoiceTransferData -> Bool)
-> Eq InvoiceTransferData
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: InvoiceTransferData -> InvoiceTransferData -> Bool
$c/= :: InvoiceTransferData -> InvoiceTransferData -> Bool
== :: InvoiceTransferData -> InvoiceTransferData -> Bool
$c== :: InvoiceTransferData -> InvoiceTransferData -> Bool
GHC.Classes.Eq
    )

instance Data.Aeson.Types.ToJSON.ToJSON InvoiceTransferData where
  toJSON :: InvoiceTransferData -> Value
toJSON InvoiceTransferData
obj = [Pair] -> Value
Data.Aeson.Types.Internal.object (Text
"amount" Text -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= InvoiceTransferData -> Maybe Int
invoiceTransferDataAmount InvoiceTransferData
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: Text
"destination" Text -> InvoiceTransferDataDestination'Variants -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= InvoiceTransferData -> InvoiceTransferDataDestination'Variants
invoiceTransferDataDestination InvoiceTransferData
obj Pair -> [Pair] -> [Pair]
forall a. a -> [a] -> [a]
: [Pair]
forall a. Monoid a => a
GHC.Base.mempty)
  toEncoding :: InvoiceTransferData -> Encoding
toEncoding InvoiceTransferData
obj = Series -> Encoding
Data.Aeson.Encoding.Internal.pairs ((Text
"amount" Text -> Maybe Int -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= InvoiceTransferData -> Maybe Int
invoiceTransferDataAmount InvoiceTransferData
obj) Series -> Series -> Series
forall a. Semigroup a => a -> a -> a
GHC.Base.<> (Text
"destination" Text -> InvoiceTransferDataDestination'Variants -> Series
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Data.Aeson.Types.ToJSON..= InvoiceTransferData -> InvoiceTransferDataDestination'Variants
invoiceTransferDataDestination InvoiceTransferData
obj))

instance Data.Aeson.Types.FromJSON.FromJSON InvoiceTransferData where
  parseJSON :: Value -> Parser InvoiceTransferData
parseJSON = String
-> (Object -> Parser InvoiceTransferData)
-> Value
-> Parser InvoiceTransferData
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.Aeson.Types.FromJSON.withObject String
"InvoiceTransferData" (\Object
obj -> ((Maybe Int
 -> InvoiceTransferDataDestination'Variants -> InvoiceTransferData)
-> Parser
     (Maybe Int
      -> InvoiceTransferDataDestination'Variants -> InvoiceTransferData)
forall (f :: * -> *) a. Applicative f => a -> f a
GHC.Base.pure Maybe Int
-> InvoiceTransferDataDestination'Variants -> InvoiceTransferData
InvoiceTransferData Parser
  (Maybe Int
   -> InvoiceTransferDataDestination'Variants -> InvoiceTransferData)
-> Parser (Maybe Int)
-> Parser
     (InvoiceTransferDataDestination'Variants -> InvoiceTransferData)
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
  (InvoiceTransferDataDestination'Variants -> InvoiceTransferData)
-> Parser InvoiceTransferDataDestination'Variants
-> Parser InvoiceTransferData
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
GHC.Base.<*> (Object
obj Object -> Text -> Parser InvoiceTransferDataDestination'Variants
forall a. FromJSON a => Object -> Text -> Parser a
Data.Aeson.Types.FromJSON..: Text
"destination"))

-- | Create a new 'InvoiceTransferData' with all required fields.
mkInvoiceTransferData ::
  -- | 'invoiceTransferDataDestination'
  InvoiceTransferDataDestination'Variants ->
  InvoiceTransferData
mkInvoiceTransferData :: InvoiceTransferDataDestination'Variants -> InvoiceTransferData
mkInvoiceTransferData InvoiceTransferDataDestination'Variants
invoiceTransferDataDestination =
  InvoiceTransferData :: Maybe Int
-> InvoiceTransferDataDestination'Variants -> InvoiceTransferData
InvoiceTransferData
    { invoiceTransferDataAmount :: Maybe Int
invoiceTransferDataAmount = Maybe Int
forall a. Maybe a
GHC.Maybe.Nothing,
      invoiceTransferDataDestination :: InvoiceTransferDataDestination'Variants
invoiceTransferDataDestination = InvoiceTransferDataDestination'Variants
invoiceTransferDataDestination
    }

-- | Defines the oneOf schema located at @components.schemas.invoice_transfer_data.properties.destination.anyOf@ in the specification.
--
-- The account where funds from the payment will be transferred to upon payment success.
data InvoiceTransferDataDestination'Variants
  = InvoiceTransferDataDestination'Text Data.Text.Internal.Text
  | InvoiceTransferDataDestination'Account Account
  deriving (Int -> InvoiceTransferDataDestination'Variants -> ShowS
[InvoiceTransferDataDestination'Variants] -> ShowS
InvoiceTransferDataDestination'Variants -> String
(Int -> InvoiceTransferDataDestination'Variants -> ShowS)
-> (InvoiceTransferDataDestination'Variants -> String)
-> ([InvoiceTransferDataDestination'Variants] -> ShowS)
-> Show InvoiceTransferDataDestination'Variants
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InvoiceTransferDataDestination'Variants] -> ShowS
$cshowList :: [InvoiceTransferDataDestination'Variants] -> ShowS
show :: InvoiceTransferDataDestination'Variants -> String
$cshow :: InvoiceTransferDataDestination'Variants -> String
showsPrec :: Int -> InvoiceTransferDataDestination'Variants -> ShowS
$cshowsPrec :: Int -> InvoiceTransferDataDestination'Variants -> ShowS
GHC.Show.Show, InvoiceTransferDataDestination'Variants
-> InvoiceTransferDataDestination'Variants -> Bool
(InvoiceTransferDataDestination'Variants
 -> InvoiceTransferDataDestination'Variants -> Bool)
-> (InvoiceTransferDataDestination'Variants
    -> InvoiceTransferDataDestination'Variants -> Bool)
-> Eq InvoiceTransferDataDestination'Variants
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: InvoiceTransferDataDestination'Variants
-> InvoiceTransferDataDestination'Variants -> Bool
$c/= :: InvoiceTransferDataDestination'Variants
-> InvoiceTransferDataDestination'Variants -> Bool
== :: InvoiceTransferDataDestination'Variants
-> InvoiceTransferDataDestination'Variants -> Bool
$c== :: InvoiceTransferDataDestination'Variants
-> InvoiceTransferDataDestination'Variants -> Bool
GHC.Classes.Eq)

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

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