r6tracker/types/user_data/
season.rs

1use crate::types::{
2    stat::Stat,
3    user_data::Rank,
4};
5use std::collections::HashMap;
6
7/// A representation of a ranked season/region
8#[derive(Debug, serde::Deserialize, serde::Serialize)]
9pub struct Season {
10    pub id: String,
11
12    #[serde(rename = "type")]
13    pub kind: String,
14
15    pub metadata: Metadata,
16    pub stats: Vec<Stat>,
17
18    #[serde(flatten)]
19    pub unknown: HashMap<String, serde_json::Value>,
20}
21
22impl Season {
23    /// Utility function to get a stat by name. Currently an O(n) linear search.
24    fn get_stat_by_name(&self, name: &str) -> Option<&Stat> {
25        self.stats.iter().find(|s| s.name() == name)
26    }
27
28    /// Gets current mmr for this region in this season
29    pub fn current_mmr(&self) -> Option<u32> {
30        self.get_stat_by_name("MMR").map(|s| s.value as u32)
31    }
32
33    /// Get Win / Loss this season/region
34    pub fn wl(&self) -> Option<f64> {
35        // Why is this different from UserData?
36        self.get_stat_by_name("WLRatio").map(|s| s.value)
37    }
38
39    /// Get the max mmr
40    pub fn max_mmr(&self) -> Option<u64> {
41        self.get_stat_by_name("Max MMR").map(|s| s.value as u64)
42    }
43
44    /// Get the max rank
45    pub fn max_rank(&self) -> Option<Rank> {
46        match self.get_stat_by_name("Max Rank")?.value as u64 {
47            0 => Some(Rank::Unranked),
48
49            1 => Some(Rank::CopperV),
50            2 => Some(Rank::CopperIV),
51            3 => Some(Rank::CopperIII),
52            4 => Some(Rank::CopperII),
53            5 => Some(Rank::CopperI),
54
55            6 => Some(Rank::BronzeV),
56            7 => Some(Rank::BronzeIV),
57            8 => Some(Rank::BronzeIII),
58            9 => Some(Rank::BronzeII),
59            10 => Some(Rank::BronzeI),
60
61            11 => Some(Rank::SilverV),
62            12 => Some(Rank::SilverIV),
63            13 => Some(Rank::SilverIII),
64            14 => Some(Rank::SilverII),
65            15 => Some(Rank::SilverI),
66
67            16 => Some(Rank::GoldIII),
68            17 => Some(Rank::GoldII),
69            18 => Some(Rank::GoldI),
70
71            19 => Some(Rank::PlatinumIII),
72            20 => Some(Rank::PlatinumII),
73            21 => Some(Rank::PlatinumI),
74
75            22 => Some(Rank::Diamond),
76
77            23 => Some(Rank::Champion),
78
79            _ => None,
80        }
81    }
82}
83
84#[derive(Debug, serde::Deserialize, serde::Serialize)]
85pub struct Metadata {
86    pub name: String,
87    pub segment: String,
88
89    #[serde(rename = "statsCategoryOrder")]
90    pub stats_category_order: Vec<String>,
91
92    #[serde(flatten)]
93    pub unknown: HashMap<String, serde_json::Value>,
94}