Initial commit in new repo with new history.
This commit is contained in:
commit
8e1ae39164
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/target
|
||||||
1728
Cargo.lock
generated
Normal file
1728
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
11
Cargo.toml
Normal file
11
Cargo.toml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[package]
|
||||||
|
name = "pulse"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
reqwest = { version = "0.12.15", features = ["blocking"] }
|
||||||
|
serde = {version = "1.0.219", features = ["derive"]}
|
||||||
|
serde_alias = "0.0.2"
|
||||||
|
serde_json = "1.0.140"
|
||||||
|
tabled = "0.18.0"
|
||||||
792
assets/sox-schedule.json
Normal file
792
assets/sox-schedule.json
Normal file
@ -0,0 +1,792 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"date": "2025-03-31",
|
||||||
|
"start_time": "2025-03-31 18:35:00",
|
||||||
|
"opponent": "Baltimore Orioles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-02",
|
||||||
|
"start_time": "2025-04-02 22:35:00",
|
||||||
|
"opponent": "Baltimore Orioles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-03",
|
||||||
|
"start_time": "2025-04-03 17:05:00",
|
||||||
|
"opponent": "Baltimore Orioles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-04",
|
||||||
|
"start_time": "2025-04-04 18:10:00",
|
||||||
|
"opponent": "St. Louis Cardinals"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-05",
|
||||||
|
"start_time": "2025-04-05 20:10:00",
|
||||||
|
"opponent": "St. Louis Cardinals"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-06",
|
||||||
|
"start_time": "2025-04-06 23:10:00",
|
||||||
|
"opponent": "St. Louis Cardinals"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-07",
|
||||||
|
"start_time": "2025-04-07 22:45:00",
|
||||||
|
"opponent": "Toronto Blue Jays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-08",
|
||||||
|
"start_time": "2025-04-08 22:45:00",
|
||||||
|
"opponent": "Toronto Blue Jays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-09",
|
||||||
|
"start_time": "2025-04-09 22:45:00",
|
||||||
|
"opponent": "Toronto Blue Jays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-10",
|
||||||
|
"start_time": "2025-04-10 20:10:00",
|
||||||
|
"opponent": "Toronto Blue Jays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-11",
|
||||||
|
"start_time": "2025-04-11 23:40:00",
|
||||||
|
"opponent": "Chicago White Sox"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-12",
|
||||||
|
"start_time": "2025-04-12 20:10:00",
|
||||||
|
"opponent": "Chicago White Sox"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-13",
|
||||||
|
"start_time": "2025-04-13 18:10:00",
|
||||||
|
"opponent": "Chicago White Sox"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-14",
|
||||||
|
"start_time": "2025-04-14 23:05:00",
|
||||||
|
"opponent": "Tampa Bay Rays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-15",
|
||||||
|
"start_time": "2025-04-15 23:05:00",
|
||||||
|
"opponent": "Tampa Bay Rays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-16",
|
||||||
|
"start_time": "2025-04-16 23:05:00",
|
||||||
|
"opponent": "Tampa Bay Rays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-18",
|
||||||
|
"start_time": "2025-04-18 23:10:00",
|
||||||
|
"opponent": "Chicago White Sox"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-19",
|
||||||
|
"start_time": "2025-04-19 20:10:00",
|
||||||
|
"opponent": "Chicago White Sox"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-20",
|
||||||
|
"start_time": "2025-04-20 17:35:00",
|
||||||
|
"opponent": "Chicago White Sox"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-21",
|
||||||
|
"start_time": "2025-04-21 15:10:00",
|
||||||
|
"opponent": "Chicago White Sox"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-22",
|
||||||
|
"start_time": "2025-04-22 22:45:00",
|
||||||
|
"opponent": "Seattle Mariners"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-23",
|
||||||
|
"start_time": "2025-04-23 22:45:00",
|
||||||
|
"opponent": "Seattle Mariners"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-24",
|
||||||
|
"start_time": "2025-04-24 17:35:00",
|
||||||
|
"opponent": "Seattle Mariners"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-25",
|
||||||
|
"start_time": "2025-04-25 23:10:00",
|
||||||
|
"opponent": "Cleveland Guardians"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-26",
|
||||||
|
"start_time": "2025-04-26 22:10:00",
|
||||||
|
"opponent": "Cleveland Guardians"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-27",
|
||||||
|
"start_time": "2025-04-27 17:40:00",
|
||||||
|
"opponent": "Cleveland Guardians"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-29",
|
||||||
|
"start_time": "2025-04-29 23:07:00",
|
||||||
|
"opponent": "Toronto Blue Jays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-04-30",
|
||||||
|
"start_time": "2025-04-30 23:07:00",
|
||||||
|
"opponent": "Toronto Blue Jays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-01",
|
||||||
|
"start_time": "2025-05-01 23:07:00",
|
||||||
|
"opponent": "Toronto Blue Jays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-02",
|
||||||
|
"start_time": "2025-05-02 23:10:00",
|
||||||
|
"opponent": "Minnesota Twins"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-03",
|
||||||
|
"start_time": "2025-05-03 20:10:00",
|
||||||
|
"opponent": "Minnesota Twins"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-04",
|
||||||
|
"start_time": "2025-05-04 17:35:00",
|
||||||
|
"opponent": "Minnesota Twins"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-06",
|
||||||
|
"start_time": "2025-05-06 22:45:00",
|
||||||
|
"opponent": "Texas Rangers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-07",
|
||||||
|
"start_time": "2025-05-07 22:45:00",
|
||||||
|
"opponent": "Texas Rangers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-08",
|
||||||
|
"start_time": "2025-05-08 17:35:00",
|
||||||
|
"opponent": "Texas Rangers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-09",
|
||||||
|
"start_time": "2025-05-09 23:40:00",
|
||||||
|
"opponent": "Kansas City Royals"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-10",
|
||||||
|
"start_time": "2025-05-10 23:10:00",
|
||||||
|
"opponent": "Kansas City Royals"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-11",
|
||||||
|
"start_time": "2025-05-11 18:10:00",
|
||||||
|
"opponent": "Kansas City Royals"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-12",
|
||||||
|
"start_time": "2025-05-12 22:40:00",
|
||||||
|
"opponent": "Detroit Tigers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-13",
|
||||||
|
"start_time": "2025-05-13 22:40:00",
|
||||||
|
"opponent": "Detroit Tigers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-14",
|
||||||
|
"start_time": "2025-05-14 22:40:00",
|
||||||
|
"opponent": "Detroit Tigers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-16",
|
||||||
|
"start_time": "2025-05-16 23:10:00",
|
||||||
|
"opponent": "Atlanta Braves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-17",
|
||||||
|
"start_time": "2025-05-17 23:15:00",
|
||||||
|
"opponent": "Atlanta Braves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-18",
|
||||||
|
"start_time": "2025-05-18 17:35:00",
|
||||||
|
"opponent": "Atlanta Braves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-19",
|
||||||
|
"start_time": "2025-05-19 22:45:00",
|
||||||
|
"opponent": "New York Mets"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-20",
|
||||||
|
"start_time": "2025-05-20 22:45:00",
|
||||||
|
"opponent": "New York Mets"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-21",
|
||||||
|
"start_time": "2025-05-21 22:45:00",
|
||||||
|
"opponent": "New York Mets"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-22",
|
||||||
|
"start_time": "2025-05-22 22:45:00",
|
||||||
|
"opponent": "Baltimore Orioles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-23",
|
||||||
|
"start_time": "2025-05-23 23:10:00",
|
||||||
|
"opponent": "Baltimore Orioles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-24",
|
||||||
|
"start_time": "2025-05-24 20:10:00",
|
||||||
|
"opponent": "Baltimore Orioles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-25",
|
||||||
|
"start_time": "2025-05-25 17:35:00",
|
||||||
|
"opponent": "Baltimore Orioles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-26",
|
||||||
|
"start_time": "2025-05-26 18:10:00",
|
||||||
|
"opponent": "Milwaukee Brewers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-27",
|
||||||
|
"start_time": "2025-05-27 23:40:00",
|
||||||
|
"opponent": "Milwaukee Brewers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-28",
|
||||||
|
"start_time": "2025-05-28 17:10:00",
|
||||||
|
"opponent": "Milwaukee Brewers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-30",
|
||||||
|
"start_time": "2025-05-30 23:15:00",
|
||||||
|
"opponent": "Atlanta Braves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-05-31",
|
||||||
|
"start_time": "2025-05-31 20:10:00",
|
||||||
|
"opponent": "Atlanta Braves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-01",
|
||||||
|
"start_time": "2025-06-01 17:35:00",
|
||||||
|
"opponent": "Atlanta Braves"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-02",
|
||||||
|
"start_time": "2025-06-02 23:10:00",
|
||||||
|
"opponent": "Los Angeles Angels"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-03",
|
||||||
|
"start_time": "2025-06-03 23:10:00",
|
||||||
|
"opponent": "Los Angeles Angels"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-04",
|
||||||
|
"start_time": "2025-06-04 17:35:00",
|
||||||
|
"opponent": "Los Angeles Angels"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-06",
|
||||||
|
"start_time": "2025-06-06 23:05:00",
|
||||||
|
"opponent": "New York Yankees"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-07",
|
||||||
|
"start_time": "2025-06-07 23:35:00",
|
||||||
|
"opponent": "New York Yankees"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-08",
|
||||||
|
"start_time": "2025-06-08 17:35:00",
|
||||||
|
"opponent": "New York Yankees"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-09",
|
||||||
|
"start_time": "2025-06-09 23:10:00",
|
||||||
|
"opponent": "Tampa Bay Rays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-10",
|
||||||
|
"start_time": "2025-06-10 23:10:00",
|
||||||
|
"opponent": "Tampa Bay Rays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-11",
|
||||||
|
"start_time": "2025-06-11 23:10:00",
|
||||||
|
"opponent": "Tampa Bay Rays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-13",
|
||||||
|
"start_time": "2025-06-13 23:10:00",
|
||||||
|
"opponent": "New York Yankees"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-14",
|
||||||
|
"start_time": "2025-06-14 23:15:00",
|
||||||
|
"opponent": "New York Yankees"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-15",
|
||||||
|
"start_time": "2025-06-15 17:35:00",
|
||||||
|
"opponent": "New York Yankees"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-16",
|
||||||
|
"start_time": "2025-06-17 01:40:00",
|
||||||
|
"opponent": "Seattle Mariners"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-17",
|
||||||
|
"start_time": "2025-06-18 01:40:00",
|
||||||
|
"opponent": "Seattle Mariners"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-18",
|
||||||
|
"start_time": "2025-06-18 20:10:00",
|
||||||
|
"opponent": "Seattle Mariners"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-20",
|
||||||
|
"start_time": "2025-06-21 02:15:00",
|
||||||
|
"opponent": "San Francisco Giants"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-21",
|
||||||
|
"start_time": "2025-06-21 20:05:00",
|
||||||
|
"opponent": "San Francisco Giants"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-22",
|
||||||
|
"start_time": "2025-06-22 20:05:00",
|
||||||
|
"opponent": "San Francisco Giants"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-23",
|
||||||
|
"start_time": "2025-06-24 01:38:00",
|
||||||
|
"opponent": "Los Angeles Angels"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-24",
|
||||||
|
"start_time": "2025-06-25 01:38:00",
|
||||||
|
"opponent": "Los Angeles Angels"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-25",
|
||||||
|
"start_time": "2025-06-25 20:07:00",
|
||||||
|
"opponent": "Los Angeles Angels"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-27",
|
||||||
|
"start_time": "2025-06-27 23:10:00",
|
||||||
|
"opponent": "Toronto Blue Jays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-28",
|
||||||
|
"start_time": "2025-06-28 20:10:00",
|
||||||
|
"opponent": "Toronto Blue Jays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-29",
|
||||||
|
"start_time": "2025-06-29 17:35:00",
|
||||||
|
"opponent": "Toronto Blue Jays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-06-30",
|
||||||
|
"start_time": "2025-06-30 23:10:00",
|
||||||
|
"opponent": "Cincinnati Reds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-01",
|
||||||
|
"start_time": "2025-07-01 23:10:00",
|
||||||
|
"opponent": "Cincinnati Reds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-02",
|
||||||
|
"start_time": "2025-07-02 23:10:00",
|
||||||
|
"opponent": "Cincinnati Reds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-04",
|
||||||
|
"start_time": "2025-07-04 15:05:00",
|
||||||
|
"opponent": "Washington Nationals"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-05",
|
||||||
|
"start_time": "2025-07-05 20:05:00",
|
||||||
|
"opponent": "Washington Nationals"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-06",
|
||||||
|
"start_time": "2025-07-06 17:35:00",
|
||||||
|
"opponent": "Washington Nationals"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-07",
|
||||||
|
"start_time": "2025-07-07 23:10:00",
|
||||||
|
"opponent": "Colorado Rockies"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-08",
|
||||||
|
"start_time": "2025-07-08 23:10:00",
|
||||||
|
"opponent": "Colorado Rockies"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-09",
|
||||||
|
"start_time": "2025-07-09 23:10:00",
|
||||||
|
"opponent": "Colorado Rockies"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-10",
|
||||||
|
"start_time": "2025-07-10 23:10:00",
|
||||||
|
"opponent": "Tampa Bay Rays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-11",
|
||||||
|
"start_time": "2025-07-11 23:10:00",
|
||||||
|
"opponent": "Tampa Bay Rays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-12",
|
||||||
|
"start_time": "2025-07-12 20:10:00",
|
||||||
|
"opponent": "Tampa Bay Rays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-13",
|
||||||
|
"start_time": "2025-07-13 17:35:00",
|
||||||
|
"opponent": "Tampa Bay Rays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-18",
|
||||||
|
"start_time": "2025-07-18 18:20:00",
|
||||||
|
"opponent": "Chicago Cubs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-19",
|
||||||
|
"start_time": "2025-07-19 23:15:00",
|
||||||
|
"opponent": "Chicago Cubs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-20",
|
||||||
|
"start_time": "2025-07-20 18:20:00",
|
||||||
|
"opponent": "Chicago Cubs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-21",
|
||||||
|
"start_time": "2025-07-21 22:45:00",
|
||||||
|
"opponent": "Philadelphia Phillies"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-22",
|
||||||
|
"start_time": "2025-07-22 22:45:00",
|
||||||
|
"opponent": "Philadelphia Phillies"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-23",
|
||||||
|
"start_time": "2025-07-23 23:05:00",
|
||||||
|
"opponent": "Philadelphia Phillies"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-25",
|
||||||
|
"start_time": "2025-07-25 23:10:00",
|
||||||
|
"opponent": "Los Angeles Dodgers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-26",
|
||||||
|
"start_time": "2025-07-26 23:15:00",
|
||||||
|
"opponent": "Los Angeles Dodgers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-27",
|
||||||
|
"start_time": "2025-07-27 17:35:00",
|
||||||
|
"opponent": "Los Angeles Dodgers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-28",
|
||||||
|
"start_time": "2025-07-28 23:40:00",
|
||||||
|
"opponent": "Minnesota Twins"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-29",
|
||||||
|
"start_time": "2025-07-29 23:40:00",
|
||||||
|
"opponent": "Minnesota Twins"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-07-30",
|
||||||
|
"start_time": "2025-07-30 17:10:00",
|
||||||
|
"opponent": "Minnesota Twins"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-01",
|
||||||
|
"start_time": "2025-08-01 23:10:00",
|
||||||
|
"opponent": "Houston Astros"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-02",
|
||||||
|
"start_time": "2025-08-02 20:10:00",
|
||||||
|
"opponent": "Houston Astros"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-03",
|
||||||
|
"start_time": "2025-08-03 15:35:00",
|
||||||
|
"opponent": "Houston Astros"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-04",
|
||||||
|
"start_time": "2025-08-04 23:10:00",
|
||||||
|
"opponent": "Kansas City Royals"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-05",
|
||||||
|
"start_time": "2025-08-05 23:10:00",
|
||||||
|
"opponent": "Kansas City Royals"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-06",
|
||||||
|
"start_time": "2025-08-06 23:10:00",
|
||||||
|
"opponent": "Kansas City Royals"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-08",
|
||||||
|
"start_time": "2025-08-09 01:40:00",
|
||||||
|
"opponent": "San Diego Padres"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-09",
|
||||||
|
"start_time": "2025-08-10 00:40:00",
|
||||||
|
"opponent": "San Diego Padres"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-10",
|
||||||
|
"start_time": "2025-08-10 20:10:00",
|
||||||
|
"opponent": "San Diego Padres"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-11",
|
||||||
|
"start_time": "2025-08-12 00:10:00",
|
||||||
|
"opponent": "Houston Astros"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-12",
|
||||||
|
"start_time": "2025-08-13 00:10:00",
|
||||||
|
"opponent": "Houston Astros"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-13",
|
||||||
|
"start_time": "2025-08-13 23:10:00",
|
||||||
|
"opponent": "Houston Astros"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-15",
|
||||||
|
"start_time": "2025-08-15 23:10:00",
|
||||||
|
"opponent": "Miami Marlins"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-16",
|
||||||
|
"start_time": "2025-08-16 20:10:00",
|
||||||
|
"opponent": "Miami Marlins"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-17",
|
||||||
|
"start_time": "2025-08-17 17:35:00",
|
||||||
|
"opponent": "Miami Marlins"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-18",
|
||||||
|
"start_time": "2025-08-18 23:10:00",
|
||||||
|
"opponent": "Baltimore Orioles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-19",
|
||||||
|
"start_time": "2025-08-19 23:10:00",
|
||||||
|
"opponent": "Baltimore Orioles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-21",
|
||||||
|
"start_time": "2025-08-21 23:15:00",
|
||||||
|
"opponent": "New York Yankees"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-22",
|
||||||
|
"start_time": "2025-08-22 23:05:00",
|
||||||
|
"opponent": "New York Yankees"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-23",
|
||||||
|
"start_time": "2025-08-23 17:05:00",
|
||||||
|
"opponent": "New York Yankees"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-24",
|
||||||
|
"start_time": "2025-08-24 17:35:00",
|
||||||
|
"opponent": "New York Yankees"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-25",
|
||||||
|
"start_time": "2025-08-25 22:35:00",
|
||||||
|
"opponent": "Baltimore Orioles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-26",
|
||||||
|
"start_time": "2025-08-26 22:35:00",
|
||||||
|
"opponent": "Baltimore Orioles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-27",
|
||||||
|
"start_time": "2025-08-27 22:35:00",
|
||||||
|
"opponent": "Baltimore Orioles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-28",
|
||||||
|
"start_time": "2025-08-28 17:05:00",
|
||||||
|
"opponent": "Baltimore Orioles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-29",
|
||||||
|
"start_time": "2025-08-29 23:10:00",
|
||||||
|
"opponent": "Pittsburgh Pirates"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-30",
|
||||||
|
"start_time": "2025-08-30 20:10:00",
|
||||||
|
"opponent": "Pittsburgh Pirates"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-08-31",
|
||||||
|
"start_time": "2025-08-31 17:35:00",
|
||||||
|
"opponent": "Pittsburgh Pirates"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-01",
|
||||||
|
"start_time": "2025-09-01 17:35:00",
|
||||||
|
"opponent": "Cleveland Guardians"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-02",
|
||||||
|
"start_time": "2025-09-02 22:45:00",
|
||||||
|
"opponent": "Cleveland Guardians"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-03",
|
||||||
|
"start_time": "2025-09-03 22:45:00",
|
||||||
|
"opponent": "Cleveland Guardians"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-05",
|
||||||
|
"start_time": "2025-09-06 01:40:00",
|
||||||
|
"opponent": "Arizona Diamondbacks"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-06",
|
||||||
|
"start_time": "2025-09-07 00:10:00",
|
||||||
|
"opponent": "Arizona Diamondbacks"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-07",
|
||||||
|
"start_time": "2025-09-07 20:10:00",
|
||||||
|
"opponent": "Arizona Diamondbacks"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-08",
|
||||||
|
"start_time": "2025-09-09 02:05:00",
|
||||||
|
"opponent": "Athletics"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-09",
|
||||||
|
"start_time": "2025-09-10 02:05:00",
|
||||||
|
"opponent": "Athletics"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-10",
|
||||||
|
"start_time": "2025-09-10 19:35:00",
|
||||||
|
"opponent": "Athletics"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-12",
|
||||||
|
"start_time": "2025-09-12 23:10:00",
|
||||||
|
"opponent": "New York Yankees"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-13",
|
||||||
|
"start_time": "2025-09-13 20:10:00",
|
||||||
|
"opponent": "New York Yankees"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-14",
|
||||||
|
"start_time": "2025-09-14 17:35:00",
|
||||||
|
"opponent": "New York Yankees"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-16",
|
||||||
|
"start_time": "2025-09-16 22:45:00",
|
||||||
|
"opponent": "Athletics"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-17",
|
||||||
|
"start_time": "2025-09-17 22:45:00",
|
||||||
|
"opponent": "Athletics"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-18",
|
||||||
|
"start_time": "2025-09-18 17:35:00",
|
||||||
|
"opponent": "Athletics"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-19",
|
||||||
|
"start_time": "2025-09-19 23:35:00",
|
||||||
|
"opponent": "Tampa Bay Rays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-20",
|
||||||
|
"start_time": "2025-09-20 23:05:00",
|
||||||
|
"opponent": "Tampa Bay Rays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-21",
|
||||||
|
"start_time": "2025-09-21 16:10:00",
|
||||||
|
"opponent": "Tampa Bay Rays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-23",
|
||||||
|
"start_time": "2025-09-23 23:07:00",
|
||||||
|
"opponent": "Toronto Blue Jays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-24",
|
||||||
|
"start_time": "2025-09-24 23:07:00",
|
||||||
|
"opponent": "Toronto Blue Jays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-25",
|
||||||
|
"start_time": "2025-09-25 23:07:00",
|
||||||
|
"opponent": "Toronto Blue Jays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-26",
|
||||||
|
"start_time": "2025-09-26 23:10:00",
|
||||||
|
"opponent": "Detroit Tigers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-27",
|
||||||
|
"start_time": "2025-09-27 20:10:00",
|
||||||
|
"opponent": "Detroit Tigers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date": "2025-09-28",
|
||||||
|
"start_time": "2025-09-28 19:05:00",
|
||||||
|
"opponent": "Detroit Tigers"
|
||||||
|
}
|
||||||
|
]
|
||||||
73
src/main.rs
Normal file
73
src/main.rs
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
#![cfg_attr(debug_assertions, allow(dead_code, unused_imports))]
|
||||||
|
mod weather;
|
||||||
|
mod redsox;
|
||||||
|
use tabled::Table;
|
||||||
|
use tabled::settings::{
|
||||||
|
peaker::Priority, Width, Style, Alignment, object::Columns
|
||||||
|
};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use tabled::Tabled;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Tabled)]
|
||||||
|
#[tabled(rename_all = "UPPERCASE")]
|
||||||
|
struct TableRow {
|
||||||
|
date: String,
|
||||||
|
time_of_day: String,
|
||||||
|
temp: u64,
|
||||||
|
red_sox: String,
|
||||||
|
forecast: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(unreachable_code)]
|
||||||
|
fn main() {
|
||||||
|
let baseball_diamond = '\u{f15ec}';
|
||||||
|
let sunny = '\u{f0599}';
|
||||||
|
// Set the weather location here.
|
||||||
|
let location = weather::WeatherOfficeLocation {
|
||||||
|
x: 75,
|
||||||
|
y: 59,
|
||||||
|
code: "GYX".to_string(),
|
||||||
|
};
|
||||||
|
// @todo - add a way to configure which teams to add
|
||||||
|
// @todo - add a way to get news articles?
|
||||||
|
let entire_forecast: Vec<weather::WeatherPeriod> = weather::get_full_forecast(location);
|
||||||
|
let sox_games: Vec<redsox::Game> = redsox::get_upcoming_games();
|
||||||
|
let mut table_rows: Vec<TableRow> = vec![];
|
||||||
|
for i in 0..entire_forecast.len() {
|
||||||
|
let item = &entire_forecast[i];
|
||||||
|
let date = &item.start_time[0..10];
|
||||||
|
let mut sox_status = String::new();
|
||||||
|
// Check if there is a sox game and print opp.
|
||||||
|
for sox_game in &sox_games {
|
||||||
|
if sox_game.date == date {
|
||||||
|
let mut opp_str = String::new();
|
||||||
|
opp_str.push(baseball_diamond);
|
||||||
|
opp_str.push_str(" ");
|
||||||
|
opp_str.push_str(&sox_game.opponent);
|
||||||
|
sox_status = opp_str;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut forecast_w_icon = String::new();
|
||||||
|
forecast_w_icon.push(sunny);
|
||||||
|
forecast_w_icon.push_str(" ");
|
||||||
|
forecast_w_icon.push_str(&item.detailed_forecast);
|
||||||
|
let row = TableRow {
|
||||||
|
date: date.to_string(),
|
||||||
|
time_of_day: item.name.clone(),
|
||||||
|
temp: item.temperature,
|
||||||
|
red_sox: sox_status,
|
||||||
|
forecast: forecast_w_icon,
|
||||||
|
};
|
||||||
|
table_rows.push(row);
|
||||||
|
}
|
||||||
|
let mut table = Table::new(table_rows);
|
||||||
|
table.with(Style::modern());
|
||||||
|
table.with((
|
||||||
|
Width::wrap(210).priority(Priority::max(true)),
|
||||||
|
Width::increase(50).priority(Priority::min(true)),
|
||||||
|
));
|
||||||
|
table.modify(Columns::first(), Alignment::right());
|
||||||
|
println!("{}", table);
|
||||||
|
}
|
||||||
|
|
||||||
72
src/redsox/mod.rs
Normal file
72
src/redsox/mod.rs
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use serde_alias::serde_alias;
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
const SOX_ID: i32 = 111;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
|
#[serde_alias(CamelCase,SnakeCase)]
|
||||||
|
pub struct Schedule {
|
||||||
|
pub games: Vec<Game>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
|
#[serde_alias(CamelCase,SnakeCase)]
|
||||||
|
pub struct Game {
|
||||||
|
// pub teams: Teams,
|
||||||
|
pub date: String,
|
||||||
|
// pub start_time: String,
|
||||||
|
pub opponent: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
|
#[serde_alias(CamelCase,SnakeCase)]
|
||||||
|
pub struct Teams {
|
||||||
|
away: Team,
|
||||||
|
home: Team,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
|
#[serde_alias(CamelCase,SnakeCase)]
|
||||||
|
pub struct Team {
|
||||||
|
team: TeamInfo,
|
||||||
|
league_record: TeamRecord,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
|
#[serde_alias(CamelCase,SnakeCase)]
|
||||||
|
pub struct TeamInfo {
|
||||||
|
id: i32,
|
||||||
|
name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
|
#[serde_alias(CamelCase,SnakeCase)]
|
||||||
|
pub struct TeamRecord {
|
||||||
|
wins: i32,
|
||||||
|
losses: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_upcoming_games() -> Vec<Game> {
|
||||||
|
// @todo - change this to be a dynamic request from the API endpoint instead of a local file.
|
||||||
|
let schedule_json: String = fs::read_to_string("/Users/danchadwick/Projects/rust/weather/assets/sox-schedule.json").expect("Unable to read file").to_owned();
|
||||||
|
let json: Vec<Game> = serde_json::from_str(&schedule_json).expect("Something not good?");
|
||||||
|
let upcoming_games: &Vec<Game> = &json.into_iter().take(7).collect();
|
||||||
|
upcoming_games.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the full forecast from the response.
|
||||||
|
pub fn get_schedule() -> Schedule {
|
||||||
|
let url = "https://statsapi.mlb.com/api/v1/schedule?sportId=1&teamId=111&startDate=2025-04-01&endDate=2025-09-30".to_string();
|
||||||
|
let client = reqwest::blocking::Client::new();
|
||||||
|
let schedule_string: String = client.get(&url).send().expect("Unable to get data").text().unwrap().to_string();
|
||||||
|
let json: Schedule = serde_json::from_str(&schedule_string).expect("JSON was not well-formatted");
|
||||||
|
|
||||||
|
dbg!(json);
|
||||||
|
let schedule = Schedule {
|
||||||
|
games: vec![],
|
||||||
|
};
|
||||||
|
|
||||||
|
schedule
|
||||||
|
// json
|
||||||
|
}
|
||||||
54
src/weather/mod.rs
Normal file
54
src/weather/mod.rs
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
use reqwest::header::USER_AGENT;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use serde_alias::serde_alias;
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct ForecastWrapper {
|
||||||
|
properties: Properties,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
struct Properties {
|
||||||
|
periods: Vec<WeatherPeriod>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[serde_alias(CamelCase,SnakeCase)]
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub struct WeatherPeriod {
|
||||||
|
pub name: String,
|
||||||
|
pub temperature: u64,
|
||||||
|
pub wind_direction: String,
|
||||||
|
pub wind_speed: String,
|
||||||
|
pub detailed_forecast: String,
|
||||||
|
pub start_time: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub struct WeatherOfficeLocation {
|
||||||
|
pub x: i32,
|
||||||
|
pub y: i32,
|
||||||
|
pub code: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WeatherOfficeLocation {
|
||||||
|
pub fn build_url(&self) -> String {
|
||||||
|
format!(
|
||||||
|
"https://api.weather.gov/gridpoints/{}/{},{}/forecast",
|
||||||
|
self.code,
|
||||||
|
self.x,
|
||||||
|
self.y
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the full forecast from the response.
|
||||||
|
pub fn get_full_forecast(location: WeatherOfficeLocation) -> Vec<WeatherPeriod> {
|
||||||
|
let url = WeatherOfficeLocation::build_url(&location);
|
||||||
|
let client = reqwest::blocking::Client::new();
|
||||||
|
let forecast = client.get(&url).header(USER_AGENT, "My SuperAwesome Weather App").send().expect("Unable to get data").text().unwrap().to_string();
|
||||||
|
let json: ForecastWrapper = serde_json::from_str(&forecast).expect("JSON was not well-formatted");
|
||||||
|
let periods: Vec<WeatherPeriod> = json.properties.periods.into_iter().collect();
|
||||||
|
|
||||||
|
periods
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user