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}