use crate::account::holdings::keeping::Keeping;
use crate::account::holdings::perps::{ClearinghouseState, clearinghouse_state};
use crate::account::holdings::spot::{SpotState, spot_state};
use crate::account::settings::mode::{Abstraction, abstraction};
use crate::client::{ApiError, Transport};
use crate::markets::Dex;
use crate::utils::{Address, Dec};
pub async fn standing(transport: &impl Transport, user: Address, dexes: &[Dex<'_>]) -> Result<Standing, ApiError> {
let mode = abstraction(transport, user).await?;
let spot = spot_state(transport, user).await?;
let mut read = Vec::with_capacity(dexes.len());
for dex in dexes {
let state = clearinghouse_state(transport, user, *dex).await?;
read.push(DexState { dex: dex.name().unwrap_or_default().to_owned(), state });
}
Ok(Standing { mode: Some(mode), dexes: read, spot: Some(spot), heard: None })
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct DexState {
pub dex: String,
pub state: ClearinghouseState,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct Standing {
pub mode: Option<Abstraction>,
pub dexes: Vec<DexState>,
pub spot: Option<SpotState>,
pub heard: Option<u64>,
}
impl Standing {
#[must_use]
pub fn dex(&self, dex: &str) -> Option<&ClearinghouseState> {
self.dexes.iter().find(|state| state.dex == dex).map(|state| &state.state)
}
#[must_use]
pub fn keeping(&self) -> Keeping {
Keeping::of(self.mode.as_ref(), self.spot.as_ref())
}
#[must_use]
pub fn pools(&self) -> bool {
self.keeping().pools()
}
#[must_use]
pub fn free(&self, token: u32) -> Dec {
self.spot.as_ref().map_or(Dec::ZERO, |spot| spot.free(token))
}
}