Skip to main content

ygo_core/card/
mod.rs

1mod attribute;
2mod banlist;
3mod format;
4mod frame_type;
5mod language;
6mod race;
7mod r#type;
8
9use serde::{Deserialize, Serialize};
10use url::Url;
11
12pub use attribute::CardAttribute;
13pub use banlist::{BanlistInfo, BanlistStatus};
14pub use format::CardFormat;
15pub use frame_type::CardFrameType;
16pub use language::Language;
17pub use race::CardRace;
18pub use r#type::CardType;
19
20#[remain::sorted]
21#[derive(Clone, Debug, Default, Deserialize, Serialize)]
22#[cfg_attr(feature = "specta", derive(specta::Type))]
23#[serde(default)]
24pub struct Card {
25  pub archetype: Option<String>,
26  pub atk: Option<i32>,
27  pub attribute: Option<CardAttribute>,
28  pub banlist_info: Option<BanlistInfo>,
29  pub card_images: Vec<CardImage>,
30  pub card_prices: Vec<CardPrice>,
31  pub card_sets: Vec<CardSet>,
32  pub def: Option<i32>,
33  pub desc: Option<String>,
34  #[serde(rename = "frameType")]
35  pub frame_type: Option<CardFrameType>,
36  #[serde(rename = "humanReadableCardType")]
37  pub human_readable_card_type: Option<String>,
38  pub id: Option<CardId>,
39  pub level: Option<u8>,
40  pub linkmarkers: Vec<String>,
41  pub linkval: Option<u8>,
42  pub misc_info: Vec<CardMisc>,
43  pub monster_desc: Option<String>,
44  pub name: Option<String>,
45  pub pend_desc: Option<String>,
46  pub r#type: Option<CardType>,
47  pub race: Option<CardRace>,
48  pub scale: Option<u8>,
49  pub typeline: Vec<String>,
50  pub ygoprodeck_url: Option<Url>,
51}
52
53impl Card {
54  pub fn formats(&self) -> impl Iterator<Item = CardFormat> {
55    self
56      .misc_info
57      .iter()
58      .flat_map(|misc| misc.formats.iter())
59      .copied()
60  }
61}
62
63#[derive(
64  Clone,
65  Copy,
66  Debug,
67  Deserialize,
68  Serialize,
69  PartialEq,
70  Eq,
71  PartialOrd,
72  Ord,
73  Hash,
74  derive_more::Display,
75  derive_more::From,
76  derive_more::Into,
77)]
78#[cfg_attr(feature = "specta", derive(specta::Type))]
79pub struct CardId(u32);
80
81#[remain::sorted]
82#[derive(Clone, Debug, Default, Deserialize, Serialize)]
83#[cfg_attr(feature = "specta", derive(specta::Type))]
84#[serde(default)]
85pub struct CardSet {
86  pub set_code: Option<String>,
87  pub set_name: Option<String>,
88  pub set_price: Option<String>,
89  pub set_rarity: Option<String>,
90  pub set_rarity_code: Option<String>,
91}
92
93#[remain::sorted]
94#[derive(Clone, Debug, Default, Deserialize, Serialize)]
95#[cfg_attr(feature = "specta", derive(specta::Type))]
96#[serde(default)]
97pub struct CardImage {
98  pub id: Option<u32>,
99  pub image_url: Option<Url>,
100  pub image_url_cropped: Option<Url>,
101  pub image_url_small: Option<Url>,
102}
103
104#[remain::sorted]
105#[derive(Clone, Debug, Default, Deserialize, Serialize)]
106#[cfg_attr(feature = "specta", derive(specta::Type))]
107#[serde(default)]
108pub struct CardPrice {
109  pub amazon_price: Option<String>,
110  pub cardmarket_price: Option<String>,
111  pub coolstuffinc_price: Option<String>,
112  pub ebay_price: Option<String>,
113  pub tcgplayer_price: Option<String>,
114}
115
116#[remain::sorted]
117#[derive(Clone, Debug, Default, Deserialize, Serialize)]
118#[cfg_attr(feature = "specta", derive(specta::Type))]
119#[serde(default)]
120pub struct CardMisc {
121  pub beta_id: Option<u32>,
122  pub beta_name: Option<String>,
123  pub downvotes: Option<u32>,
124  pub formats: Vec<CardFormat>,
125  pub has_effect: Option<u8>,
126  pub konami_id: Option<i32>,
127  pub md_rarity: Option<String>,
128  pub ocg_date: Option<String>,
129  pub question_atk: Option<u8>,
130  pub staple: Option<String>,
131  pub tcg_date: Option<String>,
132  pub treated_as: Option<String>,
133  pub upvotes: Option<u32>,
134  pub views: Option<u32>,
135  pub viewsweek: Option<u32>,
136}