1use chrono::NaiveDate;
4use rust_decimal::Decimal;
5use serde::{Deserialize, Serialize};
6
7use super::common::{
8 AssetCategory, BuySell, CashTransactionType, DerivativeInfo, LevelOfDetail, OpenClose,
9 OrderType, PutCall, SecurityIdType, SubCategory, TradeType,
10};
11use crate::parsers::xml_utils::{
12 deserialize_optional_bool, deserialize_optional_date, deserialize_optional_decimal,
13 deserialize_optional_string,
14};
15use serde::de::IntoDeserializer;
16
17#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
51#[serde(rename = "FlexQueryResponse")]
52pub struct FlexQueryResponse {
53 #[serde(rename = "@queryName", default)]
55 pub query_name: Option<String>,
56
57 #[serde(rename = "@type", default)]
59 pub query_type: Option<String>,
60
61 #[serde(rename = "FlexStatements")]
63 pub statements: FlexStatementsWrapper,
64}
65
66#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
68pub struct FlexStatementsWrapper {
69 #[serde(rename = "@count", default)]
71 pub count: Option<String>,
72
73 #[serde(rename = "FlexStatement")]
75 pub statements: Vec<ActivityFlexStatement>,
76}
77
78#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
124#[serde(rename = "FlexStatement")]
125pub struct ActivityFlexStatement {
126 #[serde(
128 rename = "@accountId",
129 default,
130 deserialize_with = "deserialize_optional_string"
131 )]
132 pub account_id: Option<String>,
133
134 #[serde(
136 rename = "@fromDate",
137 default,
138 deserialize_with = "deserialize_optional_date"
139 )]
140 pub from_date: Option<NaiveDate>,
141
142 #[serde(
144 rename = "@toDate",
145 default,
146 deserialize_with = "deserialize_optional_date"
147 )]
148 pub to_date: Option<NaiveDate>,
149
150 #[serde(
152 rename = "@whenGenerated",
153 default,
154 deserialize_with = "deserialize_optional_string"
155 )]
156 pub when_generated: Option<String>, #[serde(
164 rename = "@period",
165 default,
166 deserialize_with = "deserialize_optional_string"
167 )]
168 pub period: Option<String>,
169
170 #[serde(rename = "Trades", default)]
172 pub trades: TradesWrapper,
173
174 #[serde(rename = "OpenPositions", default)]
176 pub positions: PositionsWrapper,
177
178 #[serde(rename = "CashTransactions", default)]
180 pub cash_transactions: CashTransactionsWrapper,
181
182 #[serde(rename = "CorporateActions", default)]
184 pub corporate_actions: CorporateActionsWrapper,
185
186 #[serde(rename = "SecuritiesInfo", default)]
188 pub securities_info: SecuritiesInfoWrapper,
189
190 #[serde(rename = "ConversionRates", default)]
192 pub conversion_rates: ConversionRatesWrapper,
193
194 #[serde(rename = "AccountInformation", default)]
197 pub account_information: Option<super::extended::AccountInformation>,
198
199 #[serde(rename = "ChangeInNAV", default)]
201 pub change_in_nav: Option<super::extended::ChangeInNAV>,
202
203 #[serde(rename = "EquitySummaryInBase", default)]
205 pub equity_summary: EquitySummaryWrapper,
206
207 #[serde(rename = "CashReport", default)]
209 pub cash_report: CashReportWrapper,
210
211 #[serde(rename = "TradeConfirms", default)]
213 pub trade_confirms: TradeConfirmsWrapper,
214
215 #[serde(rename = "OptionEAE", default)]
217 pub option_eae: OptionEAEWrapper,
218
219 #[serde(rename = "FxTransactions", default)]
221 pub fx_transactions: FxTransactionsWrapper,
222
223 #[serde(rename = "ChangeInDividendAccruals", default)]
225 pub change_in_dividend_accruals: ChangeInDividendAccrualsWrapper,
226
227 #[serde(rename = "OpenDividendAccruals", default)]
229 pub open_dividend_accruals: OpenDividendAccrualsWrapper,
230
231 #[serde(rename = "InterestAccruals", default)]
233 pub interest_accruals: InterestAccrualsWrapper,
234
235 #[serde(rename = "Transfers", default)]
237 pub transfers: TransfersWrapper,
238
239 #[serde(rename = "MTMPerformanceSummaryInBase", default)]
242 pub mtm_performance_summary: MTMPerformanceSummaryWrapper,
243
244 #[serde(rename = "FIFOPerformanceSummaryInBase", default)]
246 pub fifo_performance_summary: FIFOPerformanceSummaryWrapper,
247
248 #[serde(rename = "MTDYTDPerformanceSummary", default)]
250 pub mtd_ytd_performance_summary: MTDYTDPerformanceSummaryWrapper,
251
252 #[serde(rename = "StmtFunds", default)]
254 pub statement_of_funds: StatementOfFundsWrapper,
255
256 #[serde(rename = "ChangeInPositionValues", default)]
258 pub change_in_position_values: ChangeInPositionValueWrapper,
259
260 #[serde(rename = "UnbundledCommissionDetails", default)]
262 pub unbundled_commission_details: UnbundledCommissionDetailWrapper,
263
264 #[serde(rename = "ClientFees", default)]
266 pub client_fees: ClientFeesWrapper,
267
268 #[serde(rename = "ClientFeesDetail", alias = "ClientFeesDetails", default)]
274 pub client_fees_detail: ClientFeesDetailWrapper,
275
276 #[serde(rename = "SLBActivities", default)]
278 pub slb_activities: SLBActivitiesWrapper,
279
280 #[serde(rename = "SLBFees", default)]
282 pub slb_fees: SLBFeesWrapper,
283
284 #[serde(rename = "HardToBorrowDetails", default)]
286 pub hard_to_borrow_details: HardToBorrowDetailsWrapper,
287
288 #[serde(rename = "FxLots", default)]
290 pub fx_lots: FxLotsWrapper,
291
292 #[serde(rename = "UnsettledTransfers", default)]
294 pub unsettled_transfers: UnsettledTransfersWrapper,
295
296 #[serde(rename = "TradeTransfers", default)]
298 pub trade_transfers: TradeTransfersWrapper,
299
300 #[serde(rename = "PriorPeriodPositions", default)]
302 pub prior_period_positions: PriorPeriodPositionsWrapper,
303
304 #[serde(rename = "TierInterestDetails", default)]
306 pub tier_interest_details: TierInterestDetailsWrapper,
307
308 #[serde(rename = "DebitCardActivities", default)]
310 pub debit_card_activities: DebitCardActivitiesWrapper,
311
312 #[serde(rename = "SalesTaxes", default)]
314 pub sales_tax: SalesTaxWrapper,
315
316 #[serde(rename = "DepositsOnHold", default, skip_serializing)]
324 deposits_on_hold: IgnoredSection,
325 #[serde(rename = "FxPositions", default, skip_serializing)]
326 fx_positions: IgnoredSection,
327 #[serde(rename = "NetStockPositions", default)]
329 pub net_stock_positions: NetStockPositionsWrapper,
330 #[serde(rename = "ComplexPositions", default, skip_serializing)]
331 complex_positions: IgnoredSection,
332 #[serde(rename = "CFDCharges", default)]
334 pub cfd_charges: CFDChargesWrapper,
335 #[serde(rename = "CommissionCredits", default, skip_serializing)]
336 commission_credits: IgnoredSection,
337 #[serde(rename = "FdicInsuredDepositsByBank", default, skip_serializing)]
338 fdic_insured_deposits: IgnoredSection,
339 #[serde(rename = "HKIPOOpenSubscriptions", default, skip_serializing)]
340 hk_ipo_open_subscriptions: IgnoredSection,
341 #[serde(rename = "HKIPOSubscriptionActivity", default, skip_serializing)]
342 hk_ipo_subscription_activity: IgnoredSection,
343 #[serde(rename = "IBGNoteTransactions", default, skip_serializing)]
344 ibg_note_transactions: IgnoredSection,
345 #[serde(rename = "IncentiveCouponAccrualDetails", default, skip_serializing)]
346 incentive_coupon_accruals: IgnoredSection,
347 #[serde(rename = "MutualFundDividendDetails", default, skip_serializing)]
348 mutual_fund_dividends: IgnoredSection,
349 #[serde(rename = "NetStockPositionSummary", default, skip_serializing)]
350 net_stock_position_summary: IgnoredSection,
351 #[serde(rename = "PendingExcercises", default, skip_serializing)]
352 pending_exercises: IgnoredSection,
353 #[serde(rename = "RoutingCommissions", default, skip_serializing)]
354 routing_commissions: IgnoredSection,
355 #[serde(rename = "SLBCollaterals", default, skip_serializing)]
356 slb_collaterals: IgnoredSection,
357 #[serde(rename = "SLBOpenContracts", default)]
359 pub slb_open_contracts: SLBOpenContractsWrapper,
360 #[serde(rename = "SoftDollars", default, skip_serializing)]
361 soft_dollars: IgnoredSection,
362 #[serde(rename = "StockGrantActivities", default)]
364 pub stock_grant_activities: StockGrantActivitiesWrapper,
365 #[serde(rename = "TransactionTaxes", default)]
367 pub transaction_taxes: TransactionTaxesWrapper,
368 #[serde(rename = "UnbookedTrades", default, skip_serializing)]
369 unbooked_trades: IgnoredSection,
370 }
373
374#[derive(Debug, Clone, PartialEq, Default)]
376struct IgnoredSection;
377
378impl<'de> serde::Deserialize<'de> for IgnoredSection {
379 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
380 where
381 D: serde::Deserializer<'de>,
382 {
383 serde::de::IgnoredAny::deserialize(deserializer)?;
385 Ok(IgnoredSection)
386 }
387}
388
389#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
394#[serde(rename_all = "PascalCase")]
395enum TradesItem {
396 Trade(Trade),
397 Order(Trade),
398 SymbolSummary(Trade),
399 AssetSummary(Trade),
400 WashSale(Trade),
401 Lot(Trade),
402}
403
404#[derive(Debug, Clone, PartialEq, Default, Serialize)]
414pub struct TradesWrapper {
415 pub items: Vec<Trade>,
417
418 pub wash_sales: Vec<Trade>,
420
421 pub lots: Vec<Trade>,
424
425 pub orders: Vec<Trade>,
427
428 pub symbol_summaries: Vec<Trade>,
430
431 pub asset_summaries: Vec<Trade>,
433}
434
435impl<'de> serde::Deserialize<'de> for TradesWrapper {
436 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
437 where
438 D: serde::Deserializer<'de>,
439 {
440 #[derive(Deserialize)]
441 struct Raw {
442 #[serde(rename = "$value", default)]
443 items: Vec<TradesItem>,
444 }
445
446 let raw = Raw::deserialize(deserializer)?;
447
448 let mut trades = Vec::new();
449 let mut wash_sales = Vec::new();
450 let mut lots = Vec::new();
451 let mut orders = Vec::new();
452 let mut symbol_summaries = Vec::new();
453 let mut asset_summaries = Vec::new();
454
455 for item in raw.items {
456 match item {
457 TradesItem::Trade(t) => trades.push(t),
458 TradesItem::WashSale(t) => wash_sales.push(t),
459 TradesItem::Lot(t) => lots.push(t),
460 TradesItem::Order(t) => orders.push(t),
461 TradesItem::SymbolSummary(t) => symbol_summaries.push(t),
462 TradesItem::AssetSummary(t) => asset_summaries.push(t),
463 }
464 }
465
466 Ok(TradesWrapper {
467 items: trades,
468 wash_sales,
469 lots,
470 orders,
471 symbol_summaries,
472 asset_summaries,
473 })
474 }
475}
476
477#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
479pub struct PositionsWrapper {
480 #[serde(rename = "OpenPosition", default)]
482 pub items: Vec<Position>,
483}
484
485#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
487pub struct CashTransactionsWrapper {
488 #[serde(rename = "CashTransaction", default)]
490 pub items: Vec<CashTransaction>,
491}
492
493#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
495pub struct CorporateActionsWrapper {
496 #[serde(rename = "CorporateAction", default)]
498 pub items: Vec<CorporateAction>,
499}
500
501#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
503pub struct NetStockPositionsWrapper {
504 #[serde(rename = "NetStockPosition", default)]
506 pub items: Vec<super::extended::NetStockPosition>,
507}
508
509#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
511pub struct CFDChargesWrapper {
512 #[serde(rename = "CFDCharge", default)]
514 pub items: Vec<super::extended::CFDCharge>,
515}
516
517#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
519pub struct SLBOpenContractsWrapper {
520 #[serde(rename = "SLBOpenContract", default)]
522 pub items: Vec<super::extended::SLBOpenContract>,
523}
524
525#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
527pub struct StockGrantActivitiesWrapper {
528 #[serde(rename = "StockGrantActivity", default)]
530 pub items: Vec<super::extended::StockGrantActivity>,
531}
532
533#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
535pub struct TransactionTaxesWrapper {
536 #[serde(rename = "TransactionTax", default)]
538 pub items: Vec<super::extended::TransactionTax>,
539
540 #[serde(rename = "TransactionTaxDetail", default)]
544 pub details: Vec<super::extended::TransactionTaxDetail>,
545}
546
547#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
594pub struct Trade {
595 #[serde(
601 rename = "@accountId",
602 default,
603 deserialize_with = "deserialize_optional_string"
604 )]
605 pub account_id: Option<String>,
606
607 #[serde(rename = "@transactionID", default)]
609 pub transaction_id: Option<String>,
610
611 #[serde(
614 rename = "@conid",
615 default,
616 deserialize_with = "deserialize_optional_string"
617 )]
618 pub conid: Option<String>,
619
620 #[serde(
622 rename = "@symbol",
623 default,
624 deserialize_with = "deserialize_optional_string"
625 )]
626 pub symbol: Option<String>,
627
628 #[serde(rename = "@description", default)]
630 pub description: Option<String>,
631
632 #[serde(rename = "@assetCategory", default)]
634 pub asset_category: Option<AssetCategory>,
635
636 #[serde(rename = "@cusip", default)]
638 pub cusip: Option<String>,
639
640 #[serde(rename = "@isin", default)]
642 pub isin: Option<String>,
643
644 #[serde(rename = "@figi", default)]
646 pub figi: Option<String>,
647
648 #[serde(rename = "@securityID", default)]
650 pub security_id: Option<String>,
651
652 #[serde(rename = "@securityIDType", default)]
654 pub security_id_type: Option<SecurityIdType>,
655
656 #[serde(
659 rename = "@multiplier",
660 default,
661 deserialize_with = "deserialize_optional_decimal"
662 )]
663 pub multiplier: Option<Decimal>,
664
665 #[serde(
667 rename = "@strike",
668 default,
669 deserialize_with = "deserialize_optional_decimal"
670 )]
671 pub strike: Option<Decimal>,
672
673 #[serde(
675 rename = "@expiry",
676 default,
677 deserialize_with = "deserialize_optional_date"
678 )]
679 pub expiry: Option<NaiveDate>,
680
681 #[serde(rename = "@putCall", default)]
683 pub put_call: Option<PutCall>,
684
685 #[serde(rename = "@underlyingConid", default)]
687 pub underlying_conid: Option<String>,
688
689 #[serde(rename = "@underlyingSymbol", default)]
691 pub underlying_symbol: Option<String>,
692
693 #[serde(
696 rename = "@tradeDate",
697 default,
698 deserialize_with = "deserialize_optional_date"
699 )]
700 pub trade_date: Option<NaiveDate>,
701
702 #[serde(
704 rename = "@settleDateTarget",
705 default,
706 deserialize_with = "deserialize_optional_date"
707 )]
708 pub settle_date: Option<NaiveDate>,
709
710 #[serde(rename = "@buySell", default)]
712 pub buy_sell: Option<BuySell>,
713
714 #[serde(rename = "@openCloseIndicator", default)]
716 pub open_close: Option<OpenClose>,
717
718 #[serde(rename = "@transactionType", default)]
720 pub transaction_type: Option<TradeType>,
721
722 #[serde(
725 rename = "@quantity",
726 default,
727 deserialize_with = "deserialize_optional_decimal"
728 )]
729 pub quantity: Option<Decimal>,
730
731 #[serde(
737 rename = "@tradePrice",
738 alias = "@price",
739 default,
740 deserialize_with = "deserialize_optional_decimal"
741 )]
742 pub price: Option<Decimal>,
743
744 #[serde(
746 rename = "@proceeds",
747 default,
748 deserialize_with = "deserialize_optional_decimal"
749 )]
750 pub proceeds: Option<Decimal>,
751
752 #[serde(
754 rename = "@cost",
755 default,
756 deserialize_with = "deserialize_optional_decimal"
757 )]
758 pub cost: Option<Decimal>,
759
760 #[serde(
763 rename = "@ibCommission",
764 default,
765 deserialize_with = "deserialize_optional_decimal"
766 )]
767 pub commission: Option<Decimal>,
768
769 #[serde(
771 rename = "@taxes",
772 default,
773 deserialize_with = "deserialize_optional_decimal"
774 )]
775 pub taxes: Option<Decimal>,
776
777 #[serde(
779 rename = "@netCash",
780 default,
781 deserialize_with = "deserialize_optional_decimal"
782 )]
783 pub net_cash: Option<Decimal>,
784
785 #[serde(
788 rename = "@fifoPnlRealized",
789 default,
790 deserialize_with = "deserialize_optional_decimal"
791 )]
792 pub fifo_pnl_realized: Option<Decimal>,
793
794 #[serde(
796 rename = "@mtmPnl",
797 default,
798 deserialize_with = "deserialize_optional_decimal"
799 )]
800 pub mtm_pnl: Option<Decimal>,
801
802 #[serde(
804 rename = "@fxPnl",
805 default,
806 deserialize_with = "deserialize_optional_decimal"
807 )]
808 pub fx_pnl: Option<Decimal>,
809
810 #[serde(
813 rename = "@currency",
814 default,
815 deserialize_with = "deserialize_optional_string"
816 )]
817 pub currency: Option<String>,
818
819 #[serde(
821 rename = "@fxRateToBase",
822 default,
823 deserialize_with = "deserialize_optional_decimal"
824 )]
825 pub fx_rate_to_base: Option<Decimal>,
826
827 #[serde(
830 rename = "@origTradeDate",
831 default,
832 deserialize_with = "deserialize_optional_date"
833 )]
834 pub orig_trade_date: Option<NaiveDate>,
835
836 #[serde(
838 rename = "@origTradePrice",
839 default,
840 deserialize_with = "deserialize_optional_decimal"
841 )]
842 pub orig_trade_price: Option<Decimal>,
843
844 #[serde(rename = "@origTradeID", default)]
846 pub orig_trade_id: Option<String>,
847
848 #[serde(rename = "@holdingPeriodDateTime", default)]
850 pub holding_period_date_time: Option<String>,
851
852 #[serde(rename = "@openDateTime", default)]
854 pub open_date_time: Option<String>,
855
856 #[serde(rename = "@whenReopened", default)]
858 pub when_reopened: Option<String>,
859
860 #[serde(rename = "@notes", default)]
862 pub notes: Option<String>,
863
864 #[serde(rename = "@ibOrderID", alias = "@orderID", default)]
873 pub ib_order_id: Option<String>,
874
875 #[serde(rename = "@execID", default)]
881 pub exec_id: Option<String>,
882
883 #[serde(rename = "@tradeID", default)]
885 pub trade_id: Option<String>,
886
887 #[serde(rename = "@origTransactionID", default)]
889 pub orig_transaction_id: Option<String>,
890
891 #[serde(rename = "@origOrderID", default)]
893 pub orig_order_id: Option<String>,
894
895 #[serde(rename = "@dateTime", default)]
898 pub trade_time: Option<String>,
899
900 #[serde(rename = "@whenRealized", default)]
902 pub when_realized: Option<String>,
903
904 #[serde(rename = "@orderTime", default)]
906 pub order_time: Option<String>,
907
908 #[serde(rename = "@orderType", default)]
911 pub order_type: Option<OrderType>,
912
913 #[serde(rename = "@brokerageOrderID", default)]
915 pub brokerage_order_id: Option<String>,
916
917 #[serde(rename = "@orderReference", default)]
919 pub order_reference: Option<String>,
920
921 #[serde(rename = "@exchOrderId", default)]
923 pub exch_order_id: Option<String>,
924
925 #[serde(rename = "@extExecID", default)]
927 pub ext_exec_id: Option<String>,
928
929 #[serde(rename = "@ibExecID", default)]
931 pub ib_exec_id: Option<String>,
932
933 #[serde(rename = "@issuer", default)]
936 pub issuer: Option<String>,
937
938 #[serde(rename = "@issuerCountryCode", default)]
940 pub issuer_country_code: Option<String>,
941
942 #[serde(rename = "@subCategory", default)]
944 pub sub_category: Option<SubCategory>,
945
946 #[serde(rename = "@listingExchange", default)]
948 pub listing_exchange: Option<String>,
949
950 #[serde(rename = "@underlyingListingExchange", default)]
953 pub underlying_listing_exchange: Option<String>,
954
955 #[serde(rename = "@underlyingSecurityID", default)]
957 pub underlying_security_id: Option<String>,
958
959 #[serde(rename = "@traderID", default)]
962 pub trader_id: Option<String>,
963
964 #[serde(
966 rename = "@isAPIOrder",
967 default,
968 deserialize_with = "deserialize_optional_bool"
969 )]
970 pub is_api_order: Option<bool>,
971
972 #[serde(rename = "@volatilityOrderLink", default)]
974 pub volatility_order_link: Option<String>,
975
976 #[serde(rename = "@clearingFirmID", default)]
978 pub clearing_firm_id: Option<String>,
979
980 #[serde(rename = "@levelOfDetail", default)]
982 pub level_of_detail: Option<LevelOfDetail>,
983
984 #[serde(
987 rename = "@amount",
988 default,
989 deserialize_with = "deserialize_optional_decimal"
990 )]
991 pub amount: Option<Decimal>,
992
993 #[serde(
995 rename = "@tradeMoney",
996 default,
997 deserialize_with = "deserialize_optional_decimal"
998 )]
999 pub trade_money: Option<Decimal>,
1000
1001 #[serde(
1003 rename = "@closePrice",
1004 default,
1005 deserialize_with = "deserialize_optional_decimal"
1006 )]
1007 pub close_price: Option<Decimal>,
1008
1009 #[serde(
1011 rename = "@changeInPrice",
1012 default,
1013 deserialize_with = "deserialize_optional_decimal"
1014 )]
1015 pub change_in_price: Option<Decimal>,
1016
1017 #[serde(
1019 rename = "@changeInQuantity",
1020 default,
1021 deserialize_with = "deserialize_optional_decimal"
1022 )]
1023 pub change_in_quantity: Option<Decimal>,
1024
1025 #[serde(rename = "@ibCommissionCurrency", default)]
1027 pub commission_currency: Option<String>,
1028
1029 #[serde(rename = "@relatedTradeID", default)]
1032 pub related_trade_id: Option<String>,
1033
1034 #[serde(rename = "@relatedTransactionID", default)]
1036 pub related_transaction_id: Option<String>,
1037
1038 #[serde(
1041 rename = "@accruedInt",
1042 default,
1043 deserialize_with = "deserialize_optional_decimal"
1044 )]
1045 pub accrued_int: Option<Decimal>,
1046
1047 #[serde(
1049 rename = "@principalAdjustFactor",
1050 default,
1051 deserialize_with = "deserialize_optional_decimal"
1052 )]
1053 pub principal_adjust_factor: Option<Decimal>,
1054
1055 #[serde(rename = "@serialNumber", default)]
1058 pub serial_number: Option<String>,
1059
1060 #[serde(rename = "@deliveryType", default)]
1062 pub delivery_type: Option<String>,
1063
1064 #[serde(rename = "@commodityType", default)]
1066 pub commodity_type: Option<String>,
1067
1068 #[serde(
1070 rename = "@fineness",
1071 default,
1072 deserialize_with = "deserialize_optional_decimal"
1073 )]
1074 pub fineness: Option<Decimal>,
1075
1076 #[serde(rename = "@weight", default)]
1078 pub weight: Option<String>,
1079
1080 #[serde(
1083 rename = "@reportDate",
1084 default,
1085 deserialize_with = "deserialize_optional_date"
1086 )]
1087 pub report_date: Option<NaiveDate>,
1088
1089 #[serde(rename = "@exchange", default)]
1091 pub exchange: Option<String>,
1092
1093 #[serde(rename = "@model", default)]
1095 pub model: Option<String>,
1096
1097 #[serde(rename = "@acctAlias", default)]
1099 pub acct_alias: Option<String>,
1100
1101 #[serde(rename = "@rtn", default)]
1103 pub rtn: Option<String>,
1104
1105 #[serde(rename = "@positionActionID", default)]
1107 pub position_action_id: Option<String>,
1108
1109 #[serde(
1114 rename = "@initialInvestment",
1115 default,
1116 deserialize_with = "deserialize_optional_string"
1117 )]
1118 pub initial_investment: Option<String>,
1119
1120 #[serde(
1122 rename = "@netCashInBase",
1123 default,
1124 deserialize_with = "deserialize_optional_decimal"
1125 )]
1126 pub net_cash_in_base: Option<Decimal>,
1127
1128 #[serde(
1130 rename = "@capitalGainsPnl",
1131 default,
1132 deserialize_with = "deserialize_optional_decimal"
1133 )]
1134 pub capital_gains_pnl: Option<Decimal>,
1135
1136 #[serde(rename = "@sedol", default)]
1138 pub sedol: Option<String>,
1139
1140 #[serde(
1142 rename = "@tradeTime",
1143 default,
1144 deserialize_with = "deserialize_optional_string"
1145 )]
1146 pub trade_time_trad: Option<String>,
1147}
1148
1149impl Trade {
1150 pub fn derivative(&self) -> Option<DerivativeInfo> {
1183 match self.asset_category? {
1184 AssetCategory::Option => {
1185 let strike = self.strike?;
1187 let expiry = self.expiry?;
1188 let put_call = self.put_call?;
1189 let underlying_symbol = self.underlying_symbol.clone()?;
1190
1191 Some(DerivativeInfo::Option {
1192 strike,
1193 expiry,
1194 put_call,
1195 underlying_symbol,
1196 underlying_conid: self.underlying_conid.clone(),
1197 })
1198 }
1199 AssetCategory::Future => {
1200 let expiry = self.expiry?;
1202 let underlying_symbol = self.underlying_symbol.clone()?;
1203
1204 Some(DerivativeInfo::Future {
1205 expiry,
1206 underlying_symbol,
1207 underlying_conid: self.underlying_conid.clone(),
1208 })
1209 }
1210 AssetCategory::FutureOption => {
1211 let strike = self.strike?;
1213 let expiry = self.expiry?;
1214 let put_call = self.put_call?;
1215 let underlying_symbol = self.underlying_symbol.clone()?;
1216
1217 Some(DerivativeInfo::FutureOption {
1218 strike,
1219 expiry,
1220 put_call,
1221 underlying_symbol,
1222 underlying_conid: self.underlying_conid.clone(),
1223 })
1224 }
1225 AssetCategory::Warrant => {
1226 let underlying_symbol = self.underlying_symbol.clone()?;
1228
1229 Some(DerivativeInfo::Warrant {
1230 strike: self.strike,
1231 expiry: self.expiry,
1232 underlying_symbol: Some(underlying_symbol),
1233 })
1234 }
1235 _ => None,
1237 }
1238 }
1239}
1240
1241#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
1280pub struct Position {
1281 #[serde(
1287 rename = "@accountId",
1288 default,
1289 deserialize_with = "deserialize_optional_string"
1290 )]
1291 pub account_id: Option<String>,
1292
1293 #[serde(
1296 rename = "@conid",
1297 default,
1298 deserialize_with = "deserialize_optional_string"
1299 )]
1300 pub conid: Option<String>,
1301
1302 #[serde(
1304 rename = "@symbol",
1305 default,
1306 deserialize_with = "deserialize_optional_string"
1307 )]
1308 pub symbol: Option<String>,
1309
1310 #[serde(rename = "@description", default)]
1312 pub description: Option<String>,
1313
1314 #[serde(rename = "@assetCategory", default)]
1316 pub asset_category: Option<AssetCategory>,
1317
1318 #[serde(rename = "@cusip", default)]
1320 pub cusip: Option<String>,
1321
1322 #[serde(rename = "@isin", default)]
1324 pub isin: Option<String>,
1325
1326 #[serde(rename = "@figi", default)]
1328 pub figi: Option<String>,
1329
1330 #[serde(rename = "@securityID", default)]
1332 pub security_id: Option<String>,
1333
1334 #[serde(rename = "@securityIDType", default)]
1336 pub security_id_type: Option<SecurityIdType>,
1337
1338 #[serde(
1341 rename = "@multiplier",
1342 default,
1343 deserialize_with = "deserialize_optional_decimal"
1344 )]
1345 pub multiplier: Option<Decimal>,
1346
1347 #[serde(
1349 rename = "@strike",
1350 default,
1351 deserialize_with = "deserialize_optional_decimal"
1352 )]
1353 pub strike: Option<Decimal>,
1354
1355 #[serde(
1357 rename = "@expiry",
1358 default,
1359 deserialize_with = "deserialize_optional_date"
1360 )]
1361 pub expiry: Option<NaiveDate>,
1362
1363 #[serde(rename = "@putCall", default)]
1365 pub put_call: Option<PutCall>,
1366
1367 #[serde(rename = "@underlyingConid", default)]
1369 pub underlying_conid: Option<String>,
1370
1371 #[serde(rename = "@underlyingSymbol", default)]
1373 pub underlying_symbol: Option<String>,
1374
1375 #[serde(
1378 rename = "@position",
1379 default,
1380 deserialize_with = "deserialize_optional_decimal"
1381 )]
1382 pub quantity: Option<Decimal>,
1383
1384 #[serde(
1386 rename = "@markPrice",
1387 default,
1388 deserialize_with = "deserialize_optional_decimal"
1389 )]
1390 pub mark_price: Option<Decimal>,
1391
1392 #[serde(
1394 rename = "@positionValue",
1395 default,
1396 deserialize_with = "deserialize_optional_decimal"
1397 )]
1398 pub position_value: Option<Decimal>,
1399
1400 #[serde(rename = "@side", default)]
1402 pub side: Option<String>,
1403
1404 #[serde(
1407 rename = "@openPrice",
1408 default,
1409 deserialize_with = "deserialize_optional_decimal"
1410 )]
1411 pub open_price: Option<Decimal>,
1412
1413 #[serde(
1415 rename = "@costBasisPrice",
1416 default,
1417 deserialize_with = "deserialize_optional_decimal"
1418 )]
1419 pub cost_basis_price: Option<Decimal>,
1420
1421 #[serde(
1423 rename = "@costBasisMoney",
1424 default,
1425 deserialize_with = "deserialize_optional_decimal"
1426 )]
1427 pub cost_basis_money: Option<Decimal>,
1428
1429 #[serde(
1431 rename = "@fifoPnlUnrealized",
1432 default,
1433 deserialize_with = "deserialize_optional_decimal"
1434 )]
1435 pub fifo_pnl_unrealized: Option<Decimal>,
1436
1437 #[serde(
1439 rename = "@percentOfNAV",
1440 default,
1441 deserialize_with = "deserialize_optional_decimal"
1442 )]
1443 pub percent_of_nav: Option<Decimal>,
1444
1445 #[serde(
1448 rename = "@currency",
1449 default,
1450 deserialize_with = "deserialize_optional_string"
1451 )]
1452 pub currency: Option<String>,
1453
1454 #[serde(
1456 rename = "@fxRateToBase",
1457 default,
1458 deserialize_with = "deserialize_optional_decimal"
1459 )]
1460 pub fx_rate_to_base: Option<Decimal>,
1461
1462 #[serde(
1465 rename = "@reportDate",
1466 default,
1467 deserialize_with = "deserialize_optional_date"
1468 )]
1469 pub report_date: Option<NaiveDate>,
1470
1471 #[serde(rename = "@holdingPeriodDateTime", default)]
1474 pub holding_period_date_time: Option<String>,
1475
1476 #[serde(rename = "@openDateTime", default)]
1478 pub open_date_time: Option<String>,
1479
1480 #[serde(rename = "@originatingTransactionID", default)]
1482 pub originating_transaction_id: Option<String>,
1483
1484 #[serde(rename = "@code", default)]
1486 pub code: Option<String>,
1487
1488 #[serde(rename = "@originatingOrderID", default)]
1494 pub originating_order_id: Option<String>,
1495
1496 #[serde(rename = "@issuer", default)]
1499 pub issuer: Option<String>,
1500
1501 #[serde(rename = "@issuerCountryCode", default)]
1503 pub issuer_country_code: Option<String>,
1504
1505 #[serde(rename = "@subCategory", default)]
1507 pub sub_category: Option<SubCategory>,
1508
1509 #[serde(rename = "@listingExchange", default)]
1511 pub listing_exchange: Option<String>,
1512
1513 #[serde(rename = "@underlyingListingExchange", default)]
1516 pub underlying_listing_exchange: Option<String>,
1517
1518 #[serde(rename = "@underlyingSecurityID", default)]
1520 pub underlying_security_id: Option<String>,
1521
1522 #[serde(
1525 rename = "@accruedInt",
1526 default,
1527 deserialize_with = "deserialize_optional_decimal"
1528 )]
1529 pub accrued_int: Option<Decimal>,
1530
1531 #[serde(
1533 rename = "@principalAdjustFactor",
1534 default,
1535 deserialize_with = "deserialize_optional_decimal"
1536 )]
1537 pub principal_adjust_factor: Option<Decimal>,
1538
1539 #[serde(rename = "@serialNumber", default)]
1542 pub serial_number: Option<String>,
1543
1544 #[serde(rename = "@deliveryType", default)]
1546 pub delivery_type: Option<String>,
1547
1548 #[serde(rename = "@commodityType", default)]
1550 pub commodity_type: Option<String>,
1551
1552 #[serde(
1554 rename = "@fineness",
1555 default,
1556 deserialize_with = "deserialize_optional_decimal"
1557 )]
1558 pub fineness: Option<Decimal>,
1559
1560 #[serde(rename = "@weight", default)]
1562 pub weight: Option<String>,
1563
1564 #[serde(rename = "@levelOfDetail", default)]
1567 pub level_of_detail: Option<LevelOfDetail>,
1568
1569 #[serde(rename = "@model", default)]
1571 pub model: Option<String>,
1572
1573 #[serde(rename = "@acctAlias", default)]
1575 pub acct_alias: Option<String>,
1576
1577 #[serde(
1579 rename = "@vestingDate",
1580 default,
1581 deserialize_with = "deserialize_optional_date"
1582 )]
1583 pub vesting_date: Option<NaiveDate>,
1584
1585 #[serde(
1587 rename = "@sedol",
1588 default,
1589 deserialize_with = "deserialize_optional_string"
1590 )]
1591 pub sedol: Option<String>,
1592
1593 #[serde(
1595 rename = "@positionValueInBase",
1596 default,
1597 deserialize_with = "deserialize_optional_decimal"
1598 )]
1599 pub position_value_in_base: Option<Decimal>,
1600
1601 #[serde(
1603 rename = "@unrealizedCapitalGainsPnl",
1604 default,
1605 deserialize_with = "deserialize_optional_decimal"
1606 )]
1607 pub unrealized_capital_gains_pnl: Option<Decimal>,
1608
1609 #[serde(
1611 rename = "@unrealizedlFxPnl",
1612 default,
1613 deserialize_with = "deserialize_optional_decimal"
1614 )]
1615 pub unrealizedl_fx_pnl: Option<Decimal>,
1616}
1617
1618impl Position {
1619 pub fn derivative(&self) -> Option<DerivativeInfo> {
1696 match self.asset_category? {
1697 AssetCategory::Option => {
1698 let strike = self.strike?;
1700 let expiry = self.expiry?;
1701 let put_call = self.put_call?;
1702 let underlying_symbol = self.underlying_symbol.clone()?;
1703
1704 Some(DerivativeInfo::Option {
1705 strike,
1706 expiry,
1707 put_call,
1708 underlying_symbol,
1709 underlying_conid: self.underlying_conid.clone(),
1710 })
1711 }
1712 AssetCategory::Future => {
1713 let expiry = self.expiry?;
1715 let underlying_symbol = self.underlying_symbol.clone()?;
1716
1717 Some(DerivativeInfo::Future {
1718 expiry,
1719 underlying_symbol,
1720 underlying_conid: self.underlying_conid.clone(),
1721 })
1722 }
1723 AssetCategory::FutureOption => {
1724 let strike = self.strike?;
1726 let expiry = self.expiry?;
1727 let put_call = self.put_call?;
1728 let underlying_symbol = self.underlying_symbol.clone()?;
1729
1730 Some(DerivativeInfo::FutureOption {
1731 strike,
1732 expiry,
1733 put_call,
1734 underlying_symbol,
1735 underlying_conid: self.underlying_conid.clone(),
1736 })
1737 }
1738 AssetCategory::Warrant => {
1739 let underlying_symbol = self.underlying_symbol.clone()?;
1741
1742 Some(DerivativeInfo::Warrant {
1743 strike: self.strike,
1744 expiry: self.expiry,
1745 underlying_symbol: Some(underlying_symbol),
1746 })
1747 }
1748 _ => None,
1750 }
1751 }
1752}
1753
1754#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
1801pub struct CashTransaction {
1802 #[serde(
1808 rename = "@accountId",
1809 default,
1810 deserialize_with = "deserialize_optional_string"
1811 )]
1812 pub account_id: Option<String>,
1813
1814 #[serde(rename = "@transactionID", default)]
1816 pub transaction_id: Option<String>,
1817
1818 #[serde(rename = "@type", default)]
1821 pub transaction_type: Option<String>,
1822
1823 #[serde(rename = "@description", default)]
1825 pub description: Option<String>,
1826
1827 #[serde(
1829 rename = "@amount",
1830 default,
1831 deserialize_with = "deserialize_optional_decimal"
1832 )]
1833 pub amount: Option<Decimal>,
1834
1835 #[serde(
1837 rename = "@currency",
1838 default,
1839 deserialize_with = "deserialize_optional_string"
1840 )]
1841 pub currency: Option<String>,
1842
1843 #[serde(
1845 rename = "@fxRateToBase",
1846 default,
1847 deserialize_with = "deserialize_optional_decimal"
1848 )]
1849 pub fx_rate_to_base: Option<Decimal>,
1850
1851 #[serde(
1854 rename = "@date",
1855 default,
1856 deserialize_with = "deserialize_optional_date"
1857 )]
1858 pub date: Option<NaiveDate>,
1859
1860 #[serde(
1862 rename = "@settleDate",
1863 default,
1864 deserialize_with = "deserialize_optional_date"
1865 )]
1866 pub settle_date: Option<NaiveDate>,
1867
1868 #[serde(
1870 rename = "@exDate",
1871 default,
1872 deserialize_with = "deserialize_optional_date"
1873 )]
1874 pub ex_date: Option<NaiveDate>,
1875
1876 #[serde(rename = "@conid", default)]
1879 pub conid: Option<String>,
1880
1881 #[serde(rename = "@symbol", default)]
1883 pub symbol: Option<String>,
1884
1885 #[serde(rename = "@assetCategory", default)]
1887 pub asset_category: Option<AssetCategory>,
1888
1889 #[serde(rename = "@cusip", default)]
1891 pub cusip: Option<String>,
1892
1893 #[serde(rename = "@isin", default)]
1895 pub isin: Option<String>,
1896
1897 #[serde(rename = "@figi", default)]
1899 pub figi: Option<String>,
1900
1901 #[serde(rename = "@securityID", default)]
1903 pub security_id: Option<String>,
1904
1905 #[serde(rename = "@securityIDType", default)]
1907 pub security_id_type: Option<SecurityIdType>,
1908
1909 #[serde(
1912 rename = "@multiplier",
1913 default,
1914 deserialize_with = "deserialize_optional_decimal"
1915 )]
1916 pub multiplier: Option<Decimal>,
1917
1918 #[serde(
1920 rename = "@strike",
1921 default,
1922 deserialize_with = "deserialize_optional_decimal"
1923 )]
1924 pub strike: Option<Decimal>,
1925
1926 #[serde(
1928 rename = "@expiry",
1929 default,
1930 deserialize_with = "deserialize_optional_date"
1931 )]
1932 pub expiry: Option<NaiveDate>,
1933
1934 #[serde(rename = "@putCall", default)]
1936 pub put_call: Option<PutCall>,
1937
1938 #[serde(rename = "@underlyingConid", default)]
1940 pub underlying_conid: Option<String>,
1941
1942 #[serde(rename = "@underlyingSymbol", default)]
1944 pub underlying_symbol: Option<String>,
1945
1946 #[serde(rename = "@code", default)]
1948 pub code: Option<String>,
1949
1950 #[serde(rename = "@dateTime", default)]
1956 pub date_time: Option<String>,
1957
1958 #[serde(
1960 rename = "@reportDate",
1961 default,
1962 deserialize_with = "deserialize_optional_date"
1963 )]
1964 pub report_date: Option<NaiveDate>,
1965
1966 #[serde(
1968 rename = "@availableForTradingDate",
1969 default,
1970 deserialize_with = "deserialize_optional_date"
1971 )]
1972 pub available_for_trading_date: Option<NaiveDate>,
1973
1974 #[serde(rename = "@actionID", default)]
1977 pub action_id: Option<String>,
1978
1979 #[serde(rename = "@tradeID", default)]
1981 pub trade_id: Option<String>,
1982
1983 #[serde(rename = "@clientReference", default)]
1985 pub client_reference: Option<String>,
1986
1987 #[serde(rename = "@issuer", default)]
1990 pub issuer: Option<String>,
1991
1992 #[serde(rename = "@issuerCountryCode", default)]
1994 pub issuer_country_code: Option<String>,
1995
1996 #[serde(rename = "@subCategory", default)]
1998 pub sub_category: Option<SubCategory>,
1999
2000 #[serde(rename = "@listingExchange", default)]
2002 pub listing_exchange: Option<String>,
2003
2004 #[serde(rename = "@underlyingListingExchange", default)]
2007 pub underlying_listing_exchange: Option<String>,
2008
2009 #[serde(rename = "@underlyingSecurityID", default)]
2011 pub underlying_security_id: Option<String>,
2012
2013 #[serde(
2016 rename = "@principalAdjustFactor",
2017 default,
2018 deserialize_with = "deserialize_optional_decimal"
2019 )]
2020 pub principal_adjust_factor: Option<Decimal>,
2021
2022 #[serde(rename = "@serialNumber", default)]
2025 pub serial_number: Option<String>,
2026
2027 #[serde(rename = "@deliveryType", default)]
2029 pub delivery_type: Option<String>,
2030
2031 #[serde(rename = "@commodityType", default)]
2033 pub commodity_type: Option<String>,
2034
2035 #[serde(
2037 rename = "@fineness",
2038 default,
2039 deserialize_with = "deserialize_optional_decimal"
2040 )]
2041 pub fineness: Option<Decimal>,
2042
2043 #[serde(rename = "@weight", default)]
2045 pub weight: Option<String>,
2046
2047 #[serde(rename = "@levelOfDetail", default)]
2050 pub level_of_detail: Option<String>,
2051
2052 #[serde(rename = "@model", default)]
2054 pub model: Option<String>,
2055
2056 #[serde(rename = "@acctAlias", default)]
2058 pub acct_alias: Option<String>,
2059
2060 #[serde(
2062 rename = "@sedol",
2063 default,
2064 deserialize_with = "deserialize_optional_string"
2065 )]
2066 pub sedol: Option<String>,
2067}
2068
2069impl CashTransaction {
2070 pub fn transaction_type_kind(&self) -> Option<CashTransactionType> {
2082 self.transaction_type.as_deref().map(|s| {
2083 let de: serde::de::value::StrDeserializer<serde::de::value::Error> =
2084 s.into_deserializer();
2085 CashTransactionType::deserialize(de).unwrap_or(CashTransactionType::Unknown)
2086 })
2087 }
2088}
2089
2090#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
2134pub struct CorporateAction {
2135 #[serde(
2141 rename = "@accountId",
2142 default,
2143 deserialize_with = "deserialize_optional_string"
2144 )]
2145 pub account_id: Option<String>,
2146
2147 #[serde(rename = "@transactionID", default)]
2149 pub transaction_id: Option<String>,
2150
2151 #[serde(rename = "@type", default)]
2154 pub action_type: Option<String>,
2155
2156 #[serde(rename = "@description", default)]
2158 pub description: Option<String>,
2159
2160 #[serde(
2163 rename = "@date",
2164 default,
2165 deserialize_with = "deserialize_optional_date"
2166 )]
2167 pub action_date: Option<NaiveDate>,
2168
2169 #[serde(
2171 rename = "@reportDate",
2172 default,
2173 deserialize_with = "deserialize_optional_date"
2174 )]
2175 pub report_date: Option<NaiveDate>,
2176
2177 #[serde(
2179 rename = "@exDate",
2180 default,
2181 deserialize_with = "deserialize_optional_date"
2182 )]
2183 pub ex_date: Option<NaiveDate>,
2184
2185 #[serde(
2187 rename = "@payDate",
2188 default,
2189 deserialize_with = "deserialize_optional_date"
2190 )]
2191 pub pay_date: Option<NaiveDate>,
2192
2193 #[serde(
2195 rename = "@recordDate",
2196 default,
2197 deserialize_with = "deserialize_optional_date"
2198 )]
2199 pub record_date: Option<NaiveDate>,
2200
2201 #[serde(
2204 rename = "@conid",
2205 default,
2206 deserialize_with = "deserialize_optional_string"
2207 )]
2208 pub conid: Option<String>,
2209
2210 #[serde(
2212 rename = "@symbol",
2213 default,
2214 deserialize_with = "deserialize_optional_string"
2215 )]
2216 pub symbol: Option<String>,
2217
2218 #[serde(rename = "@assetCategory", default)]
2220 pub asset_category: Option<AssetCategory>,
2221
2222 #[serde(rename = "@cusip", default)]
2224 pub cusip: Option<String>,
2225
2226 #[serde(rename = "@isin", default)]
2228 pub isin: Option<String>,
2229
2230 #[serde(rename = "@figi", default)]
2232 pub figi: Option<String>,
2233
2234 #[serde(rename = "@securityID", default)]
2236 pub security_id: Option<String>,
2237
2238 #[serde(rename = "@securityIDType", default)]
2240 pub security_id_type: Option<SecurityIdType>,
2241
2242 #[serde(
2245 rename = "@multiplier",
2246 default,
2247 deserialize_with = "deserialize_optional_decimal"
2248 )]
2249 pub multiplier: Option<Decimal>,
2250
2251 #[serde(
2253 rename = "@strike",
2254 default,
2255 deserialize_with = "deserialize_optional_decimal"
2256 )]
2257 pub strike: Option<Decimal>,
2258
2259 #[serde(
2261 rename = "@expiry",
2262 default,
2263 deserialize_with = "deserialize_optional_date"
2264 )]
2265 pub expiry: Option<NaiveDate>,
2266
2267 #[serde(rename = "@putCall", default)]
2269 pub put_call: Option<PutCall>,
2270
2271 #[serde(rename = "@underlyingConid", default)]
2273 pub underlying_conid: Option<String>,
2274
2275 #[serde(rename = "@underlyingSymbol", default)]
2277 pub underlying_symbol: Option<String>,
2278
2279 #[serde(
2282 rename = "@quantity",
2283 default,
2284 deserialize_with = "deserialize_optional_decimal"
2285 )]
2286 pub quantity: Option<Decimal>,
2287
2288 #[serde(
2290 rename = "@amount",
2291 default,
2292 deserialize_with = "deserialize_optional_decimal"
2293 )]
2294 pub amount: Option<Decimal>,
2295
2296 #[serde(
2298 rename = "@proceeds",
2299 default,
2300 deserialize_with = "deserialize_optional_decimal"
2301 )]
2302 pub proceeds: Option<Decimal>,
2303
2304 #[serde(
2306 rename = "@value",
2307 default,
2308 deserialize_with = "deserialize_optional_decimal"
2309 )]
2310 pub value: Option<Decimal>,
2311
2312 #[serde(
2314 rename = "@cost",
2315 default,
2316 deserialize_with = "deserialize_optional_decimal"
2317 )]
2318 pub cost: Option<Decimal>,
2319
2320 #[serde(
2323 rename = "@fifoPnlRealized",
2324 default,
2325 deserialize_with = "deserialize_optional_decimal"
2326 )]
2327 pub fifo_pnl_realized: Option<Decimal>,
2328
2329 #[serde(
2331 rename = "@mtmPnl",
2332 default,
2333 deserialize_with = "deserialize_optional_decimal"
2334 )]
2335 pub mtm_pnl: Option<Decimal>,
2336
2337 #[serde(rename = "@currency", default)]
2340 pub currency: Option<String>,
2341
2342 #[serde(
2344 rename = "@fxRateToBase",
2345 default,
2346 deserialize_with = "deserialize_optional_decimal"
2347 )]
2348 pub fx_rate_to_base: Option<Decimal>,
2349
2350 #[serde(rename = "@code", default)]
2352 pub code: Option<String>,
2353
2354 #[serde(rename = "@actionID", default)]
2360 pub action_id: Option<String>,
2361
2362 #[serde(rename = "@dateTime", default)]
2365 pub date_time: Option<String>,
2366
2367 #[serde(rename = "@issuer", default)]
2370 pub issuer: Option<String>,
2371
2372 #[serde(rename = "@issuerCountryCode", default)]
2374 pub issuer_country_code: Option<String>,
2375
2376 #[serde(rename = "@subCategory", default)]
2378 pub sub_category: Option<SubCategory>,
2379
2380 #[serde(rename = "@listingExchange", default)]
2382 pub listing_exchange: Option<String>,
2383
2384 #[serde(rename = "@underlyingListingExchange", default)]
2387 pub underlying_listing_exchange: Option<String>,
2388
2389 #[serde(rename = "@underlyingSecurityID", default)]
2391 pub underlying_security_id: Option<String>,
2392
2393 #[serde(
2396 rename = "@accruedInt",
2397 default,
2398 deserialize_with = "deserialize_optional_decimal"
2399 )]
2400 pub accrued_int: Option<Decimal>,
2401
2402 #[serde(
2404 rename = "@principalAdjustFactor",
2405 default,
2406 deserialize_with = "deserialize_optional_decimal"
2407 )]
2408 pub principal_adjust_factor: Option<Decimal>,
2409
2410 #[serde(rename = "@serialNumber", default)]
2413 pub serial_number: Option<String>,
2414
2415 #[serde(rename = "@deliveryType", default)]
2417 pub delivery_type: Option<String>,
2418
2419 #[serde(rename = "@commodityType", default)]
2421 pub commodity_type: Option<String>,
2422
2423 #[serde(
2425 rename = "@fineness",
2426 default,
2427 deserialize_with = "deserialize_optional_decimal"
2428 )]
2429 pub fineness: Option<Decimal>,
2430
2431 #[serde(rename = "@weight", default)]
2433 pub weight: Option<String>,
2434
2435 #[serde(rename = "@levelOfDetail", default)]
2438 pub level_of_detail: Option<String>,
2439
2440 #[serde(rename = "@model", default)]
2442 pub model: Option<String>,
2443
2444 #[serde(rename = "@acctAlias", default)]
2446 pub acct_alias: Option<String>,
2447
2448 #[serde(
2450 rename = "@actionDescription",
2451 default,
2452 deserialize_with = "deserialize_optional_string"
2453 )]
2454 pub action_description: Option<String>,
2455
2456 #[serde(
2458 rename = "@capitalGainsPnl",
2459 default,
2460 deserialize_with = "deserialize_optional_decimal"
2461 )]
2462 pub capital_gains_pnl: Option<Decimal>,
2463
2464 #[serde(
2466 rename = "@fxPnl",
2467 default,
2468 deserialize_with = "deserialize_optional_decimal"
2469 )]
2470 pub fx_pnl: Option<Decimal>,
2471
2472 #[serde(
2474 rename = "@sedol",
2475 default,
2476 deserialize_with = "deserialize_optional_string"
2477 )]
2478 pub sedol: Option<String>,
2479
2480 #[serde(
2482 rename = "@costBasis",
2483 default,
2484 deserialize_with = "deserialize_optional_decimal"
2485 )]
2486 pub cost_basis: Option<Decimal>,
2487}
2488
2489#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
2531pub struct SecurityInfo {
2532 #[serde(rename = "@assetCategory", default)]
2538 pub asset_category: Option<AssetCategory>,
2539
2540 #[serde(
2542 rename = "@symbol",
2543 default,
2544 deserialize_with = "deserialize_optional_string"
2545 )]
2546 pub symbol: Option<String>,
2547
2548 #[serde(rename = "@description", default)]
2550 pub description: Option<String>,
2551
2552 #[serde(
2554 rename = "@conid",
2555 default,
2556 deserialize_with = "deserialize_optional_string"
2557 )]
2558 pub conid: Option<String>,
2559
2560 #[serde(rename = "@securityID", default)]
2562 pub security_id: Option<String>,
2563
2564 #[serde(rename = "@securityIDType", default)]
2566 pub security_id_type: Option<SecurityIdType>,
2567
2568 #[serde(rename = "@cusip", default)]
2570 pub cusip: Option<String>,
2571
2572 #[serde(rename = "@isin", default)]
2574 pub isin: Option<String>,
2575
2576 #[serde(rename = "@figi", default)]
2578 pub figi: Option<String>,
2579
2580 #[serde(rename = "@sedol", default)]
2582 pub sedol: Option<String>,
2583
2584 #[serde(
2587 rename = "@multiplier",
2588 default,
2589 deserialize_with = "deserialize_optional_decimal"
2590 )]
2591 pub multiplier: Option<Decimal>,
2592
2593 #[serde(
2595 rename = "@strike",
2596 default,
2597 deserialize_with = "deserialize_optional_decimal"
2598 )]
2599 pub strike: Option<Decimal>,
2600
2601 #[serde(
2603 rename = "@expiry",
2604 default,
2605 deserialize_with = "deserialize_optional_date"
2606 )]
2607 pub expiry: Option<NaiveDate>,
2608
2609 #[serde(rename = "@putCall", default)]
2611 pub put_call: Option<PutCall>,
2612
2613 #[serde(rename = "@underlyingConid", default)]
2615 pub underlying_conid: Option<String>,
2616
2617 #[serde(rename = "@underlyingSymbol", default)]
2619 pub underlying_symbol: Option<String>,
2620
2621 #[serde(
2624 rename = "@maturity",
2625 default,
2626 deserialize_with = "deserialize_optional_date"
2627 )]
2628 pub maturity: Option<NaiveDate>,
2629
2630 #[serde(
2632 rename = "@principalAdjustFactor",
2633 default,
2634 deserialize_with = "deserialize_optional_decimal"
2635 )]
2636 pub principal_adjust_factor: Option<Decimal>,
2637
2638 #[serde(rename = "@currency", default)]
2641 pub currency: Option<String>,
2642
2643 #[serde(rename = "@listingExchange", default)]
2649 pub listing_exchange: Option<String>,
2650
2651 #[serde(rename = "@underlyingSecurityID", default)]
2653 pub underlying_security_id: Option<String>,
2654
2655 #[serde(rename = "@underlyingListingExchange", default)]
2657 pub underlying_listing_exchange: Option<String>,
2658
2659 #[serde(rename = "@issuer", default)]
2662 pub issuer: Option<String>,
2663
2664 #[serde(rename = "@issuerCountryCode", default)]
2666 pub issuer_country_code: Option<String>,
2667
2668 #[serde(rename = "@subCategory", default)]
2670 pub sub_category: Option<SubCategory>,
2671
2672 #[serde(rename = "@deliveryMonth", default)]
2675 pub delivery_month: Option<String>,
2676
2677 #[serde(rename = "@serialNumber", default)]
2680 pub serial_number: Option<String>,
2681
2682 #[serde(rename = "@deliveryType", default)]
2684 pub delivery_type: Option<String>,
2685
2686 #[serde(rename = "@commodityType", default)]
2688 pub commodity_type: Option<String>,
2689
2690 #[serde(
2692 rename = "@fineness",
2693 default,
2694 deserialize_with = "deserialize_optional_decimal"
2695 )]
2696 pub fineness: Option<Decimal>,
2697
2698 #[serde(rename = "@weight", default)]
2700 pub weight: Option<String>,
2701
2702 #[serde(rename = "@code", default)]
2705 pub code: Option<String>,
2706
2707 #[serde(
2709 rename = "@underlyingCategory",
2710 default,
2711 deserialize_with = "deserialize_optional_string"
2712 )]
2713 pub underlying_category: Option<String>,
2714
2715 #[serde(
2717 rename = "@issueDate",
2718 default,
2719 deserialize_with = "deserialize_optional_date"
2720 )]
2721 pub issue_date: Option<NaiveDate>,
2722
2723 #[serde(
2725 rename = "@type",
2726 default,
2727 deserialize_with = "deserialize_optional_string"
2728 )]
2729 pub r#type: Option<String>,
2730
2731 #[serde(
2733 rename = "@settlementPolicyMethod",
2734 default,
2735 deserialize_with = "deserialize_optional_string"
2736 )]
2737 pub settlement_policy_method: Option<String>,
2738
2739 #[serde(
2741 rename = "@relatedTradeID",
2742 default,
2743 deserialize_with = "deserialize_optional_string"
2744 )]
2745 pub related_trade_id: Option<String>,
2746
2747 #[serde(
2749 rename = "@origTransactionID",
2750 default,
2751 deserialize_with = "deserialize_optional_string"
2752 )]
2753 pub orig_transaction_id: Option<String>,
2754
2755 #[serde(
2757 rename = "@relatedTransactionID",
2758 default,
2759 deserialize_with = "deserialize_optional_string"
2760 )]
2761 pub related_transaction_id: Option<String>,
2762
2763 #[serde(
2765 rename = "@rtn",
2766 default,
2767 deserialize_with = "deserialize_optional_string"
2768 )]
2769 pub rtn: Option<String>,
2770
2771 #[serde(
2773 rename = "@initialInvestment",
2774 default,
2775 deserialize_with = "deserialize_optional_bool"
2776 )]
2777 pub initial_investment: Option<bool>,
2778}
2779
2780#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
2815pub struct ConversionRate {
2816 #[serde(
2818 rename = "@reportDate",
2819 default,
2820 deserialize_with = "deserialize_optional_date"
2821 )]
2822 pub report_date: Option<NaiveDate>,
2823
2824 #[serde(
2826 rename = "@fromCurrency",
2827 default,
2828 deserialize_with = "deserialize_optional_string"
2829 )]
2830 pub from_currency: Option<String>,
2831
2832 #[serde(
2834 rename = "@toCurrency",
2835 default,
2836 deserialize_with = "deserialize_optional_string"
2837 )]
2838 pub to_currency: Option<String>,
2839
2840 #[serde(
2842 rename = "@rate",
2843 default,
2844 deserialize_with = "deserialize_optional_decimal"
2845 )]
2846 pub rate: Option<Decimal>,
2847}
2848
2849#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2851pub struct SecuritiesInfoWrapper {
2852 #[serde(rename = "SecurityInfo", default)]
2854 pub items: Vec<SecurityInfo>,
2855}
2856
2857#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2859pub struct ConversionRatesWrapper {
2860 #[serde(rename = "ConversionRate", default)]
2862 pub items: Vec<ConversionRate>,
2863}
2864
2865#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2869pub struct EquitySummaryWrapper {
2870 #[serde(rename = "EquitySummaryByReportDateInBase", default)]
2872 pub items: Vec<super::extended::EquitySummaryByReportDateInBase>,
2873}
2874
2875#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2877pub struct CashReportWrapper {
2878 #[serde(rename = "CashReportCurrency", default)]
2880 pub items: Vec<super::extended::CashReportCurrency>,
2881}
2882
2883#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2885pub struct TradeConfirmsWrapper {
2886 #[serde(rename = "TradeConfirm", default)]
2888 pub items: Vec<super::extended::TradeConfirm>,
2889}
2890
2891#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2893pub struct OptionEAEWrapper {
2894 #[serde(rename = "OptionEAE", default)]
2896 pub items: Vec<super::extended::OptionEAE>,
2897}
2898
2899#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2901pub struct FxTransactionsWrapper {
2902 #[serde(rename = "FxTransaction", default)]
2904 pub items: Vec<super::extended::FxTransaction>,
2905}
2906
2907#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2909pub struct ChangeInDividendAccrualsWrapper {
2910 #[serde(rename = "ChangeInDividendAccrual", default)]
2912 pub items: Vec<super::extended::ChangeInDividendAccrual>,
2913}
2914
2915#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2917pub struct OpenDividendAccrualsWrapper {
2918 #[serde(rename = "OpenDividendAccrual", default)]
2920 pub items: Vec<super::extended::OpenDividendAccrual>,
2921}
2922
2923#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2925pub struct InterestAccrualsWrapper {
2926 #[serde(rename = "InterestAccrualsCurrency", default)]
2928 pub items: Vec<super::extended::InterestAccrualsCurrency>,
2929}
2930
2931#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2933pub struct TransfersWrapper {
2934 #[serde(rename = "Transfer", default)]
2936 pub items: Vec<super::extended::Transfer>,
2937
2938 #[serde(rename = "TransferLot", default)]
2942 pub lots: Vec<super::extended::TransferLot>,
2943}
2944
2945#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2949pub struct MTMPerformanceSummaryWrapper {
2950 #[serde(rename = "MTMPerformanceSummaryUnderlying", default)]
2952 pub items: Vec<super::extended::MTMPerformanceSummaryUnderlying>,
2953}
2954
2955#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2957pub struct FIFOPerformanceSummaryWrapper {
2958 #[serde(rename = "FIFOPerformanceSummaryUnderlying", default)]
2960 pub items: Vec<super::extended::FIFOPerformanceSummaryUnderlying>,
2961}
2962
2963#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2965pub struct MTDYTDPerformanceSummaryWrapper {
2966 #[serde(rename = "MTDYTDPerformanceSummaryUnderlying", default)]
2968 pub items: Vec<super::extended::MTDYTDPerformanceSummary>,
2969}
2970
2971#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2973pub struct StatementOfFundsWrapper {
2974 #[serde(rename = "StatementOfFundsLine", default)]
2976 pub items: Vec<super::extended::StatementOfFundsLine>,
2977}
2978
2979#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2981pub struct ChangeInPositionValueWrapper {
2982 #[serde(rename = "ChangeInPositionValue", default)]
2984 pub items: Vec<super::extended::ChangeInPositionValue>,
2985}
2986
2987#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2989pub struct UnbundledCommissionDetailWrapper {
2990 #[serde(rename = "UnbundledCommissionDetail", default)]
2992 pub items: Vec<super::extended::UnbundledCommissionDetail>,
2993}
2994
2995#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
2997pub struct ClientFeesWrapper {
2998 #[serde(rename = "ClientFee", default)]
3000 pub items: Vec<super::extended::ClientFee>,
3001}
3002
3003#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3005pub struct ClientFeesDetailWrapper {
3006 #[serde(rename = "ClientFeesDetail", default)]
3008 pub items: Vec<super::extended::ClientFeesDetail>,
3009}
3010
3011#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3013pub struct SLBActivitiesWrapper {
3014 #[serde(rename = "SLBActivity", default)]
3016 pub items: Vec<super::extended::SLBActivity>,
3017}
3018
3019#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3021pub struct SLBFeesWrapper {
3022 #[serde(rename = "SLBFee", default)]
3024 pub items: Vec<super::extended::SLBFee>,
3025}
3026
3027#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3029pub struct HardToBorrowDetailsWrapper {
3030 #[serde(rename = "HardToBorrowDetail", default)]
3032 pub items: Vec<super::extended::HardToBorrowDetail>,
3033}
3034
3035#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3037pub struct FxLotsWrapper {
3038 #[serde(rename = "FxLot", default)]
3040 pub items: Vec<super::extended::FxLot>,
3041}
3042
3043#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3045pub struct UnsettledTransfersWrapper {
3046 #[serde(rename = "UnsettledTransfer", default)]
3048 pub items: Vec<super::extended::UnsettledTransfer>,
3049}
3050
3051#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3053pub struct TradeTransfersWrapper {
3054 #[serde(rename = "TradeTransfer", default)]
3056 pub items: Vec<super::extended::TradeTransfer>,
3057}
3058
3059#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3061pub struct PriorPeriodPositionsWrapper {
3062 #[serde(rename = "PriorPeriodPosition", default)]
3064 pub items: Vec<super::extended::PriorPeriodPosition>,
3065}
3066
3067#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3069pub struct TierInterestDetailsWrapper {
3070 #[serde(rename = "TierInterestDetail", default)]
3072 pub items: Vec<super::extended::TierInterestDetail>,
3073}
3074
3075#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3077pub struct DebitCardActivitiesWrapper {
3078 #[serde(rename = "DebitCardActivity", default)]
3080 pub items: Vec<super::extended::DebitCardActivity>,
3081}
3082
3083#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3085pub struct SalesTaxWrapper {
3086 #[serde(rename = "SalesTax", default)]
3088 pub items: Vec<super::extended::SalesTax>,
3089}
3090
3091#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3093pub struct SymbolSummaryWrapper {
3094 #[serde(rename = "SymbolSummary", default)]
3096 pub items: Vec<super::extended::SymbolSummary>,
3097}
3098
3099#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3101pub struct AssetSummaryWrapper {
3102 #[serde(rename = "AssetSummary", default)]
3104 pub items: Vec<super::extended::AssetSummary>,
3105}
3106
3107#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
3109pub struct OrdersWrapper {
3110 #[serde(rename = "Order", default)]
3112 pub items: Vec<super::extended::Order>,
3113}