ibkr_flex_statement/
account_info.rs1use crate::node_utils::NodeWrapper;
2use crate::statement_section::StatementSection;
3use anyhow::Result;
4
5#[derive(Debug, PartialEq)]
6pub enum PositionSide {
7 Long,
8 Short,
9}
10
11#[derive(Clone, Debug, PartialEq)]
12pub struct AccountInfo {
13 pub account_id: String,
14}
15
16impl<'a> TryFrom<&'a str> for PositionSide {
17 type Error = anyhow::Error;
18
19 fn try_from(s: &'a str) -> Result<Self> {
20 match s {
21 "Long" => Ok(Self::Long),
22 "Short" => Ok(Self::Short),
23 _ => Err(anyhow::Error::msg(format!("unknown position side {}", s))),
24 }
25 }
26}
27
28impl StatementSection for AccountInfo {
29 fn from_node(node: &NodeWrapper) -> Result<AccountInfo> {
30 Ok(AccountInfo {
31 account_id: node.get_attribute("accountId")?,
32 })
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39 use crate::Parser;
40 use anyhow::Result;
41
42 const PARTIAL_STATEMENT_EXAMPLE: &str = r##"
43 <FlexQueryResponse queryName="example-query" type="AF">
44 <FlexStatements count="1">
45 <FlexStatement accountId="U1234567" fromDate="2025-04-25" toDate="2025-04-25" period="LastBusinessDay" whenGenerated="2025-04-26;13:34:28 EDT">
46 <AccountInformation
47 accountId="U1234567"
48 accountType="Individual"
49 customerType="Individual"
50 accountCapabilities="Portfolio Margin"
51 tradingPermissions="Stocks,Options,Warrants,Forex,Futures,Crypto Currencies,Mutual Funds,Fully Paid Stock Loan" />
52 <AccountSummary accountId="U1234567" accountType="Individual" customerType="Individual" accountCapabilities="Portfolio Margin" tradingPermissions="Stocks,Options,Warrants,Forex,Futures,Crypto Currencies,Mutual Funds,Fully Paid Stock Loan" accountBaseCurrency="USD" accountBaseCurrencySymbol="$" accountBaseCurrencyRate="1.0" accountBaseCurrencyRateDateTime="2025-04-26;13:34:28 EDT" accountBaseCurrencyRateSource="IBKR" accountBaseCurrencyRateSourceDescription="IBKR" accountBaseCurrencyRateSourceDateTime="2025-04-26;13:34:28 EDT" />
53 </FlexStatement>
54 </FlexStatements>
55 </FlexQueryResponse>
56 "##;
57
58 #[test]
59 fn account_info_parses() -> Result<()> {
60 let result = Parser::new()?.parse_statement_contents(PARTIAL_STATEMENT_EXAMPLE)?;
61
62 assert_eq!(
63 result.account_info,
64 AccountInfo {
65 account_id: "U1234567".to_string(),
66 }
67 );
68 Ok(())
69 }
70}