mirror of
https://codeberg.org/icewind/ugc-scaper.git
synced 2026-06-03 10:14:11 +02:00
scriptly typed team format
This commit is contained in:
parent
ca06e8b095
commit
98b690356c
12 changed files with 86 additions and 25 deletions
17
Cargo.lock
generated
17
Cargo.lock
generated
|
|
@ -1695,11 +1695,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "2.0.3"
|
||||
version = "2.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa"
|
||||
checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
|
||||
dependencies = [
|
||||
"thiserror-impl 2.0.3",
|
||||
"thiserror-impl 2.0.12",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1715,9 +1715,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "2.0.3"
|
||||
version = "2.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568"
|
||||
checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
|
@ -1880,7 +1880,7 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
|
|||
|
||||
[[package]]
|
||||
name = "ugc-scraper"
|
||||
version = "0.4.4"
|
||||
version = "0.5.0"
|
||||
dependencies = [
|
||||
"insta",
|
||||
"main_error",
|
||||
|
|
@ -1888,7 +1888,7 @@ dependencies = [
|
|||
"scraper",
|
||||
"steamid-ng",
|
||||
"test-case",
|
||||
"thiserror 2.0.3",
|
||||
"thiserror 2.0.12",
|
||||
"time",
|
||||
"tokio",
|
||||
"ugc-scraper-types",
|
||||
|
|
@ -1896,10 +1896,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "ugc-scraper-types"
|
||||
version = "0.1.2"
|
||||
version = "0.2.0"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"steamid-ng",
|
||||
"thiserror 2.0.12",
|
||||
"time",
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "ugc-scraper"
|
||||
version = "0.4.4"
|
||||
version = "0.5.0"
|
||||
edition = "2021"
|
||||
rust-version = "1.71.1"
|
||||
description = "Scraper for ugcleague.com"
|
||||
|
|
@ -14,7 +14,7 @@ scraper = "0.23.1"
|
|||
thiserror = "2.0.3"
|
||||
time = { version = "0.3.41", features = ["parsing", "macros"] }
|
||||
steamid-ng = "1.0.0"
|
||||
ugc-scraper-types = { version = "0.1.2", path = "./types" }
|
||||
ugc-scraper-types = { version = "0.2.0", path = "./types" }
|
||||
|
||||
[dev-dependencies]
|
||||
tokio = { version = "1.44.2", features = ["macros", "rt-multi-thread", "rt"] }
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ use crate::parser::{
|
|||
use crate::{ParseError, Result, ScrapeError};
|
||||
use scraper::{Html, Selector};
|
||||
use time::{Date, PrimitiveDateTime, Time, UtcOffset};
|
||||
use ugc_scraper_types::GameMode;
|
||||
|
||||
const SELECTOR_TEAM_NAME: &str = ".container .col-md-12 h1 > b";
|
||||
const SELECTOR_TEAM_TAG: &str = ".container .col-md-12 h1 > span";
|
||||
|
|
@ -149,7 +150,11 @@ impl Parser for TeamParser {
|
|||
selector: SELECTOR_TEAM_FORMAT,
|
||||
role: "team format",
|
||||
})?
|
||||
.to_string();
|
||||
.parse::<GameMode>()
|
||||
.map_err(|e| ParseError::InvalidText {
|
||||
text: e.text,
|
||||
role: "team game mode",
|
||||
})?;
|
||||
|
||||
let steam_group = root
|
||||
.select(&self.selector_steam_group)
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
---
|
||||
source: tests/snapshot.rs
|
||||
assertion_line: 113
|
||||
expression: parsed
|
||||
snapshot_kind: text
|
||||
---
|
||||
{
|
||||
"current": {
|
||||
|
|
@ -6,7 +6,7 @@ expression: parsed
|
|||
"name": "Melting Pot",
|
||||
"tag": "Melting Pot",
|
||||
"image": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/f7/f75809d7774c917be9883370d772d3099bfe457d_full.jpg",
|
||||
"format": "TF2 Highlander",
|
||||
"format": "9v9",
|
||||
"timezone": "West-Euro",
|
||||
"steam_group": "http://steamcommunity.com/groups/Melintongpotsss",
|
||||
"division": "Euro Platinum",
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ expression: parsed
|
|||
"name": "UGC 6s",
|
||||
"tag": "Europe",
|
||||
"image": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/09/096a30b1025c586f9d41c686077129f6e86998d0_full.jpg",
|
||||
"format": "TF2 6vs6",
|
||||
"format": "6v6",
|
||||
"timezone": "West-Euro",
|
||||
"steam_group": null,
|
||||
"division": "Europe",
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ expression: parsed
|
|||
"name": "Ponkotsu: Reloaded",
|
||||
"tag": "PNKTSU",
|
||||
"image": "clan_avatars/32437_thumbnail.jpg",
|
||||
"format": "TF2 Highlander",
|
||||
"format": "9v9",
|
||||
"timezone": null,
|
||||
"steam_group": "https://steamcommunity.com/groups/xyxxx-",
|
||||
"division": "North America",
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ expression: parsed
|
|||
"name": "Xenon",
|
||||
"tag": "-Xe-",
|
||||
"image": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/db/dbabbd8bab7ccf6d27a9d4ca2e73a76e085bb201_full.jpg",
|
||||
"format": "TF2 Highlander",
|
||||
"format": "9v9",
|
||||
"timezone": "West-Euro",
|
||||
"steam_group": "https://steamcommunity.com/groups/XenonxTF2",
|
||||
"division": "Euro Platinum",
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ expression: parsed
|
|||
"name": "Barney and the Ganks",
|
||||
"tag": "Grand Meister",
|
||||
"image": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/d7/d71ff4e1e2635c3d7c1be8d96bc40b499c665aad_full.jpg",
|
||||
"format": "TF2 Highlander",
|
||||
"format": "9v9",
|
||||
"timezone": null,
|
||||
"steam_group": "http://steamcommunity.com/groups/BARNEYANDTHEGANKS",
|
||||
"division": "NA Platinum",
|
||||
|
|
|
|||
27
types/Cargo.lock
generated
27
types/Cargo.lock
generated
|
|
@ -229,7 +229,7 @@ dependencies = [
|
|||
"regex",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"thiserror",
|
||||
"thiserror 1.0.69",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -249,7 +249,16 @@ version = "1.0.69"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
"thiserror-impl 1.0.69",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "2.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
|
||||
dependencies = [
|
||||
"thiserror-impl 2.0.12",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -263,6 +272,17 @@ dependencies = [
|
|||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "2.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "time"
|
||||
version = "0.3.41"
|
||||
|
|
@ -296,10 +316,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "ugc-scraper-types"
|
||||
version = "0.1.2"
|
||||
version = "0.2.0"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"steamid-ng",
|
||||
"thiserror 2.0.12",
|
||||
"time",
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "ugc-scraper-types"
|
||||
version = "0.1.2"
|
||||
version = "0.2.0"
|
||||
edition = "2021"
|
||||
rust-version = "1.71.1"
|
||||
description = "Scraper for ugcleague.com - data types"
|
||||
|
|
@ -11,6 +11,7 @@ homepage = "https://github.com/icewind1991/ugc-scaper"
|
|||
steamid-ng = "1.0.0"
|
||||
serde = { version = "1.0.215", features = ["derive"], optional = true }
|
||||
time = { version = "0.3.36", features = ["parsing", "macros"] }
|
||||
thiserror = "2.0.12"
|
||||
|
||||
[features]
|
||||
serde = ["dep:serde", "time/serde", "time/formatting"]
|
||||
|
|
|
|||
|
|
@ -1,6 +1,9 @@
|
|||
use serde::de::Error;
|
||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||
use std::fmt::Display;
|
||||
use std::str::FromStr;
|
||||
pub use steamid_ng::SteamID;
|
||||
use thiserror::Error;
|
||||
use time::{Date, OffsetDateTime};
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
|
|
@ -111,7 +114,7 @@ pub struct Team {
|
|||
pub name: String,
|
||||
pub tag: String,
|
||||
pub image: String,
|
||||
pub format: String,
|
||||
pub format: GameMode,
|
||||
pub timezone: Option<String>,
|
||||
pub steam_group: Option<String>,
|
||||
pub division: String,
|
||||
|
|
@ -267,6 +270,12 @@ pub struct MatchInfo {
|
|||
pub score_away: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Error)]
|
||||
#[error("Invalid game mode {text}")]
|
||||
pub struct InvalidGameMode {
|
||||
pub text: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub enum GameMode {
|
||||
Highlander,
|
||||
|
|
@ -276,7 +285,7 @@ pub enum GameMode {
|
|||
}
|
||||
|
||||
impl FromStr for GameMode {
|
||||
type Err = ();
|
||||
type Err = InvalidGameMode;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
match s {
|
||||
|
|
@ -284,7 +293,14 @@ impl FromStr for GameMode {
|
|||
"6v6" => Ok(GameMode::Sixes),
|
||||
"4v4" => Ok(GameMode::Fours),
|
||||
"2v2" => Ok(GameMode::Ultiduo),
|
||||
_ => Err(()),
|
||||
"TF2 Highlander" => Ok(GameMode::Highlander),
|
||||
"ASIA TF2-H" => Ok(GameMode::Highlander),
|
||||
"TF2 6vs6" => Ok(GameMode::Sixes),
|
||||
"TF2 4vs4" => Ok(GameMode::Fours),
|
||||
"TF2 2vs2" => Ok(GameMode::Ultiduo),
|
||||
_ => Err(InvalidGameMode {
|
||||
text: s.to_string(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -309,6 +325,25 @@ impl GameMode {
|
|||
}
|
||||
}
|
||||
|
||||
impl Serialize for GameMode {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
self.as_str().serialize(serializer)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'de> Deserialize<'de> for GameMode {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let s = <&str>::deserialize(deserializer)?;
|
||||
Self::from_str(s).map_err(D::Error::custom)
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for GameMode {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
f.write_str(self.as_str())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue