scores

football-data.org terminal interface
Log | Files | Refs | README | LICENSE

commit a9e4a3e6c6d1734057c2f241bbca4b41702dff25
parent 7d5acdf47d9b7afacd44d71c64af0c00e3782a11
Author: mtmn <miro@haravara.org>
Date:   Thu,  7 May 2026 20:40:10 +0200

fix: fix tests and mismatched types

Diffstat:
Msrc/display.rs | 16+++++++++-------
Msrc/models.rs | 18+++++++++---------
2 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/src/display.rs b/src/display.rs @@ -1,6 +1,6 @@ use crate::models::{Match, StandingsResponse}; use chrono::Utc; -use prettytable::{format, Cell, Row, Table}; +use prettytable::{Cell, Row, Table, format}; const STATUS_ICONS: &[(&str, &str)] = &[("FINISHED", "✓"), ("SCHEDULED", "⏰"), ("IN_PLAY", "▶")]; @@ -115,8 +115,9 @@ pub fn display_table(matches: &[Match]) { } pub fn display_standings(standings_response: StandingsResponse) { + let mut printed = false; for standing in standings_response.standings { - if standing.table.is_empty() { + if standing.table.is_empty() || printed { continue; } @@ -158,6 +159,7 @@ pub fn display_standings(standings_response: StandingsResponse) { } table.printstd(); + printed = true; } } @@ -170,14 +172,14 @@ mod tests { fn create_match(date: Option<chrono::DateTime<Utc>>, home: &str, away: &str) -> Match { Match { utc_date: date, - status: "SCHEDULED".to_string(), + status: Some("SCHEDULED".to_string()), matchday: Some(1), home_team: Team { - name: home.to_string(), + name: Some(home.to_string()), tla: Some(home[..3].to_string()), }, away_team: Team { - name: away.to_string(), + name: Some(away.to_string()), tla: Some(away[..3].to_string()), }, score: Score { @@ -219,7 +221,7 @@ mod tests { let result = filter_matches(matches, None, false); assert_eq!(result.len(), 1); - assert_eq!(result[0].home_team.name, "Liverpool"); + assert_eq!(result[0].home_team.name, Some("Liverpool".to_string())); } #[test] @@ -242,7 +244,7 @@ mod tests { let matches = vec![create_match(Some(future), "Arsenal", "Chelsea")]; - let result = filter_matches(matches, Some("arsenal"), true); + let result = filter_matches(matches.clone(), Some("arsenal"), true); assert_eq!(result.len(), 1); let result = filter_matches(matches, Some("ARSENAL"), true); diff --git a/src/models.rs b/src/models.rs @@ -1,7 +1,7 @@ use chrono::{DateTime, Utc}; use serde::Deserialize; -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct Match { pub utc_date: Option<DateTime<Utc>>, @@ -12,35 +12,35 @@ pub struct Match { pub score: Score, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Clone)] pub struct Team { pub name: Option<String>, pub tla: Option<String>, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct Score { pub full_time: ScoreDetail, } -#[derive(Debug, Deserialize, Default)] +#[derive(Debug, Deserialize, Default, Clone)] pub struct ScoreDetail { pub home: Option<u32>, pub away: Option<u32>, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Clone)] pub struct MatchesResponse { pub matches: Vec<Match>, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Clone)] pub struct StandingsResponse { pub standings: Vec<Standing>, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Clone)] pub struct Standing { #[serde(rename = "type")] #[allow(dead_code)] @@ -53,7 +53,7 @@ pub struct Standing { pub table: Vec<TableEntry>, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct TableEntry { pub position: u32, @@ -68,7 +68,7 @@ pub struct TableEntry { pub goal_difference: i32, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Clone)] pub struct TeamInfo { pub name: String, }