module Network.Payments.PayPal.Types.Payer
( PayerInfo(..)
, PaymentMethod(..)
, PayerStatus(..)
, Payer(..)
) where
#if __GLASGOW_HASKELL__ < 710
import Control.Applicative
#endif
import Control.Monad
import Data.Aeson
import qualified Data.Foldable as F
import Data.Maybe
import Network.Payments.PayPal.Types.FundingInstrument
data PayerInfo = PayerInfo
{ payerInfoEmail :: String
} deriving (Eq, Show)
instance ToJSON PayerInfo where
toJSON info = object ["email" .= payerInfoEmail info]
instance FromJSON PayerInfo where
parseJSON (Object obj) = PayerInfo <$> obj .: "email"
parseJSON _ = mzero
data PaymentMethod = PayMethodPayPal | PayMethodCreditCard
deriving (Eq, Read, Show)
instance ToJSON PaymentMethod where
toJSON PayMethodPayPal = "paypal"
toJSON PayMethodCreditCard = "credit_card"
instance FromJSON PaymentMethod where
parseJSON (String "paypal") = return PayMethodPayPal
parseJSON (String "credit_card") = return PayMethodCreditCard
parseJSON _ = mzero
data PayerStatus = PayerStatusVerified | PayerStatusUnverified
deriving (Eq, Read, Show)
instance FromJSON PayerStatus where
parseJSON (String "VERIFIED") = return PayerStatusVerified
parseJSON (String "UNVERIFIED") = return PayerStatusUnverified
parseJSON _ = mzero
instance ToJSON PayerStatus where
toJSON PayerStatusVerified = "VERIFIED"
toJSON PayerStatusUnverified = "UNVERIFIED"
data Payer = Payer
{ payerPaymentMethod :: PaymentMethod
, payerFundingInstruments :: [FundingInstrument]
, payerInfo :: Maybe PayerInfo
, payerStatus :: Maybe PayerStatus
} deriving (Eq, Show)
instance ToJSON Payer where
toJSON payer =
let fundingInstr = if null $ payerFundingInstruments payer then Nothing
else Just $ payerFundingInstruments payer
in object (["payment_method" .= payerPaymentMethod payer] ++
maybeToList (("funding_instruments" .=) <$> fundingInstr) ++
maybeToList (("payer_info" .=) <$> payerInfo payer) ++
maybeToList (("status" .=) <$> payerStatus payer))
instance FromJSON Payer where
parseJSON (Object obj) =
Payer <$>
obj .: "payment_method" <*>
(obj .:? "funding_instruments" >>= return . F.concat) <*>
obj .:? "payer_info" <*>
obj .:? "status"
parseJSON _ = mzero