ccxt_exchanges/bitget/rest/
account.rs1use super::super::{Bitget, parser};
4use ccxt_core::{
5 Error, ParseError, Result,
6 types::{Balance, Trade},
7};
8use tracing::warn;
9
10impl Bitget {
11 pub async fn fetch_balance(&self) -> Result<Balance> {
13 let path = self.build_api_path("/account/assets");
14 let response = self.signed_request(&path).execute().await?;
15
16 let data = response
17 .get("data")
18 .ok_or_else(|| Error::from(ParseError::missing_field("data")))?;
19
20 parser::parse_balance(data)
21 }
22
23 pub async fn fetch_my_trades(
25 &self,
26 symbol: &str,
27 since: Option<i64>,
28 limit: Option<u32>,
29 ) -> Result<Vec<Trade>> {
30 let market = self.base().market(symbol).await?;
31
32 let path = self.build_api_path("/trade/fills");
33
34 let actual_limit = limit.map_or(100, |l| l.min(500));
35
36 let mut builder = self
37 .signed_request(&path)
38 .param("symbol", &market.id)
39 .param("limit", actual_limit);
40
41 if let Some(start_time) = since {
42 builder = builder.param("startTime", start_time);
43 }
44
45 let response = builder.execute().await?;
46
47 let data = response
48 .get("data")
49 .ok_or_else(|| Error::from(ParseError::missing_field("data")))?;
50
51 let trades_array = data.as_array().ok_or_else(|| {
52 Error::from(ParseError::invalid_format(
53 "data",
54 "Expected array of trades",
55 ))
56 })?;
57
58 let mut trades = Vec::new();
59 for trade_data in trades_array {
60 match parser::parse_trade(trade_data, Some(&market)) {
61 Ok(trade) => trades.push(trade),
62 Err(e) => {
63 warn!(error = %e, "Failed to parse my trade");
64 }
65 }
66 }
67
68 Ok(trades)
69 }
70}