use serde::Deserialize;
use crate::client::{ApiError, Call, Tier, Transport, read};
use crate::utils::ids::whole;
use crate::utils::lenient::{Done, blank_dec, text};
use crate::utils::{AccountIndex, Dec, Figure};
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
pub struct AccountLimits {
#[serde(default, deserialize_with = "text")]
pub user_tier: String,
#[serde(default, deserialize_with = "text")]
pub user_tier_name: String,
#[serde(default, deserialize_with = "whole")]
pub user_tier_last_update: u64,
#[serde(default)]
pub current_maker_fee_tick: u32,
#[serde(default)]
pub current_taker_fee_tick: u32,
#[serde(default, deserialize_with = "blank_dec")]
pub effective_lit_stakes: Option<Dec>,
#[serde(default, deserialize_with = "blank_dec")]
pub leased_lit: Option<Dec>,
#[serde(default)]
pub can_create_public_pool: bool,
#[serde(default)]
pub max_llp_percentage: u32,
#[serde(default, deserialize_with = "blank_dec")]
pub max_llp_amount: Option<Dec>,
#[serde(default, deserialize_with = "text")]
pub bo_user_tier_name: String,
#[serde(default)]
pub bo_fee_rate: Option<Figure>,
}
impl AccountLimits {
#[must_use]
pub fn tier(&self) -> Option<Tier> {
tier_of(&self.user_tier)
}
}
#[must_use]
pub fn tier_of(word: &str) -> Option<Tier> {
match word.trim().to_ascii_lowercase().as_str() {
"standard" | "std" => Some(Tier::Standard),
"plus" => Some(Tier::Plus),
"premium" | "advanced" => Some(Tier::Premium),
"builder" => Some(Tier::Builder),
_ => None,
}
}
#[must_use]
pub fn account_limits_call(account: AccountIndex) -> Call {
Call::get("accountLimits").field("account_index", account).authed()
}
pub async fn account_limits(transport: &impl Transport, account: AccountIndex) -> Result<AccountLimits, ApiError> {
read(transport, account_limits_call(account)).await
}
#[must_use]
pub fn change_account_tier_call(account: AccountIndex, tier: Tier) -> Call {
Call::post("changeAccountTier").field("account_index", account).field("new_tier", tier.name()).authed()
}
pub async fn change_account_tier(
transport: &impl Transport,
account: AccountIndex,
tier: Tier,
) -> Result<(), ApiError> {
read::<Done>(transport, change_account_tier_call(account, tier)).await.map(drop)
}
#[cfg(test)]
#[path = "tests/tier.rs"]
mod tests;