bw-web-api-rs 0.2.8

A Rust client for the StarCraft: Remastered API
Documentation
use crate::types::Gateway;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Debug, Serialize, Deserialize)]
pub struct LeaderboardEntry {
    pub rank: u32,
    pub last_rank: u32,
    pub gateway_id: Gateway,
    pub points: u32,
    pub wins: u32,
    pub losses: u32,
    pub disconnects: u32,
    pub toon: String,
    pub battletag: String,
    pub avatar: String,
    pub feature_stat: String,
    pub rating: u32,
    pub bucket: u32,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct LeaderboardRankResponse {
    pub aurora_id: u32,
    pub gateway_id: u32,
    pub leaderboard_id: u32,
    pub matchmaked_current_season: u32,
    pub matchmaked_current_season_buckets: Vec<u32>,
    pub mingames: u32,
    pub toons: Vec<String>,
    pub total_rows: u32,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct GameMode {
    pub name: String,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct GatewayInfo {
    pub is_official: bool,
    pub name: String,
    pub region: String,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct LeaderboardInfo {
    pub benefactor_id: String,
    pub gamemode_id: u32,
    pub gateway_id: u32,
    pub id: u32,
    pub last_update_time: String,
    pub name: String,
    pub next_update_time: String,
    pub program_id: String,
    pub season_id: u32,
    pub season_name: String,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct LeaderboardMetadata {
    pub gamemodes: HashMap<String, GameMode>,
    pub gateways: HashMap<String, GatewayInfo>,
    pub leaderboards: HashMap<String, LeaderboardInfo>,
    pub matchmaked_current_season: u32,
    pub team_leaderboard_info: HashMap<String, serde_json::Value>,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct LeaderboardResponse {
    pub columns: Vec<String>,
    pub rows: Vec<Vec<serde_json::Value>>,
}

impl LeaderboardResponse {
    pub fn entries(&self) -> Vec<LeaderboardEntry> {
        self.rows
            .iter()
            .filter_map(|row| {
                if row.len() == 13 {
                    Some(LeaderboardEntry {
                        rank: row[0].as_u64()? as u32,
                        last_rank: row[1].as_u64()? as u32,
                        gateway_id: serde_json::from_value(row[2].clone()).ok()?,
                        points: row[3].as_u64()? as u32,
                        wins: row[4].as_u64()? as u32,
                        losses: row[5].as_u64()? as u32,
                        disconnects: row[6].as_u64()? as u32,
                        toon: row[7].as_str()?.to_string(),
                        battletag: row[8].as_str()?.to_string(),
                        avatar: row[9].as_str()?.to_string(),
                        feature_stat: row[10].as_str()?.to_string(),
                        rating: row[11].as_u64()? as u32,
                        bucket: row[12].as_u64()? as u32,
                    })
                } else {
                    None
                }
            })
            .collect()
    }
}

#[derive(Debug, Serialize, Deserialize)]
pub struct LeaderboardNameSearchEntry {
    pub avatar: String,
    pub battletag: String,
    pub gateway_id: Gateway,
    pub last_rank: u32,
    pub name: String,
    pub points: u32,
    pub rank: u32,
}

pub type LeaderboardNameSearchResponse = Vec<LeaderboardNameSearchEntry>;