speedrun_api/types/
runs.rs1use 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}