r6tracker/types/user_data/
season.rs1use crate::types::{
2 stat::Stat,
3 user_data::Rank,
4};
5use std::collections::HashMap;
6
7#[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 fn get_stat_by_name(&self, name: &str) -> Option<&Stat> {
25 self.stats.iter().find(|s| s.name() == name)
26 }
27
28 pub fn current_mmr(&self) -> Option<u32> {
30 self.get_stat_by_name("MMR").map(|s| s.value as u32)
31 }
32
33 pub fn wl(&self) -> Option<f64> {
35 self.get_stat_by_name("WLRatio").map(|s| s.value)
37 }
38
39 pub fn max_mmr(&self) -> Option<u64> {
41 self.get_stat_by_name("Max MMR").map(|s| s.value as u64)
42 }
43
44 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}