schwab_api/endpoints/
transactions.rs1use 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 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 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}