speedrun_api/types/
runs.rs

1use std::collections::HashMap;
2
3use serde::Deserialize;
4
5use crate::api::{
6    categories::CategoryId, games::GameId, levels::LevelId, platforms::PlatformId,
7    regions::RegionId, runs::RunId, users::UserId, variables::VariableId,
8};
9
10use super::Link;
11
12#[derive(Debug, Clone, PartialEq, Deserialize)]
13#[serde(rename_all = "kebab-case")]
14pub struct Run<'a> {
15    pub id: RunId<'a>,
16    pub weblink: String,
17    pub game: GameId<'a>,
18    #[serde(default)]
19    pub level: Option<LevelId<'a>>,
20    pub category: CategoryId<'a>,
21    #[serde(default)]
22    pub videos: Option<Videos>,
23    #[serde(default)]
24    pub comment: Option<String>,
25    pub status: Status<'a>,
26    pub players: Vec<Player<'a>>,
27    #[serde(default)]
28    pub date: Option<String>,
29    #[serde(default)]
30    pub submitted: Option<String>,
31    pub times: Times,
32    pub system: System<'a>,
33    #[serde(default)]
34    pub splits: Option<Link>,
35    #[serde(default)]
36    pub values: HashMap<VariableId<'a>, String>,
37    #[serde(default)]
38    pub links: Option<Vec<Link>>,
39}
40
41#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
42#[serde(rename_all = "kebab-case")]
43pub struct Videos {
44    pub text: Option<String>,
45    #[serde(default)]
46    pub links: Vec<VideoLink>,
47}
48
49#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
50#[serde(rename_all = "kebab-case")]
51pub struct VideoLink {
52    pub uri: String,
53}
54
55#[derive(Debug, Clone, PartialEq, Deserialize)]
56#[serde(rename_all = "kebab-case")]
57#[serde(tag = "status")]
58pub enum Status<'a> {
59    New,
60    #[serde(rename_all = "kebab-case")]
61    Verified {
62        examiner: Option<UserId<'a>>,
63        verify_date: Option<String>,
64    },
65    Rejected {
66        examiner: UserId<'a>,
67        reason: String,
68    },
69}
70
71#[derive(Debug, Clone, PartialEq, Deserialize)]
72#[serde(rename_all = "kebab-case")]
73#[serde(tag = "rel")]
74pub enum Player<'a> {
75    User { id: UserId<'a>, uri: String },
76    Guest { name: String, uri: String },
77}
78
79#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
80#[serde(rename_all = "snake_case")]
81pub struct Times {
82    pub primary: String,
83    pub primary_t: f64,
84    pub realtime: Option<String>,
85    pub realtime_t: f64,
86    pub realtime_noloads: Option<String>,
87    pub realtime_noloads_t: f64,
88    pub ingame: Option<String>,
89    pub ingame_t: f64,
90}
91
92#[derive(Default, Debug, Clone, PartialEq, Deserialize)]
93#[serde(rename_all = "kebab-case")]
94pub struct System<'a> {
95    pub platform: Option<PlatformId<'a>>,
96    pub emulated: bool,
97    pub region: Option<RegionId<'a>>,
98}