Skip to main content

schwab_api/endpoints/
transactions.rs

1use crate::client::SchwabClient;
2use crate::error::{ApiError, Result};
3use crate::models::transaction::Transaction;
4use crate::query::{default_transaction_window, resolve_time_range};
5
6pub struct TransactionsApi<'a> {
7    client: &'a SchwabClient,
8}
9
10impl<'a> TransactionsApi<'a> {
11    pub fn new(client: &'a SchwabClient) -> Self {
12        Self { client }
13    }
14
15    /// GET /accounts/{accountNumber}/transactions
16    pub async fn list(
17        &self,
18        account_number: &str,
19        start_date: Option<&str>,
20        end_date: Option<&str>,
21        types: Option<&str>,
22        symbol: Option<&str>,
23    ) -> Result<Vec<Transaction>> {
24        let (start, end) = resolve_time_range(start_date, end_date, default_transaction_window)
25            .map_err(ApiError::Other)?;
26        let types = types.unwrap_or("TRADE");
27        let path = format!("/accounts/{account_number}/transactions");
28        let query = super::merge_queries(vec![
29            vec![("startDate", start.as_str()), ("endDate", end.as_str())],
30            vec![("types", types)],
31            super::opt_query("symbol", symbol),
32        ]);
33        self.client.get_json(&path, &query).await
34    }
35
36    /// GET /accounts/{accountNumber}/transactions/{transactionId}
37    pub async fn get(&self, account_number: &str, transaction_id: &str) -> Result<Transaction> {
38        let path = format!("/accounts/{account_number}/transactions/{transaction_id}");
39        self.client.get_json(&path, &[]).await
40    }
41}