diff --git a/Cargo.lock b/Cargo.lock index 283e65b..19a856e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2057,18 +2057,28 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -2077,14 +2087,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.141" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -2309,6 +2320,7 @@ dependencies = [ "reqwest", "scraper", "serde", + "serde_json", "thiserror 2.0.12", "tokio", "tracing", diff --git a/Cargo.toml b/Cargo.toml index 2009d5a..8ee3f36 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ rand = "0.9.2" reqwest = "0.12.22" scraper = "0.24.0" serde = { version = "1.0.219", features = ["derive"] } +serde_json = "1.0.145" thiserror = "2.0.12" tokio = { version = "1.46.1", features = ["rt"] } tracing = { version = "0.1.41", default-features = false, features = ["std"] } diff --git a/src/dance_info.rs b/src/dance_info.rs index 0e5d629..70181ec 100644 --- a/src/dance_info.rs +++ b/src/dance_info.rs @@ -45,14 +45,14 @@ impl TryFrom<&str> for DanceRole { } } -#[derive(serde::Deserialize, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(serde::Deserialize, Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)] pub enum DanceRank { Newcomer, Novice, Intermediate, #[serde(rename = "Advance")] Advanced, - #[serde(rename = "All Star")] + #[serde(rename = "All Star", alias = "All-Stars")] AllStars, Champions, } @@ -70,33 +70,6 @@ impl DanceRank { } } -#[derive(Debug)] -pub struct ParseDanceRankError; - -impl fmt::Display for ParseDanceRankError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "failed to parse DanceRank") - } -} - -impl std::error::Error for ParseDanceRankError {} - -impl std::str::FromStr for DanceRank { - type Err = ParseDanceRankError; - - fn from_str(s: &str) -> Result { - match s { - "Newcomer" => Ok(Self::Newcomer), - "Novice" => Ok(Self::Novice), - "Intermediate" => Ok(Self::Intermediate), - "Advanced" => Ok(Self::Advanced), - "All-Stars" => Ok(Self::AllStars), - "Champions" => Ok(Self::Champions), - _ => Err(ParseDanceRankError), - } - } -} - #[derive(Debug)] pub struct CompState { pub rank: DanceRank, diff --git a/src/worldsdc/scoringdance.rs b/src/worldsdc/scoringdance.rs index d26f930..6763b5c 100644 --- a/src/worldsdc/scoringdance.rs +++ b/src/worldsdc/scoringdance.rs @@ -61,12 +61,12 @@ fn parse_stats(d: &[Vec]) { (a, b) }); - let (all_time, rest) = chapters.partition::, _>(|(a, b)| a.to_lowercase() == "all time"); + let (all_time, rest) = chapters.partition::, _>(|(a, _)| a.to_lowercase() == "all time"); let all_time = &all_time.split_first().unwrap().0.1; - let sorted_chapters = rest + let mut sorted_chapters = rest .into_iter() .map(|(chapter, items)| { - let rank = DanceRank::from_str(chapter).map_err(|_| chapter.to_owned())?; + let rank: DanceRank = serde_json::from_str(chapter).map_err(|_| chapter.to_owned())?; Ok::<(DanceRank, Vec<[&String; 2]>), String>((rank, items)) }) .filter_map(|v| match v { @@ -77,7 +77,27 @@ fn parse_stats(d: &[Vec]) { } }) .collect::>(); - dbg!(&sorted_chapters); + sorted_chapters.sort_by_key(|(a, _)| *a); + sorted_chapters.reverse(); + let leader_rank = sorted_chapters.iter().find_map(|(rank, items)| { + items + .iter() + .find(|[a, _]| a.to_lowercase().contains("points leader")) + .map(|[_, points]| (rank, points)) + }); + let follower_rank = sorted_chapters.iter().find_map(|(rank, items)| { + items + .iter() + .find(|[a, _]| a.to_lowercase().contains("points follower")) + .map(|[_, points]| (rank, points)) + }); + let primary_role = all_time.iter().find_map(|[key, value]| { + if !key.to_lowercase().contains("primary role") { + return None; + } + Some(value) + }); + dbg!(leader_rank, follower_rank, primary_role); // dbg!(chapters.collect::>()); }