use crate::client::{ApiError, Transport, info, info_request};
use crate::markets::dex::Dex;
use crate::utils::{Dec, Json};
use serde::Deserialize;
fn named(kind: &str, dex: Dex<'_>) -> String {
info_request(kind, &[("dex", Json::String(dex.name().unwrap_or_default().to_owned()))])
}
#[must_use]
pub fn perp_dex_limits_request(dex: Dex<'_>) -> String {
named("perpDexLimits", dex)
}
pub async fn perp_dex_limits(transport: &impl Transport, dex: Dex<'_>) -> Result<Option<DexLimits>, ApiError> {
info(transport, perp_dex_limits_request(dex)).await
}
#[must_use]
pub fn perp_dex_status_request(dex: Dex<'_>) -> String {
named("perpDexStatus", dex)
}
pub async fn perp_dex_status(transport: &impl Transport, dex: Dex<'_>) -> Result<Option<DexStatus>, ApiError> {
info(transport, perp_dex_status_request(dex)).await
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DexLimits {
pub total_oi_cap: Dec,
pub oi_sz_cap_per_perp: Dec,
pub max_transfer_ntl: Dec,
#[serde(default)]
pub coin_to_oi_cap: Vec<(String, Dec)>,
}
impl DexLimits {
#[must_use]
pub fn coin_cap(&self, coin: &str) -> Option<Dec> {
self.coin_to_oi_cap.iter().find(|(listed, _)| listed == coin).map(|(_, cap)| *cap)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DexStatus {
pub total_net_deposit: Dec,
}