module LendingClub.Invest
( InvestResponse (..)
, ErrorMessage (..)
, InvestConfirmation (..)
, ExecutionStatus (..)
) where
import Control.Applicative (pure, (<|>), (<$>), (<*>))
import Data.Aeson
import Data.Text (Text)
import GHC.Generics
import LendingClub.Money
data InvestResponse
= InvestResponse
{ orderInstructId :: Int
, orderConfirmations :: [InvestConfirmation]
}
| InvestError
{ errors :: [ErrorMessage] }
deriving (Show, Eq)
instance FromJSON InvestResponse where
parseJSON (Object v) =
InvestResponse
<$> v .: "orderInstructId"
<*> v .: "orderConfirmations"
<|> InvestError <$> v .: "errors"
parseJSON _ = pure (InvestError [])
data ErrorMessage = ErrorMessage
{ field :: Text
, code :: Text
, message :: Text
} deriving (Generic, Show, Eq)
instance FromJSON ErrorMessage where
data InvestConfirmation = InvestConfirmation
{ loanId :: Int
, requestedAmount :: Money
, investedAmount :: Money
, executionStatus :: [ExecutionStatus]
} deriving (Generic, Show, Eq)
instance FromJSON InvestConfirmation where
data ExecutionStatus
= OrderFulfilled
| LoanAmountExceeded
| NotAnInfundingLoan
| RequestedAmountLow
| RequestedAmountRounded
| AugmentedByMerge
| ElimByMerge
| InsufficientCash
| NotAnInvestor
| NotAValidInvestment
| NoteAddedToPortfolio
| NotAValidPortfolio
| ErrorAddingNoteToPortfolio
| SystemBusy
| UnknownError
deriving (Show, Eq)
instance FromJSON ExecutionStatus where
parseJSON (String "ORDER_FULFILLED") = pure OrderFulfilled
parseJSON (String "LOAN_AMNT_EXCEEDED") = pure LoanAmountExceeded
parseJSON (String "NOT_AN_INFUNDING_LOAN") = pure NotAnInfundingLoan
parseJSON (String "REQUESTED_AMNT_LOW") = pure RequestedAmountLow
parseJSON (String "REQUESTED_AMNT_ROUNDED") = pure RequestedAmountRounded
parseJSON (String "AUGMENTED_BY_MERGE") = pure AugmentedByMerge
parseJSON (String "ELIM_BY_MERGE") = pure ElimByMerge
parseJSON (String "INSUFFICIENT_CASH") = pure InsufficientCash
parseJSON (String "NOT_AN_INVESTOR") = pure NotAnInvestor
parseJSON (String "NOT_A_VALID_INVESTMENT") = pure NotAValidInvestment
parseJSON (String "NOTE_ADDED_TO_PORTFOLIO") = pure NoteAddedToPortfolio
parseJSON (String "NOT_A_VALID_PORTFOLIO") = pure NotAValidPortfolio
parseJSON (String "ERROR_ADDING_NOTE_TO_PORTFOLIO") = pure ErrorAddingNoteToPortfolio
parseJSON (String "SYSTEM_BUSY") = pure SystemBusy
parseJSON _ = pure UnknownError