use crate::account::holdings::spot::SpotState;
use crate::account::settings::mode::Abstraction;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Keeping {
Apart,
Native,
Unified,
Portfolio,
Unknown,
}
impl Keeping {
#[must_use]
pub fn of(mode: Option<&Abstraction>, spot: Option<&SpotState>) -> Keeping {
match mode {
Some(Abstraction::UnifiedAccount) => Keeping::Unified,
Some(Abstraction::PortfolioMargin) => Keeping::Portfolio,
Some(Abstraction::DexAbstraction) => Keeping::Native,
Some(Abstraction::Default | Abstraction::Disabled) => Keeping::Apart,
Some(Abstraction::Unknown(_)) => Keeping::Unknown,
None if spot.is_some_and(|spot| spot.portfolio_margin_enabled == Some(true)) => Keeping::Portfolio,
None => Keeping::Unknown,
}
}
#[must_use]
pub const fn pools(self) -> bool {
matches!(self, Keeping::Unified | Keeping::Portfolio)
}
}
#[cfg(test)]
#[path = "tests/keeping.rs"]
mod tests;