begin work
This commit is contained in:
1267
Cargo.lock
generated
Normal file
1267
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
10
Cargo.toml
Normal file
10
Cargo.toml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
[package]
|
||||||
|
name = "playoffsbot"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Simon Bernier St-Pierre <sbernierstpierre@gmail.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
chrono = { version = "0.4", features = ["serde"] }
|
||||||
|
reqwest = "0.9"
|
||||||
|
serde = { version = "1", features = ["derive"] }
|
||||||
7
src/main.rs
Normal file
7
src/main.rs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
mod nhlapi;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("Hello, world!");
|
||||||
|
let s = nhlapi::schedule::today().unwrap();
|
||||||
|
println!("{:#?}", s);
|
||||||
|
}
|
||||||
156
src/nhlapi.rs
Normal file
156
src/nhlapi.rs
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
//! Docs: https://gitlab.com/dword4/nhlapi
|
||||||
|
|
||||||
|
use std::fmt::Display;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||||
|
|
||||||
|
fn from_str<'de, T, D>(deserializer: D) -> Result<T, D::Error>
|
||||||
|
where
|
||||||
|
T: FromStr,
|
||||||
|
T::Err: Display,
|
||||||
|
D: serde::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let s = String::deserialize(deserializer)?;
|
||||||
|
T::from_str(&s).map_err(serde::de::Error::custom)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Season {
|
||||||
|
pub begin: u32,
|
||||||
|
pub end: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de> Deserialize<'de> for Season {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Season, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let s = String::deserialize(deserializer)?;
|
||||||
|
if s.len() == 8 && s.chars().all(|c| c.is_digit(10)) {
|
||||||
|
Ok(Season {
|
||||||
|
begin: s[..4].parse().unwrap(),
|
||||||
|
end: s[4..].parse().unwrap(),
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
Err(serde::de::Error::custom("invalid season"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Serialize for Season {
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
serializer.serialize_str(&format!("{:04}{:04}", self.begin, self.end))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
pub struct LeagueRecord {
|
||||||
|
wins: u32,
|
||||||
|
losses: u32,
|
||||||
|
ot: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
pub struct Team {
|
||||||
|
id: u32,
|
||||||
|
name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub mod schedule {
|
||||||
|
use chrono::{DateTime, NaiveDate, Utc};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use super::{LeagueRecord, Season, Team};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
struct Root {
|
||||||
|
pub dates: Vec<Date>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
pub struct Date {
|
||||||
|
pub date: NaiveDate,
|
||||||
|
pub games: Vec<Game>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
pub struct Game {
|
||||||
|
#[serde(rename = "gamePk")]
|
||||||
|
pub game_pk: u64,
|
||||||
|
#[serde(rename = "gameType")]
|
||||||
|
pub game_type: String,
|
||||||
|
pub season: Season,
|
||||||
|
#[serde(rename = "gameDate")]
|
||||||
|
pub game_date: DateTime<Utc>,
|
||||||
|
pub teams: Teams,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
pub struct Teams {
|
||||||
|
pub away: TeamRecord,
|
||||||
|
pub home: TeamRecord,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
pub struct TeamRecord {
|
||||||
|
pub team: Team,
|
||||||
|
#[serde(rename = "leagueRecord")]
|
||||||
|
pub league_record: LeagueRecord,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn today() -> reqwest::Result<Vec<Date>> {
|
||||||
|
let root: Root = reqwest::get("https://statsapi.web.nhl.com/api/v1/schedule")?.json()?;
|
||||||
|
Ok(root.dates)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub mod standings {
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use super::{from_str, LeagueRecord, Team};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
struct Root {
|
||||||
|
pub records: Vec<Records>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
struct Records {
|
||||||
|
#[serde(rename = "teamRecords")]
|
||||||
|
pub team_records: Vec<TeamRecord>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
|
pub struct TeamRecord {
|
||||||
|
team: Team,
|
||||||
|
#[serde(rename = "leagueRecord")]
|
||||||
|
league_record: LeagueRecord,
|
||||||
|
|
||||||
|
#[serde(rename = "goalsAgainst")]
|
||||||
|
goals_against: u32,
|
||||||
|
#[serde(rename = "goalsScored")]
|
||||||
|
goals_scored: u32,
|
||||||
|
points: u32,
|
||||||
|
row: u32,
|
||||||
|
#[serde(rename = "gamesPlayed")]
|
||||||
|
games_played: u32,
|
||||||
|
|
||||||
|
#[serde(rename = "divisionRank", deserialize_with = "from_str")]
|
||||||
|
division_rank: u32,
|
||||||
|
#[serde(rename = "conferenceRank", deserialize_with = "from_str")]
|
||||||
|
conference_rank: u32,
|
||||||
|
#[serde(rename = "leagueRank", deserialize_with = "from_str")]
|
||||||
|
league_rank: u32,
|
||||||
|
#[serde(rename = "wildCardRank", deserialize_with = "from_str")]
|
||||||
|
wildcard_rank: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn today() -> reqwest::Result<Vec<TeamRecord>> {
|
||||||
|
let mut root: Root =
|
||||||
|
reqwest::get("https://statsapi.web.nhl.com/api/v1/standings/byLeague")?.json()?;
|
||||||
|
Ok(root.records.remove(0).team_records)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user