From d868ef1e90a32205e5d53372738ae957d8e08d64 Mon Sep 17 00:00:00 2001 From: Arthur Roberts Date: Sat, 8 Feb 2025 00:41:21 +0000 Subject: [PATCH] Added a couple more enums and invalid-ish card list --- scryfall_deser/src/lib.rs | 300 +++++++++++++++++++++++++++++++++++++- 1 file changed, 295 insertions(+), 5 deletions(-) diff --git a/scryfall_deser/src/lib.rs b/scryfall_deser/src/lib.rs index d9b147b..3cf3999 100644 --- a/scryfall_deser/src/lib.rs +++ b/scryfall_deser/src/lib.rs @@ -88,7 +88,7 @@ struct ScryfallCard { pub printed_text: Option, pub printed_type_line: Option, pub promo: bool, - pub promo_types: Option>, // TODO enum? + pub promo_types: Option>, pub purchase_uris: Option, pub rarity: Rarity, pub related_uris: Value, // TODO: - list all the URIs? Maybe? Who cares? @@ -97,8 +97,8 @@ struct ScryfallCard { pub scryfall_set_uri: String, // URI pub set_name: String, pub set_search_uri: String, // URI - pub set_type: String, // TODO: Enum? - pub set_uri: String, // URI + pub set_type: SetType, + pub set_uri: String, // URI pub set: String, pub set_id: Uuid, pub story_spotlight: bool, @@ -423,6 +423,237 @@ enum Component { ComboPiece, } +#[allow(dead_code)] +#[derive(Deserialize, Debug)] +enum SetType { + #[serde(rename = "alchemy")] + Alchemy, + #[serde(rename = "archenemy")] + Archenemy, + #[serde(rename = "arsenal")] + Arsenal, + #[serde(rename = "box")] + Box, + #[serde(rename = "commander")] + Commander, + #[serde(rename = "core")] + Core, + #[serde(rename = "draft_innovation")] + DraftInnovation, + #[serde(rename = "duel_deck")] + DuelDeck, + #[serde(rename = "expansion")] + Expansion, + #[serde(rename = "from_the_vault")] + FromTheVault, + #[serde(rename = "funny")] + Funny, + #[serde(rename = "masterpiece")] + Masterpiece, + #[serde(rename = "masters")] + Masters, + #[serde(rename = "memorabilia")] + Memorabilia, + #[serde(rename = "minigame")] + Minigame, + #[serde(rename = "planechase")] + Planechase, + #[serde(rename = "premium_deck")] + PremiumDeck, + #[serde(rename = "promo")] + Promo, + #[serde(rename = "spellbook")] + SpellBook, + #[serde(rename = "starter")] + Starter, + #[serde(rename = "token")] + Token, + #[serde(rename = "treasure_chest")] + TreasureChest, + #[serde(rename = "vanguard")] + Vanguard, +} + +// TODO Complete this +#[allow(dead_code)] +#[derive(Deserialize, Debug)] +enum PromoTypes { + #[serde(rename = "alchemy")] + Alchemy, + #[serde(rename = "arenaleague")] + ArenaLeague, + #[serde(rename = "beginnerbox")] + BeginnerBox, + #[serde(rename = "boosterfun")] + BoosterFun, + #[serde(rename = "boxtopper")] + BoxTopper, + #[serde(rename = "brawldeck")] + BrawlDeck, + #[serde(rename = "bundle")] + Bundle, + #[serde(rename = "buyabox")] + BuyABox, + #[serde(rename = "confettifoil")] + ConfettiFoil, + #[serde(rename = "convention")] + Convention, + #[serde(rename = "datestamped")] + DateStamped, + #[serde(rename = "dossier")] + Dossier, + #[serde(rename = "doublerainbow")] + DoubleRainbow, + #[serde(rename = "embossed")] + Embossed, + #[serde(rename = "event")] + Event, + #[serde(rename = "fnm")] + Fnm, + #[serde(rename = "gameday")] + GameDay, + #[serde(rename = "godzillaseries")] + GodzillaSeries, + #[serde(rename = "halofoil")] + HaloFoil, + #[serde(rename = "imagine")] + Imagine, + #[serde(rename = "instore")] + InStore, + #[serde(rename = "intropack")] + IntroPack, + #[serde(rename = "invisibleink")] + InvisibleInk, + #[serde(rename = "judgegift")] + JudgeGift, + #[serde(rename = "league")] + League, + #[serde(rename = "magnified")] + Magnified, + #[serde(rename = "manafoil")] + ManaFoil, + #[serde(rename = "mediainsert")] + MediaInsert, + #[serde(rename = "planeswalkerdeck")] + PlaneswalkerDeck, + #[serde(rename = "plastic")] + Plastic, + #[serde(rename = "playerrewards")] + PlayerRewards, + #[serde(rename = "playtest")] + Playtest, + #[serde(rename = "poster")] + Poster, + #[serde(rename = "prerelease")] + Prerelease, + #[serde(rename = "premiereshop")] + PremiereShop, + #[serde(rename = "promopack")] + PromoPack, + #[serde(rename = "rainbowfoil")] + RainbowFoil, + #[serde(rename = "ravnicacity")] + RavnicaCity, + #[serde(rename = "rebalanced")] + Rebalanced, + #[serde(rename = "release")] + Release, + #[serde(rename = "resale")] + Resale, + #[serde(rename = "ripplefoil")] + RippleFoil, + #[serde(rename = "setpromo")] + SetPromo, + #[serde(rename = "serialized")] + Serialised, + #[serde(rename = "silverfoil")] + SilverFoil, + #[serde(rename = "sldbonus")] + SldBonus, + #[serde(rename = "stamped")] + Stamped, + #[serde(rename = "startercollection")] + StarterCollection, + #[serde(rename = "starterdeck")] + StarterDeck, + #[serde(rename = "stepandcompleat")] + StepAndCompleat, + #[serde(rename = "surgefoil")] + SurgeFoil, + #[serde(rename = "textured")] + Textured, + #[serde(rename = "themepack")] + ThemePack, + #[serde(rename = "thick")] + Thick, + #[serde(rename = "tourney")] + Tourney, + #[serde(rename = "upsidedown")] + Upsidedown, + #[serde(rename = "vault")] + Vault, + #[serde(rename = "wizardsplaynetwork")] + WizardsPlayNetwork, +} + +#[allow(dead_code)] +fn weird_cards() -> Vec { + // These all seem to be double faced cards with the same "card" on both sides. + vec![ + "018830b2-dff9-45f3-9cc2-dc5b2eec0e54".to_string(), + "0489be0d-2117-46a8-97ab-31fe480685e2".to_string(), + "048ddb71-e9ea-4f11-9b8a-c53961cf3a2c".to_string(), + "087c3a0d-c710-4451-989e-596b55352184".to_string(), + "236e9bcf-ced2-4bee-8188-41dd94df02da".to_string(), + "36ea852d-ed2b-4c56-9b73-52dce8a3e520".to_string(), + "399bf36a-5901-437f-b5d3-32283cedbbcb".to_string(), + "3cb0824c-57cc-46bf-bd43-425d58b8a762".to_string(), + "fe388da5-9197-4d07-be7f-c49fcdf56dfa".to_string(), + "f973a1f3-6dcb-470d-89d2-6ddbf2426999".to_string(), + "f4e7b3a4-a346-4177-9cfe-0142b40ef4a6".to_string(), + "e25ce640-baf5-442b-8b75-d05dd9fb20dd".to_string(), + "dae8751c-4c72-4034-a192-a1e166f20246".to_string(), + "d74a72a2-d46a-41c2-a400-70571197b020".to_string(), + "d5f7a626-7b6b-41ba-a0f5-3aefe511b267".to_string(), + "d5dfd236-b1da-4552-b94f-ebf6bb9dafdf".to_string(), + "d002b29b-c3a6-4c91-86e1-96a50ce29966".to_string(), + "caf8d01d-07aa-43da-a26e-4a2ba3a76f2d".to_string(), + "c05c6c38-d204-458c-af17-4cf5efd2c7fc".to_string(), + "bffbe9ec-edbc-43ed-a3bf-60635e7e625c".to_string(), + "b96d6ea4-a3a4-4e33-be97-b3767f2bb63a".to_string(), + "acdb72e2-c000-4b92-b5ea-73115969020f".to_string(), + "aae84079-b65b-4132-86fb-e82503bb6c7b".to_string(), + "a724ebbc-0f77-42e9-95e0-b3e7cb130148".to_string(), + "a4a2dd5b-6143-4b8d-ae71-e148cf19b66c".to_string(), + "a129558c-45a1-441c-97f0-b70b4e9d8a56".to_string(), + "9f63277b-e139-46c8-b9e3-0cfb647f44cc".to_string(), + "9e69f9e0-4981-4fc0-955f-7ebe04264fca".to_string(), + "9d943cf2-0462-4f31-9a92-d76fe4971b17".to_string(), + "9cd6a16f-1eff-4624-8f7f-4d9e70a694bb".to_string(), + "9680a2d6-1d66-4f69-b400-a79fea4187d8".to_string(), + "94eea6e3-20bc-4dab-90ba-3113c120fb90".to_string(), + "94594d48-b728-4be6-9d7a-c67088df8acd".to_string(), + "3d89c9be-2489-47e4-8e53-f980c82442b4".to_string(), + "3e3f0bcd-0796-494d-bf51-94b33c1671e9".to_string(), + "4696f5de-fe5b-40df-a194-1a73b4c5150f".to_string(), + "4d227cd3-ebfe-4dd3-929a-4f8ff7c8981e".to_string(), + "5ab0412a-2b2f-430f-8830-002a42125148".to_string(), + "60c92f1b-0c78-4809-9365-e1ffa515cb4b".to_string(), + "6620b5f4-b1e5-4d1b-bbf2-c6ad9c8284c5".to_string(), + "67574bb4-c443-40fa-b7e6-05e9965c98b8".to_string(), + "6adadbc9-4a08-4c1d-adf7-edee73799d9e".to_string(), + "6c69ecd2-cb36-4628-802b-fd5ff7405f22".to_string(), + "76c343f5-6955-4ba2-a435-36d55182d1dd".to_string(), + "7e703632-5ed0-4509-a12b-594269f865f1".to_string(), + "82fa24fb-aecc-4c33-9e79-c29651ddafbe".to_string(), + "843b35ec-7b59-4a22-8fee-2e876a02306b".to_string(), + "8ae0caed-940d-45bc-9877-7cc014b2700e".to_string(), + "8b5341ab-85a6-44b2-b738-1110e699c02b".to_string(), + "8bcf942f-5afd-414e-a50d-00d884fe59da".to_string(), + "9052f5c7-ee3b-457d-97ca-ac6b4518997c".to_string(), + ] +} + #[cfg(test)] mod tests { use super::*; @@ -458,9 +689,55 @@ mod tests { } #[test] - #[ignore] - fn try_deserialise_all_cards_line_by_line() { + fn deserialize_line_by_line_with_bad_skip() { // This function is uuuuuuugly and I'm sure a terrible way to go about things + // It is ever so slightly faster than the other one though! + let mut f = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + f.push("test_files/all-cards.json"); + assert!(f.exists(), "You need to download the all-cards-... file from Scryfall bulk data. Can be found here: https://scryfall.com/docs/api/bulk-data and rename to all-cards.json"); + let ac = fs::File::open(f).unwrap(); + let reader = BufReader::new(ac); + let weird_cards = weird_cards(); + for line in reader.lines().skip(1) { + let mut line = line.unwrap(); + let c = line.pop().unwrap(); + // this is so dumb... + if c == '}' { + line.push('}'); + } + + // don't look... + let mut skip = false; + for weird_card in &weird_cards { + if line.contains(weird_card) { + skip = true; + break; + } + } + if skip { + continue; + } + + if line.is_empty() { + continue; + }; + + let a_card: Result = + serde_json::from_str(line.as_ref()); + if let Err(error) = a_card { + println!("{:#?}", line); + println!("{:#?}", error); + } + //let a_card = a_card.unwrap(); + //println!("{:?}", a_card.promo_types) + } + } + + #[test] + #[ignore] + fn deserialize_line_by_line() { + // This function is uuuuuuugly and I'm sure a terrible way to go about things + // It is ever so slightly faster than the other one though! let mut f = PathBuf::from(env!("CARGO_MANIFEST_DIR")); f.push("test_files/all-cards.json"); assert!(f.exists(), "You need to download the all-cards-... file from Scryfall bulk data. Can be found here: https://scryfall.com/docs/api/bulk-data and rename to all-cards.json"); @@ -484,6 +761,19 @@ mod tests { println!("{:#?}", error); panic!(); } + //let a_card = a_card.unwrap(); + //println!("{:?}", a_card.promo_types) } } + + #[test] + #[ignore] + fn deserialize_whole_file() { + let mut f = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + f.push("test_files/all-cards.json"); + assert!(f.exists(), "You need to download the all-cards-... file from Scryfall bulk data. Can be found here: https://scryfall.com/docs/api/bulk-data and rename to all-cards.json"); + + let ac = fs::read_to_string(f).unwrap(); + let _ac: Vec = serde_json::from_str(&ac).unwrap(); + } }