vn-core 0.11.1

VNDB for Rust
Documentation
use serde::{Deserialize, Deserializer, Serialize};
use serde_json::Value as JsonValue;
use std::result::Result as StdResult;
use strum::{Display, EnumString};

#[remain::sorted]
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "specta", derive(specta::Type))]
pub struct Schema {
  pub api_fields: JsonValue,
  pub enums: SchemaEnum,
  pub extlinks: JsonValue,
}

#[remain::sorted]
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "specta", derive(specta::Type))]
pub struct SchemaEnum {
  pub language: JsonValue,
  pub medium: JsonValue,
  pub platform: JsonValue,
  pub staff_role: JsonValue,
}

#[non_exhaustive]
#[remain::sorted]
#[derive(Clone, Debug, Serialize, PartialEq, Eq, Hash, Display, EnumString)]
#[cfg_attr(feature = "specta", derive(specta::Type))]
pub enum Language {
  #[serde(rename = "zh")]
  #[strum(serialize = "zh")]
  Chinese,

  #[serde(rename = "en")]
  #[strum(serialize = "en")]
  English,

  #[serde(rename = "ja")]
  #[strum(serialize = "ja")]
  Japanese,

  #[serde(rename = "ko")]
  #[strum(serialize = "ko")]
  Korean,

  #[serde(rename = "pt")]
  #[strum(serialize = "pt")]
  Portuguese,

  #[serde(rename = "ru")]
  #[strum(serialize = "ru")]
  Russian,

  #[serde(rename = "es")]
  #[strum(serialize = "es")]
  Spanish,

  Unknown(String),
}

impl<'de> Deserialize<'de> for Language {
  fn deserialize<D: Deserializer<'de>>(deserializer: D) -> StdResult<Self, D::Error> {
    let s = String::deserialize(deserializer)?;
    Ok(match s.as_str() {
      "zh" | "zh-Hans" | "zh-Hant" => Language::Chinese,
      "en" => Language::English,
      "ja" => Language::Japanese,
      "ko" => Language::Korean,
      "pt-br" | "pt-pt" => Language::Portuguese,
      "ru" => Language::Russian,
      "es" => Language::Spanish,
      _ => Language::Unknown(s),
    })
  }
}