deserlize all cards
This commit is contained in:
parent
97aa161166
commit
91a56a77dc
|
@ -6,59 +6,8 @@ version = 3
|
|||
name = "aro"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"crossterm",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tui",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "cassowary"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "crossterm"
|
||||
version = "0.25.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"crossterm_winapi",
|
||||
"libc",
|
||||
"mio",
|
||||
"parking_lot",
|
||||
"signal-hook",
|
||||
"signal-hook-mio",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossterm_winapi"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c"
|
||||
dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -67,66 +16,6 @@ version = "1.0.4"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.137"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89"
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
version = "0.4.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"scopeguard",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mio"
|
||||
version = "0.8.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"log",
|
||||
"wasi",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot"
|
||||
version = "0.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
|
||||
dependencies = [
|
||||
"lock_api",
|
||||
"parking_lot_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot_core"
|
||||
version = "0.9.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"redox_syscall",
|
||||
"smallvec",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.47"
|
||||
|
@ -145,27 +34,12 @@ dependencies = [
|
|||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.2.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.147"
|
||||
|
@ -197,42 +71,6 @@ dependencies = [
|
|||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook"
|
||||
version = "0.3.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"signal-hook-registry",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook-mio"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"mio",
|
||||
"signal-hook",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook-registry"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.103"
|
||||
|
@ -244,118 +82,8 @@ dependencies = [
|
|||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tui"
|
||||
version = "0.19.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ccdd26cbd674007e649a272da4475fb666d3aa0ad0531da7136db6fab0e5bad1"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"cassowary",
|
||||
"crossterm",
|
||||
"unicode-segmentation",
|
||||
"unicode-width",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-segmentation"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-width"
|
||||
version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.11.0+wasi-snapshot-preview1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
||||
dependencies = [
|
||||
"winapi-i686-pc-windows-gnu",
|
||||
"winapi-x86_64-pc-windows-gnu",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-i686-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-x86_64-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm",
|
||||
"windows_aarch64_msvc",
|
||||
"windows_i686_gnu",
|
||||
"windows_i686_msvc",
|
||||
"windows_x86_64_gnu",
|
||||
"windows_x86_64_gnullvm",
|
||||
"windows_x86_64_msvc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
|
||||
|
|
|
@ -6,5 +6,3 @@ edition = "2021"
|
|||
[dependencies]
|
||||
serde_json = "1.0"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
tui = "0.19.0"
|
||||
crossterm = "0.25.0"
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
279
src/main.rs
279
src/main.rs
|
@ -1,149 +1,172 @@
|
|||
use crossterm::terminal::enable_raw_mode;
|
||||
use serde::Deserialize;
|
||||
use std::{io, iter, time::Duration};
|
||||
use tui::{
|
||||
backend::CrosstermBackend,
|
||||
layout,
|
||||
style::{Color, Style},
|
||||
text::Text,
|
||||
widgets::{Block, Borders, List, ListItem, Paragraph, Widget},
|
||||
};
|
||||
|
||||
type Terminal = tui::Terminal<CrosstermBackend<io::Stdout>>;
|
||||
use serde::{de::Visitor, Deserialize, Deserializer};
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let stdout = io::stdout();
|
||||
enable_raw_mode()?;
|
||||
let mut backend = CrosstermBackend::new(stdout);
|
||||
let mut terminal = Terminal::new(backend)?;
|
||||
terminal.hide_cursor()?;
|
||||
terminal.clear()?;
|
||||
let all_cards= vec![
|
||||
Card::SpellCard {
|
||||
name: "The Cheerful Coffin".to_owned(),
|
||||
text: "Discard up to 3 Monster Cards from your hand to the Graveyard.".to_owned()
|
||||
},
|
||||
Card::EffectMonster {
|
||||
name: "Des Lacooda".to_owned(),
|
||||
effect: "Once per turn: You can change this card to face-down Defense Position. When this card is Flip Summoned: Draw 1 card.".to_owned(),
|
||||
atk: 500,
|
||||
def: 600,
|
||||
level: 3,
|
||||
r#type: "Zombie".to_owned(),
|
||||
attribute: "EARTH".to_owned(),
|
||||
let cards: CardInfo =
|
||||
serde_json::from_reader(std::io::BufReader::new(std::fs::File::open("cards.json")?))?;
|
||||
println!("{} cards read", cards.data.len());
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
|
||||
struct CardInfo {
|
||||
data: Vec<Card>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
|
||||
struct CardBase {
|
||||
//#[serde(rename = "type", deserialize_with = "split_types")]
|
||||
//card_type: Vec<String>,
|
||||
name: String,
|
||||
#[serde(rename = "desc")]
|
||||
text: String,
|
||||
}
|
||||
|
||||
fn split_types<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Vec<String>, D::Error> {
|
||||
struct SplittingVisitor;
|
||||
|
||||
impl<'de> Visitor<'de> for SplittingVisitor {
|
||||
type Value = Vec<String>;
|
||||
|
||||
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
formatter.write_str("a string")
|
||||
}
|
||||
];
|
||||
let mut cards = all_cards.clone();
|
||||
let mut search_text = String::new();
|
||||
|
||||
loop {
|
||||
refresh(&mut terminal, &cards, &search_text);
|
||||
fn visit_str<E: serde::de::Error>(self, v: &str) -> Result<Self::Value, E> {
|
||||
Ok(v.split_whitespace()
|
||||
.filter(|t| t != &"Card")
|
||||
.map(str::to_owned)
|
||||
.collect())
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
deserializer.deserialize_any(SplittingVisitor)
|
||||
}
|
||||
|
||||
fn refresh(term: &mut Terminal, cards: &Vec<Card>, search_text: &str) -> Result<(), io::Error> {
|
||||
let mut list = selectable_list(
|
||||
search_text,
|
||||
cards
|
||||
.iter()
|
||||
.map(|c| ListItem::new(format!("{c:?}")))
|
||||
.collect::<Vec<_>>(),
|
||||
None,
|
||||
);
|
||||
term.draw(|mut frame| {
|
||||
frame.render_widget(list, frame.size());
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn selectable_list<'a>(
|
||||
title: &'a str,
|
||||
content: Vec<ListItem<'a>>,
|
||||
selected: Option<usize>,
|
||||
) -> List<'a> {
|
||||
List::new(content)
|
||||
.block(
|
||||
Block::default()
|
||||
.title(title)
|
||||
.borders(Borders::TOP | Borders::RIGHT | Borders::LEFT),
|
||||
)
|
||||
.highlight_style(Style::default().fg(Color::LightGreen))
|
||||
.highlight_symbol(">")
|
||||
#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
|
||||
struct Monster {
|
||||
// None for ?
|
||||
atk: Option<i32>,
|
||||
attribute: String,
|
||||
#[serde(rename = "race")]
|
||||
r#type: String,
|
||||
// None for ? or link monsters
|
||||
def: Option<i32>,
|
||||
// also includes rank
|
||||
level: Option<u8>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
|
||||
#[serde(tag = "type")]
|
||||
enum Card {
|
||||
#[serde(rename = "Spell Card")]
|
||||
SpellCard {
|
||||
name: String,
|
||||
#[serde(rename = "desc")]
|
||||
text: String,
|
||||
#[serde(alias = "Spell Card", alias = "Trap Card")]
|
||||
Backrow {
|
||||
#[serde(flatten)]
|
||||
base: CardBase,
|
||||
},
|
||||
#[serde(rename = "Skill Card")]
|
||||
Skill {
|
||||
#[serde(flatten)]
|
||||
base: CardBase,
|
||||
},
|
||||
#[serde(
|
||||
rename = "Effect Monster",
|
||||
alias = "Effect Monster",
|
||||
alias = "Flip Effect Monster",
|
||||
alias = "Union Effect Monster"
|
||||
alias = "Fusion Monster",
|
||||
alias = "Gemini Monster",
|
||||
alias = "Link Monster",
|
||||
alias = "Normal Monster",
|
||||
alias = "Normal Tuner Monster",
|
||||
alias = "Pendulum Effect Fusion Monster",
|
||||
alias = "Pendulum Effect Monster",
|
||||
alias = "Pendulum Effect Ritual Monster",
|
||||
alias = "Pendulum Flip Effect Monster",
|
||||
alias = "Pendulum Normal Monster",
|
||||
alias = "Pendulum Tuner Effect Monster",
|
||||
alias = "Ritual Effect Monster",
|
||||
alias = "Ritual Monster",
|
||||
alias = "Spirit Monster",
|
||||
alias = "Synchro Monster",
|
||||
alias = "Synchro Pendulum Effect Monster",
|
||||
alias = "Synchro Tuner Monster",
|
||||
alias = "Token",
|
||||
alias = "Toon Monster",
|
||||
alias = "Tuner Monster",
|
||||
alias = "Union Effect Monster",
|
||||
alias = "XYZ Monster",
|
||||
alias = "XYZ Pendulum Effect Monster"
|
||||
)]
|
||||
EffectMonster {
|
||||
name: String,
|
||||
#[serde(rename = "desc")]
|
||||
effect: String,
|
||||
atk: i32,
|
||||
def: i32,
|
||||
level: i32,
|
||||
attribute: String,
|
||||
#[serde(rename = "race")]
|
||||
r#type: String,
|
||||
Monster {
|
||||
#[serde(flatten)]
|
||||
base: CardBase,
|
||||
#[serde(flatten)]
|
||||
monster: Monster,
|
||||
#[serde(default, rename = "linkval")]
|
||||
link_rating: u8,
|
||||
#[serde(default)]
|
||||
linkmarkers: Vec<String>,
|
||||
},
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_spell() {
|
||||
let s = r#"
|
||||
{
|
||||
"id": 41142615,
|
||||
"name": "The Cheerful Coffin",
|
||||
"type": "Spell Card",
|
||||
"desc": "Discard up to 3 Monster Cards from your hand to the Graveyard.",
|
||||
"race": "Normal"
|
||||
}"#;
|
||||
let coffin: Card = serde_json::from_str(s).unwrap();
|
||||
assert_eq!(
|
||||
coffin,
|
||||
Card::SpellCard {
|
||||
name: "The Cheerful Coffin".to_owned(),
|
||||
text: "Discard up to 3 Monster Cards from your hand to the Graveyard.".to_owned()
|
||||
}
|
||||
)
|
||||
}
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_monster() {
|
||||
let s = r#"
|
||||
{
|
||||
"id": 2326738,
|
||||
"name": "Des Lacooda",
|
||||
"type": "Effect Monster",
|
||||
"desc": "Once per turn: You can change this card to face-down Defense Position. When this card is Flip Summoned: Draw 1 card.",
|
||||
"atk": 500,
|
||||
"def": 600,
|
||||
"level": 3,
|
||||
"race": "Zombie",
|
||||
"attribute": "EARTH"
|
||||
}"#;
|
||||
let munch: Card = serde_json::from_str(s).unwrap();
|
||||
assert_eq!(
|
||||
munch,
|
||||
Card::EffectMonster {
|
||||
name: "Des Lacooda".to_owned(),
|
||||
effect: "Once per turn: You can change this card to face-down Defense Position. When this card is Flip Summoned: Draw 1 card.".to_owned(),
|
||||
atk: 500,
|
||||
def: 600,
|
||||
level: 3,
|
||||
r#type: "Zombie".to_owned(),
|
||||
attribute: "EARTH".to_owned(),
|
||||
}
|
||||
)
|
||||
#[test]
|
||||
fn test_spell() {
|
||||
let s = r#"
|
||||
{
|
||||
"id": 41142615,
|
||||
"name": "The Cheerful Coffin",
|
||||
"type": "Spell Card",
|
||||
"desc": "Discard up to 3 Monster Cards from your hand to the Graveyard.",
|
||||
"race": "Normal"
|
||||
}"#;
|
||||
let coffin: Card = serde_json::from_str(s).unwrap();
|
||||
assert_eq!(
|
||||
coffin,
|
||||
Card::Backrow {
|
||||
base: CardBase {
|
||||
card_type: vec!["Spell".to_owned()],
|
||||
name: "The Cheerful Coffin".to_owned(),
|
||||
text: "Discard up to 3 Monster Cards from your hand to the Graveyard."
|
||||
.to_owned()
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_monster() {
|
||||
let s = r#"
|
||||
{
|
||||
"id": 2326738,
|
||||
"name": "Des Lacooda",
|
||||
"type": "Effect Monster",
|
||||
"desc": "Once per turn: You can change this card to face-down Defense Position. When this card is Flip Summoned: Draw 1 card.",
|
||||
"atk": 500,
|
||||
"def": 600,
|
||||
"level": 3,
|
||||
"race": "Zombie",
|
||||
"attribute": "EARTH"
|
||||
}"#;
|
||||
let munch: Card = serde_json::from_str(s).unwrap();
|
||||
assert_eq!(
|
||||
munch,
|
||||
Card::Monster {
|
||||
base: CardBase {
|
||||
card_type: vec!["Effect".to_owned(), "Monster".to_owned()],
|
||||
name: "Des Lacooda".to_owned(),
|
||||
text: "Once per turn: You can change this card to face-down Defense Position. When this card is Flip Summoned: Draw 1 card.".to_owned(),
|
||||
},
|
||||
monster: Monster {
|
||||
atk: Some(500),
|
||||
def: Some(600),
|
||||
level: Some(3),
|
||||
r#type: "Zombie".to_owned(),
|
||||
attribute: "EARTH".to_owned(),
|
||||
},
|
||||
link_rating: 0,
|
||||
linkmarkers: vec![]
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user