use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct CoinBalance {
#[serde(rename = "coin")]
#[serde(default)]
pub coin: Option<String>,
#[serde(rename = "equity")]
#[serde(default)]
pub equity: Option<String>,
#[serde(rename = "walletBalance")]
#[serde(default)]
pub wallet_balance: Option<String>,
#[serde(rename = "positionMargin")]
#[serde(default)]
pub position_margin: Option<String>,
#[serde(rename = "availableToWithdraw")]
#[serde(default)]
pub available_to_withdraw: Option<String>,
#[serde(rename = "availableToTrade")]
#[serde(default)]
pub available_to_trade: Option<String>,
#[serde(rename = "unrealisedPnl")]
#[serde(default)]
pub unrealised_pnl: Option<String>,
#[serde(rename = "cumRealisedPnl")]
#[serde(default)]
pub cum_realised_pnl: Option<String>,
#[serde(rename = "bonus")]
#[serde(default)]
pub bonus: Option<String>,
#[serde(rename = "borrowAmount")]
#[serde(default)]
pub borrow_amount: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct WalletData {
#[serde(rename = "accountType")]
#[serde(default)]
pub account_type: Option<String>,
#[serde(rename = "accountLTV")]
#[serde(default)]
pub account_ltv: Option<String>,
#[serde(rename = "accountIMRate")]
#[serde(default)]
pub account_im_rate: Option<String>,
#[serde(rename = "accountMMRate")]
#[serde(default)]
pub account_mm_rate: Option<String>,
#[serde(rename = "totalEquity")]
#[serde(default)]
pub total_equity: Option<String>,
#[serde(rename = "totalWalletBalance")]
#[serde(default)]
pub total_wallet_balance: Option<String>,
#[serde(rename = "totalMarginBalance")]
#[serde(default)]
pub total_margin_balance: Option<String>,
#[serde(rename = "totalAvailableBalance")]
#[serde(default)]
pub total_available_balance: Option<String>,
#[serde(rename = "totalPerpUPL")]
#[serde(default)]
pub total_perp_upl: Option<String>,
#[serde(rename = "totalInitialMargin")]
#[serde(default)]
pub total_initial_margin: Option<String>,
#[serde(rename = "totalMaintenanceMargin")]
#[serde(default)]
pub total_maintenance_margin: Option<String>,
#[serde(rename = "coin")]
#[serde(default)]
pub coins: Vec<CoinBalance>,
#[serde(rename = "time")]
#[serde(default)]
pub time: Option<String>,
#[serde(rename = "category")]
#[serde(default)]
pub category: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_wallet() {
let json = serde_json::json!({
"accountType": "UNIFIED",
"totalEquity": "10000.00",
"totalWalletBalance": "10000.00",
"coin": [
{
"coin": "USDT",
"equity": "10000.00",
"walletBalance": "10000.00",
"availableToWithdraw": "8000.00",
"availableToTrade": "9000.00"
}
],
"category": "linear"
});
let wallet: WalletData = serde_json::from_value(json).unwrap();
assert_eq!(wallet.account_type.as_deref(), Some("UNIFIED"));
assert_eq!(wallet.coins.len(), 1);
assert_eq!(wallet.coins[0].coin.as_deref(), Some("USDT"));
}
}