1pub use crate::utils::tag_utils::GameTag;
12use serde::{Deserialize, Serialize};
13use std::collections::HashMap;
14use std::str::FromStr;
15
16#[derive(Debug, Serialize, Deserialize, Clone)]
20pub enum ImportConfidence {
21 High,
22 Medium,
23 Low,
24}
25
26impl FromStr for ImportConfidence {
27 type Err = ();
28 fn from_str(s: &str) -> Result<Self, Self::Err> {
29 match s {
30 "High" => Ok(ImportConfidence::High),
31 "Medium" => Ok(ImportConfidence::Medium),
32 "Low" => Ok(ImportConfidence::Low),
33 _ => Err(()),
34 }
35 }
36}
37
38impl std::fmt::Display for ImportConfidence {
39 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
40 let s = match self {
41 ImportConfidence::High => "High",
42 ImportConfidence::Medium => "Medium",
43 ImportConfidence::Low => "Low",
44 };
45 write!(f, "{}", s)
46 }
47}
48
49#[derive(Debug, Serialize, Deserialize, Clone)]
51pub enum Platform {
52 Steam,
53 Epic,
54 GOG,
55 Amazon,
56 Ubisoft,
57 EA,
58 BattleNet,
59 Xbox,
60 Heroic,
61 LegacyGames,
62 Indiegala,
63 Itch,
64 Indie,
65 Outra,
66}
67
68impl FromStr for Platform {
69 type Err = ();
70 fn from_str(s: &str) -> Result<Self, Self::Err> {
71 match s {
72 "Steam" => Ok(Platform::Steam),
73 "Epic" => Ok(Platform::Epic),
74 "GOG" => Ok(Platform::GOG),
75 "Amazon" => Ok(Platform::Amazon),
76 "Ubisoft" => Ok(Platform::Ubisoft),
77 "EA" => Ok(Platform::EA),
78 "BattleNet" => Ok(Platform::BattleNet),
79 "Xbox" => Ok(Platform::Xbox),
80 "Heroic" => Ok(Platform::Heroic),
81 "LegacyGames" => Ok(Platform::LegacyGames),
82 "Indiegala" => Ok(Platform::Indiegala),
83 "Itch" => Ok(Platform::Itch),
84 "Indie" => Ok(Platform::Indie),
85 "Outra" => Ok(Platform::Outra),
86 _ => Err(()),
87 }
88 }
89}
90
91impl std::fmt::Display for Platform {
92 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
93 let s = match self {
94 Platform::Steam => "Steam",
95 Platform::Epic => "Epic",
96 Platform::GOG => "GOG",
97 Platform::Amazon => "Amazon",
98 Platform::EA => "EA",
99 Platform::Ubisoft => "Ubisoft",
100 Platform::BattleNet => "BattleNet",
101 Platform::Xbox => "Xbox",
102 Platform::Heroic => "Heroic",
103 Platform::LegacyGames => "LegacyGames",
104 Platform::Indiegala => "Indiegala",
105 Platform::Itch => "Itch",
106 Platform::Indie => "Indie",
107 Platform::Outra => "Outra",
108 };
109 write!(f, "{}", s)
110 }
111}
112
113#[derive(Debug, Serialize, Deserialize, Clone)]
120#[serde(rename_all = "camelCase")]
121pub struct Game {
122 pub id: String,
123 pub name: String,
124 pub cover_url: Option<String>,
125 pub genres: Option<String>,
126 pub developer: Option<String>,
127 pub platform: Platform,
128 pub platform_game_id: String,
129
130 pub installed: bool,
132 pub install_path: Option<String>,
133 pub executable_path: Option<String>,
134 pub launch_args: Option<String>,
135 pub import_confidence: Option<ImportConfidence>,
136
137 pub user_rating: Option<i32>,
139 pub favorite: bool,
140 pub status: Option<String>,
141 pub playtime: Option<i32>,
142
143 pub last_played: Option<String>,
145 pub added_at: String,
146
147 #[serde(default)]
149 pub is_adult: bool,
150}
151
152#[derive(Debug, Serialize, Deserialize)]
157#[serde(rename_all = "camelCase")]
158pub struct GameDetails {
159 pub game_id: String,
160 pub steam_app_id: Option<String>,
161
162 pub developer: Option<String>,
164 pub publisher: Option<String>,
165 pub release_date: Option<String>,
166
167 pub genres: Option<String>,
169 pub tags: Option<Vec<GameTag>>,
170 pub series: Option<String>,
171
172 pub description_raw: Option<String>,
174 pub description_ptbr: Option<String>,
175
176 pub background_image: Option<String>,
178
179 pub critic_score: Option<i32>,
181
182 pub steam_review_label: Option<String>,
184 pub steam_review_count: Option<i32>,
185 pub steam_review_score: Option<f32>,
186 pub steam_review_updated_at: Option<String>,
187
188 pub esrb_rating: Option<String>,
190 pub is_adult: bool,
191 pub adult_tags: Option<String>,
192
193 pub external_links: Option<HashMap<String, String>>,
195
196 pub median_playtime: Option<i32>, pub estimated_playtime: Option<f32>, }
200
201#[derive(Debug, Serialize, Deserialize)]
206#[serde(rename_all = "camelCase")]
207pub struct WishlistGame {
208 pub id: String,
209 pub name: String,
210 pub cover_url: Option<String>,
211 pub store_url: Option<String>,
212 pub store_platform: Option<String>,
213 pub itad_id: Option<String>,
214 pub current_price: Option<f64>,
215 pub normal_price: Option<f64>,
216 pub lowest_price: Option<f64>,
217 pub currency: Option<String>,
218 pub on_sale: bool,
219 pub voucher: Option<String>,
220 pub added_at: Option<String>,
221}
222
223#[derive(Debug, Serialize, Deserialize, Clone)]
228pub struct Subscription {
229 pub service: String, pub enabled: bool,
231 #[serde(rename = "lastSynced")]
233 pub last_synced: Option<String>,
234}
235
236#[derive(Debug, Serialize, Deserialize, Default)]
243#[serde(rename_all = "camelCase")]
244pub struct GameExtras {
245 pub steam_app_id: String,
246 pub pcgw_page_id: Option<String>,
247 pub pcgw_page_name: Option<String>,
248 pub engine: Option<String>,
249
250 pub available_on: Option<String>,
252
253 pub dx_versions: Option<String>, pub vulkan_versions: Option<String>,
256 pub opengl_versions: Option<String>,
257
258 pub win64: Option<String>,
260 pub linux64: Option<String>,
261 #[serde(rename = "macOsArm")]
262 pub macos_arm: Option<String>,
263 #[serde(rename = "macOsIntel64")]
264 pub macos_intel64: Option<String>,
265
266 pub ray_tracing: Option<String>,
268 pub upscaling: Option<String>, pub frame_gen: Option<String>, pub ultrawidescreen: Option<String>,
273 pub four_k_support: Option<String>,
274 pub hdr: Option<String>,
275 pub high_fps: Option<String>, pub fov: Option<String>, pub borderless_windowed: Option<String>,
278 pub color_blind: Option<String>,
279
280 pub controller_support: Option<String>,
282 pub full_controller: Option<String>,
283 pub playstation_controllers: Option<String>,
284 pub xinput_controllers: Option<String>,
285
286 pub surround_sound: Option<String>,
288 pub subtitles: Option<String>,
289 pub closed_captions: Option<String>,
290
291 pub has_save_data: Option<String>,
293 pub has_config_data: Option<String>,
294
295 pub languages_interface: Option<Vec<String>>,
297 pub languages_audio: Option<Vec<String>>,
298 pub languages_subtitles: Option<Vec<String>>,
299
300 pub fetched_at: Option<String>,
301}
302
303#[derive(Debug, Clone, Serialize, Deserialize, Default)]
307#[serde(rename_all = "camelCase")]
308pub struct SystemRequirements {
309 pub steam_app_id: String,
310 pub os_family: String, pub tier_title: Option<String>, pub target: Option<String>, pub min_os: Option<String>,
316 pub min_cpu: Option<String>,
317 pub min_cpu2: Option<String>,
318 pub min_ram: Option<String>,
319 pub min_gpu: Option<String>,
320 pub min_gpu2: Option<String>,
321 pub min_vram: Option<String>,
322 pub min_dx: Option<String>,
323 pub min_storage: Option<String>,
324
325 pub rec_os: Option<String>,
327 pub rec_cpu: Option<String>,
328 pub rec_cpu2: Option<String>,
329 pub rec_ram: Option<String>,
330 pub rec_gpu: Option<String>,
331 pub rec_gpu2: Option<String>,
332 pub rec_vram: Option<String>,
333 pub rec_dx: Option<String>,
334 pub rec_storage: Option<String>,
335}
336
337#[derive(Debug, Clone, Serialize, Deserialize)]
339#[serde(rename_all = "camelCase")]
340pub struct GameDataPath {
341 pub steam_app_id: String,
342 pub kind: String, pub os: String, pub raw_path: String, pub expanded_path: Option<String>, }
347
348#[derive(Debug, Default, Serialize, Deserialize)]
350#[serde(rename_all = "camelCase")]
351pub struct PcgwScrapedData {
352 pub system_requirements: Vec<SystemRequirements>,
353 pub game_data_paths: Vec<GameDataPath>,
354}