use serde::{Deserialize, Deserializer};
use super::token::{Holder, Token};
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LeaderboardEntry {
pub rank: i32,
pub address: String,
#[serde(default)]
pub username: Option<String>,
#[serde(default)]
pub avatar: Option<String>,
pub volume_usd: f64,
pub trades: i64,
pub points: f64,
pub points_total: f64,
pub points_projected: f64,
pub held_usd: f64,
pub reward_eth: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UserSummary {
pub id: i32,
pub address: String,
#[serde(default)]
pub username: Option<String>,
#[serde(default)]
pub avatar: Option<String>,
#[serde(default)]
pub bio: Option<String>,
pub likes: i32,
#[serde(default)]
pub is_admin: Option<bool>,
#[serde(default)]
pub twitter_username: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ChatMessage {
pub id: i32,
pub token_address: String,
#[serde(default)]
pub reply_address: Option<String>,
pub comment: String,
#[serde(default)]
pub code: Option<String>,
pub date: String,
pub network: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UserProfile {
pub user: UserSummary,
pub holdings: Vec<Holder>,
pub chats: Vec<ChatMessage>,
pub created_tokens: Vec<Token>,
pub followers: i64,
pub followees: i64,
pub referral_count: i64,
pub points: i32,
pub trading_points: f64,
pub trading_volume_usd: f64,
pub reward_eth: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TopHolderEntry {
pub address: String,
#[serde(default)]
pub username: Option<String>,
#[serde(default)]
pub avatar: Option<String>,
pub volume: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct KingReign {
pub token_address: String,
pub name: String,
pub symbol: String,
#[serde(default)]
pub image: Option<String>,
pub network: String,
pub started_at: i64,
#[serde(default)]
pub ended_at: Option<i64>,
pub duration_secs: i64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SeasonEntry {
pub rank: i32,
pub address: String,
#[serde(default)]
pub username: Option<String>,
#[serde(default)]
pub avatar: Option<String>,
pub points: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Season {
pub name: String,
pub starts_at: i64,
pub ends_at: i64,
pub prize_pot_eth: f64,
pub leaderboard: Vec<SeasonEntry>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ReferralLeaderEntry {
pub rank: i32,
pub address: String,
#[serde(default)]
pub username: Option<String>,
#[serde(default)]
pub avatar: Option<String>,
pub referral_count: i64,
pub referee_volume_usd: f64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Tier {
Bronze,
Silver,
Gold,
Diamond,
Other(String),
}
impl Tier {
pub fn as_str(&self) -> &str {
match self {
Tier::Bronze => "Bronze",
Tier::Silver => "Silver",
Tier::Gold => "Gold",
Tier::Diamond => "Diamond",
Tier::Other(s) => s,
}
}
}
impl std::fmt::Display for Tier {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for Tier {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let raw = String::deserialize(deserializer)?;
Ok(match raw.as_str() {
"Bronze" => Tier::Bronze,
"Silver" => Tier::Silver,
"Gold" => Tier::Gold,
"Diamond" => Tier::Diamond,
_ => Tier::Other(raw),
})
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TierInfo {
pub address: String,
pub volume_usd: f64,
pub tier: Tier,
#[serde(default)]
pub next_tier: Option<Tier>,
#[serde(default)]
pub next_threshold_usd: Option<f64>,
pub progress_pct: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct QuestState {
pub key: String,
pub title: String,
pub description: String,
pub kind: String,
pub target: f64,
pub progress: f64,
pub points: f64,
pub completed: bool,
pub claimed: bool,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AchievementState {
pub key: String,
pub title: String,
pub description: String,
pub icon: String,
pub points: f64,
pub earned: bool,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Rewards {
pub address: String,
pub current_streak: i64,
pub longest_streak: i64,
pub points: f64,
pub bonus_points: f64,
pub quests: Vec<QuestState>,
pub achievements: Vec<AchievementState>,
}