1use serde::{Deserialize, Deserializer, Serialize};
2use serde_json::Value as JsonValue;
3use std::result::Result as StdResult;
4use strum::{Display, EnumString};
5
6#[remain::sorted]
7#[derive(Clone, Debug, Deserialize, Serialize)]
8#[cfg_attr(feature = "specta", derive(specta::Type))]
9pub struct Schema {
10 pub api_fields: JsonValue,
11 pub enums: SchemaEnum,
12 pub extlinks: JsonValue,
13}
14
15#[remain::sorted]
16#[derive(Clone, Debug, Deserialize, Serialize)]
17#[cfg_attr(feature = "specta", derive(specta::Type))]
18pub struct SchemaEnum {
19 pub language: JsonValue,
20 pub medium: JsonValue,
21 pub platform: JsonValue,
22 pub staff_role: JsonValue,
23}
24
25#[non_exhaustive]
26#[remain::sorted]
27#[derive(Clone, Debug, Serialize, PartialEq, Eq, Hash, Display, EnumString)]
28#[cfg_attr(feature = "specta", derive(specta::Type))]
29pub enum Language {
30 #[serde(rename = "zh")]
31 #[strum(serialize = "zh")]
32 Chinese,
33
34 #[serde(rename = "en")]
35 #[strum(serialize = "en")]
36 English,
37
38 #[serde(rename = "ja")]
39 #[strum(serialize = "ja")]
40 Japanese,
41
42 #[serde(rename = "ko")]
43 #[strum(serialize = "ko")]
44 Korean,
45
46 #[serde(rename = "pt")]
47 #[strum(serialize = "pt")]
48 Portuguese,
49
50 #[serde(rename = "ru")]
51 #[strum(serialize = "ru")]
52 Russian,
53
54 #[serde(rename = "es")]
55 #[strum(serialize = "es")]
56 Spanish,
57
58 Unknown(String),
59}
60
61impl<'de> Deserialize<'de> for Language {
62 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> StdResult<Self, D::Error> {
63 let s = String::deserialize(deserializer)?;
64 Ok(match s.as_str() {
65 "zh" | "zh-Hans" | "zh-Hant" => Language::Chinese,
66 "en" => Language::English,
67 "ja" => Language::Japanese,
68 "ko" => Language::Korean,
69 "pt-br" | "pt-pt" => Language::Portuguese,
70 "ru" => Language::Russian,
71 "es" => Language::Spanish,
72 _ => Language::Unknown(s),
73 })
74 }
75}