use serde::Deserialize;
use crate::account::holdings::perps::Leverage;
use crate::client::{ApiError, Transport, info, info_request};
use crate::markets::Side;
use crate::utils::{Address, Dec, Json};
#[must_use]
pub fn active_asset_data_request(user: Address, coin: &str) -> String {
info_request("activeAssetData", &[("user", Json::String(user.to_hex())), ("coin", Json::String(coin.to_owned()))])
}
pub async fn active_asset_data(
transport: &impl Transport,
user: Address,
coin: &str,
) -> Result<ActiveAssetData, ApiError> {
info(transport, active_asset_data_request(user, coin)).await
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ActiveAssetData {
pub user: Address,
pub coin: String,
pub leverage: Leverage,
pub max_trade_szs: [Dec; 2],
pub available_to_trade: [Dec; 2],
pub mark_px: Dec,
}
impl ActiveAssetData {
#[must_use]
pub const fn max_size(&self, side: Side) -> Dec {
self.max_trade_szs[at(side)]
}
#[must_use]
pub const fn available(&self, side: Side) -> Dec {
self.available_to_trade[at(side)]
}
}
const fn at(side: Side) -> usize {
match side {
Side::Buy => 0,
Side::Sell => 1,
}
}
#[cfg(test)]
#[path = "tests/active.rs"]
mod tests;