use chrono::{Duration, NaiveDate};
use serde::Deserialize;
use crate::deserialize::deserialize_minutes;
use crate::ItemSubType;
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct Plays {
#[serde(default)]
pub username: String,
#[serde(default, rename = "userid")]
pub user_id: u64,
pub total: u64,
pub page: u64,
#[serde(default = "Vec::new", rename = "play")]
pub plays: Vec<Play>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct Play {
pub id: u64,
pub date: NaiveDate,
pub quantity: u64,
#[serde(default, rename = "length", deserialize_with = "deserialize_minutes")]
pub duration: Duration,
pub incomplete: bool,
pub location: String,
#[serde(rename = "nowinstats")]
pub do_not_count_win_stats: bool,
#[serde(rename = "item")]
pub played_item: PlayedItem,
#[serde(
default = "Vec::new",
deserialize_with = "deserialize_nested_players_list"
)]
pub players: Vec<Player>,
#[serde(default)]
pub comments: Option<String>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct PlayedItem {
pub name: String,
#[serde(rename = "objectid")]
pub id: u64,
#[serde(
default = "Vec::new",
deserialize_with = "deserialize_nested_sub_types_list",
rename = "subtypes"
)]
pub sub_types: Vec<ItemSubType>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
struct SubTypesXml {
#[serde(default = "Vec::new", rename = "subtype")]
sub_types: Vec<SubTypeXml>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
struct SubTypeXml {
value: ItemSubType,
}
fn deserialize_nested_sub_types_list<'de, D>(deserializer: D) -> Result<Vec<ItemSubType>, D::Error>
where
D: serde::de::Deserializer<'de>,
{
let sub_types_xml = SubTypesXml::deserialize(deserializer)?;
Ok(sub_types_xml
.sub_types
.into_iter()
.map(|xml| xml.value)
.collect())
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
struct PlayersXml {
#[serde(default = "Vec::new", rename = "player")]
players: Vec<Player>,
}
fn deserialize_nested_players_list<'de, D>(deserializer: D) -> Result<Vec<Player>, D::Error>
where
D: serde::de::Deserializer<'de>,
{
let players_xml = PlayersXml::deserialize(deserializer)?;
Ok(players_xml.players)
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct Player {
pub username: Option<String>,
#[serde(rename = "userid")]
pub user_id: Option<u64>,
pub name: String,
#[serde(rename = "startposition")]
pub start_position: String,
pub color: String,
pub score: String,
#[serde(rename = "new")]
pub first_time_playing: bool,
pub rating: u64,
#[serde(rename = "win")]
pub won: bool,
}