use chrono::NaiveDate;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum AssetCategory {
#[serde(rename = "STK")]
Stock,
#[serde(rename = "OPT")]
Option,
#[serde(rename = "FUT")]
Future,
#[serde(rename = "FOP")]
FutureOption,
#[serde(rename = "CASH")]
Cash,
#[serde(rename = "BOND")]
Bond,
#[serde(rename = "BILL")]
Bill,
#[serde(rename = "CMDTY")]
Commodity,
#[serde(rename = "CFD")]
Cfd,
#[serde(rename = "FXCFD")]
ForexCfd,
#[serde(rename = "WAR")]
Warrant,
#[serde(rename = "FUND")]
Fund,
#[serde(rename = "IOPT")]
StructuredProduct,
#[serde(rename = "BAG")]
Bag,
#[serde(rename = "CRYPTO")]
Cryptocurrency,
#[serde(rename = "METAL")]
Metal,
#[serde(rename = "EFP")]
ExchangeForPhysical,
#[serde(rename = "EC")]
EventContract,
#[serde(rename = "IND")]
Index,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum BuySell {
#[serde(rename = "BUY")]
Buy,
#[serde(rename = "SELL")]
Sell,
#[serde(rename = "BUY (Ca.)")]
CancelBuy,
#[serde(rename = "SELL (Ca.)")]
CancelSell,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum OpenClose {
#[serde(rename = "O")]
Open,
#[serde(rename = "C")]
Close,
#[serde(rename = "C;O")]
CloseOpen,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum OrderType {
#[serde(rename = "MKT")]
Market,
#[serde(rename = "LMT")]
Limit,
#[serde(rename = "STP")]
Stop,
#[serde(rename = "STP LMT")]
StopLimit,
#[serde(rename = "MOC")]
MarketOnClose,
#[serde(rename = "LOC")]
LimitOnClose,
#[serde(rename = "MIT")]
MarketIfTouched,
#[serde(rename = "LIT")]
LimitIfTouched,
#[serde(rename = "TRAIL")]
TrailingStop,
#[serde(rename = "TRAIL LMT")]
TrailingLimit,
#[serde(rename = "MIDPX")]
MidPrice,
#[serde(rename = "REL")]
Relative,
#[serde(rename = "MULTIPLE")]
Multiple,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum PutCall {
#[serde(rename = "P")]
Put,
#[serde(rename = "C")]
Call,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum LongShort {
Long,
Short,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum TradeType {
ExchTrade,
BookTrade,
DvpTrade,
FracShare,
FracShareCancel,
Adjustment,
TradeCorrect,
TradeCancel,
IBKRTrade,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum CashTransactionType {
#[serde(rename = "Deposits & Withdrawals")]
DepositsWithdrawals,
Dividends,
WithholdingTax,
#[serde(rename = "Broker Interest Paid")]
BrokerInterestPaid,
#[serde(rename = "Broker Interest Received")]
BrokerInterestReceived,
#[serde(rename = "Bond Interest Received")]
BondInterestReceived,
#[serde(rename = "Bond Interest Paid")]
BondInterestPaid,
#[serde(rename = "Bond Interest")]
BondInterest,
#[serde(rename = "Payment In Lieu Of Dividends")]
PaymentInLieuOfDividends,
#[serde(rename = "Other Fees")]
OtherFees,
#[serde(rename = "Commission Adjustments")]
CommissionAdjustments,
#[serde(rename = "Advisor Fees")]
AdvisorFees,
#[serde(rename = "Cash Receipts")]
CashReceipts,
Fees,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum CorporateActionType {
#[serde(rename = "Stock Split")]
StockSplit,
#[serde(rename = "Forward Split (Issue)")]
ForwardSplitIssue,
#[serde(rename = "Forward Split")]
ForwardSplit,
#[serde(rename = "Reverse Split")]
ReverseSplit,
Merger,
Spinoff,
#[serde(rename = "Contract Spinoff")]
ContractSpinoff,
#[serde(rename = "Stock Dividend")]
StockDividend,
#[serde(rename = "Cash Dividend")]
CashDividend,
#[serde(rename = "Choice Dividend")]
ChoiceDividend,
#[serde(rename = "Choice Dividend (Delivery)")]
ChoiceDivDelivery,
#[serde(rename = "Choice Dividend (Issue)")]
ChoiceDivIssue,
#[serde(rename = "Dividend Rights Issue")]
DivRightsIssue,
#[serde(rename = "Expired Dividend Right")]
ExpiredDivRight,
Delisted,
#[serde(rename = "Delist (Worthless)")]
DelistWorthless,
#[serde(rename = "Name Change")]
NameChange,
#[serde(rename = "Symbol Change")]
SymbolChange,
#[serde(rename = "Issue Change")]
IssueChange,
#[serde(rename = "Bond Conversion")]
BondConversion,
#[serde(rename = "Bond Maturity")]
BondMaturity,
#[serde(rename = "T-Bill Maturity")]
TBillMaturity,
#[serde(rename = "Convertible Issue")]
ConvertibleIssue,
#[serde(rename = "Coupon Payment")]
CouponPayment,
#[serde(rename = "Contract Consolidation")]
ContractConsolidation,
#[serde(rename = "Contract Split")]
ContractSplit,
#[serde(rename = "CFD Termination")]
CfdTermination,
#[serde(rename = "Fee Allocation")]
FeeAllocation,
#[serde(rename = "Rights Issue")]
RightsIssue,
#[serde(rename = "Subscribe Rights")]
SubscribeRights,
Tender,
#[serde(rename = "Tender (Issue)")]
TenderIssue,
#[serde(rename = "Proxy Vote")]
ProxyVote,
#[serde(rename = "Generic Voluntary")]
GenericVoluntary,
#[serde(rename = "Asset Purchase")]
AssetPurchase,
#[serde(rename = "Purchase (Issue)")]
PurchaseIssue,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum OptionAction {
Assignment,
Exercise,
Expiration,
Expire,
#[serde(rename = "Cash Settlement")]
CashSettlement,
Buy,
Sell,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum TransferType {
ACATS,
ATON,
FOP,
INTERNAL,
DVP,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum TransactionCode {
#[serde(rename = "A")]
Assignment,
#[serde(rename = "Adj")]
Adjustment,
#[serde(rename = "Al")]
Allocation,
#[serde(rename = "Ae")]
AutoExercise,
#[serde(rename = "Af")]
AutoFx,
#[serde(rename = "Aw")]
AwayTrade,
#[serde(rename = "B")]
BuyIn,
#[serde(rename = "Bo")]
BorrowFee,
#[serde(rename = "Ca")]
Cancelled,
#[serde(rename = "C")]
Closing,
#[serde(rename = "Cd")]
CashDelivery,
#[serde(rename = "Cp")]
ComplexPosition,
#[serde(rename = "Cr")]
Correction,
#[serde(rename = "Cs")]
Crossing,
#[serde(rename = "D")]
DualAgent,
#[serde(rename = "Et")]
Etf,
#[serde(rename = "Ex")]
Expired,
#[serde(rename = "O")]
Exercise,
#[serde(rename = "G")]
Guaranteed,
#[serde(rename = "Hc")]
HighestCost,
#[serde(rename = "Hi")]
HfInvestment,
#[serde(rename = "Hr")]
HfRedemption,
#[serde(rename = "I")]
InternalTransfer,
#[serde(rename = "Ia")]
Affiliate,
#[serde(rename = "Iv")]
Investor,
#[serde(rename = "L")]
MarginLiquidation,
#[serde(rename = "Li")]
Lifo,
#[serde(rename = "Ln")]
Loan,
#[serde(rename = "Lt")]
LongTermGain,
#[serde(rename = "M")]
ManualEntry,
#[serde(rename = "Ml")]
MaxLoss,
#[serde(rename = "Mn")]
MinLongTermGain,
#[serde(rename = "Ms")]
MaxShortTermGain,
#[serde(rename = "Mi")]
MinShortTermGain,
#[serde(rename = "Mx")]
ManualExercise,
#[serde(rename = "P")]
Opening,
#[serde(rename = "Pt")]
Partial,
#[serde(rename = "Fr")]
FracRiskless,
#[serde(rename = "Fp")]
FracPrincipal,
#[serde(rename = "Pi")]
PriceImprovement,
#[serde(rename = "Pa")]
PostAccrual,
#[serde(rename = "Pr")]
Principal,
#[serde(rename = "Re")]
Reinvestment,
#[serde(rename = "Rd")]
Redemption,
#[serde(rename = "R")]
Reopen,
#[serde(rename = "Rv")]
Reverse,
#[serde(rename = "Ri")]
Reimbursement,
#[serde(rename = "Si")]
SolicitedIb,
#[serde(rename = "Sp")]
SpecificLot,
#[serde(rename = "So")]
SolicitedOther,
#[serde(rename = "Ss")]
ShortSettlement,
#[serde(rename = "St")]
ShortTermGain,
#[serde(rename = "Sy")]
StockYield,
#[serde(rename = "T")]
Transfer,
#[serde(rename = "W")]
WashSale,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum ToFrom {
To,
From,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum InOut {
IN,
OUT,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum DeliveredReceived {
Delivered,
Received,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum LevelOfDetail {
Summary,
Detail,
Execution,
Lot,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum SecurityIdType {
#[serde(rename = "CUSIP")]
Cusip,
#[serde(rename = "ISIN")]
Isin,
#[serde(rename = "FIGI")]
Figi,
#[serde(rename = "SEDOL")]
Sedol,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum SubCategory {
#[serde(rename = "ETF")]
Etf,
#[serde(rename = "ADR")]
Adr,
#[serde(rename = "REIT")]
Reit,
#[serde(rename = "Preferred")]
Preferred,
#[serde(rename = "Common")]
Common,
#[serde(rename = "DR")]
DepositaryReceipt,
#[serde(rename = "GDR")]
Gdr,
#[serde(rename = "LP")]
LimitedPartnership,
#[serde(rename = "MLP")]
MasterLimitedPartnership,
#[serde(rename = "Right")]
Right,
#[serde(rename = "Unit")]
Unit,
#[serde(rename = "WI")]
WhenIssued,
#[serde(rename = "Tracking")]
Tracking,
#[serde(rename = "CEF")]
ClosedEndFund,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(tag = "type")]
pub enum DerivativeInfo {
Option {
strike: Decimal,
expiry: NaiveDate,
#[serde(rename = "putCall")]
put_call: PutCall,
#[serde(rename = "underlyingSymbol")]
underlying_symbol: String,
#[serde(rename = "underlyingConid")]
underlying_conid: Option<String>,
},
Future {
expiry: NaiveDate,
#[serde(rename = "underlyingSymbol")]
underlying_symbol: String,
#[serde(rename = "underlyingConid")]
underlying_conid: Option<String>,
},
FutureOption {
strike: Decimal,
expiry: NaiveDate,
#[serde(rename = "putCall")]
put_call: PutCall,
#[serde(rename = "underlyingSymbol")]
underlying_symbol: String,
#[serde(rename = "underlyingConid")]
underlying_conid: Option<String>,
},
Warrant {
strike: Option<Decimal>,
expiry: Option<NaiveDate>,
#[serde(rename = "underlyingSymbol")]
underlying_symbol: Option<String>,
},
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_asset_category_basic() {
let stock = AssetCategory::Stock;
assert_eq!(stock, AssetCategory::Stock);
assert_ne!(stock, AssetCategory::Option);
}
#[test]
fn test_buy_sell_basic() {
let buy = BuySell::Buy;
assert_eq!(buy, BuySell::Buy);
assert_ne!(buy, BuySell::Sell);
}
#[test]
fn test_open_close_basic() {
let open = OpenClose::Open;
assert_eq!(open, OpenClose::Open);
assert_ne!(open, OpenClose::Close);
}
#[test]
fn test_put_call_basic() {
let call = PutCall::Call;
assert_eq!(call, PutCall::Call);
assert_ne!(call, PutCall::Put);
}
}