use chrono::{DateTime, Utc};
use reqwest::Method;
use serde::{Deserialize, Serialize};
use crate::client::{Client, PagedResponse, PaginationOptions, Response};
use crate::errors::Result;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Transaction {
pub id: String,
pub resource: String,
pub resource_path: String,
pub r#type: TransactionType,
pub status: TransactionStatus,
pub amount: Money,
pub native_amount: Money,
pub description: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub enum TransactionType {
Send,
Request,
Transfer,
Buy,
Sell,
FiatDeposit,
FiatWithdrawal,
ExchangeDeposit,
ExchangeWithdrawal,
VaultWithdrawal,
ProDeposit,
ProWithdrawal,
InflationReward,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub enum TransactionStatus {
Pending,
Completed,
Failed,
Expired,
Canceled,
WaitingForSignature,
WaitingForClearing,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Money {
pub amount: String,
pub currency: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AccountCurrency {
pub code: String,
pub name: String,
pub color: String,
pub sort_index: i32,
pub exponent: i32,
pub r#type: String,
pub address_regex: String,
pub asset_id: String,
pub slug: String,
}
impl Client {
pub async fn list_transactions(
&self,
account_id: &str,
pagination: &PaginationOptions,
) -> Result<PagedResponse<Transaction>> {
self.send_request(
Method::GET,
&format!(
"accounts/{}/transactions{}",
account_id,
pagination.get_query()
),
None::<&()>,
)
.await
}
pub async fn get_transaction(
&self,
account_id: &str,
transaction_id: &str,
) -> Result<Response<Transaction>> {
self.send_request(
Method::GET,
&format!("accounts/{}/transactions/{}", account_id, transaction_id),
None::<&()>,
)
.await
}
}