Initial commit of scryfall library
This commit is contained in:
commit
5f04c6538f
11
Cargo.toml
Normal file
11
Cargo.toml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[package]
|
||||||
|
name = "scryfall"
|
||||||
|
version = "0.0.1"
|
||||||
|
authors = ["A. Malacoda <adrian.malacoda@monarch-pass.net>"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
reqwest = "0.8.0"
|
||||||
|
serde = "1.0.14"
|
||||||
|
serde_derive = "1.0.14"
|
||||||
|
serde_json = "1.0.3"
|
||||||
|
derive-error = "0.0.3"
|
125
src/lib.rs
Normal file
125
src/lib.rs
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
extern crate serde;
|
||||||
|
extern crate serde_json;
|
||||||
|
#[macro_use] extern crate serde_derive;
|
||||||
|
extern crate reqwest;
|
||||||
|
#[macro_use] extern crate derive_error;
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::io::Read;
|
||||||
|
|
||||||
|
pub struct Scryfall {}
|
||||||
|
|
||||||
|
impl Scryfall {
|
||||||
|
pub fn new() -> Scryfall {
|
||||||
|
Scryfall {}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn search(&self, query: &str) -> Result<CardList, Error> {
|
||||||
|
let mut response = reqwest::get(&format!("https://api.scryfall.com/cards/search?q={}", query))?;
|
||||||
|
let mut content = String::new();
|
||||||
|
response.read_to_string(&mut content);
|
||||||
|
Result::Ok(serde_json::from_str(&content)?)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub struct CardList {
|
||||||
|
pub data: Vec<Card>,
|
||||||
|
pub has_more: bool,
|
||||||
|
pub next_page: Option<String>,
|
||||||
|
pub total_cards: u32,
|
||||||
|
pub warnings: Option<Vec<String>>
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub struct Card {
|
||||||
|
pub id: String,
|
||||||
|
pub multiverse_ids: Vec<u32>,
|
||||||
|
pub mtgo_id: Option<u32>,
|
||||||
|
pub mtgo_foil_id: Option<u32>,
|
||||||
|
pub uri: String,
|
||||||
|
pub scryfall_uri: String,
|
||||||
|
pub rulings_uri: String,
|
||||||
|
|
||||||
|
pub name: String,
|
||||||
|
pub layout: String,
|
||||||
|
pub cmc: f32,
|
||||||
|
pub type_line: String,
|
||||||
|
pub oracle_text: Option<String>,
|
||||||
|
pub mana_cost: String,
|
||||||
|
pub power: Option<String>,
|
||||||
|
pub toughness: Option<String>,
|
||||||
|
pub loyalty: Option<String>,
|
||||||
|
pub life_modifier: Option<String>,
|
||||||
|
pub hand_modifier: Option<String>,
|
||||||
|
pub colors: Colors,
|
||||||
|
pub color_indicator: Option<Colors>,
|
||||||
|
pub color_identity: Colors,
|
||||||
|
pub all_parts: Option<Vec<RelatedCard>>,
|
||||||
|
pub card_faces: Option<Vec<CardFace>>,
|
||||||
|
pub legalities: HashMap<String, String>,
|
||||||
|
pub reserved: bool,
|
||||||
|
pub edhrec_rank: Option<u32>,
|
||||||
|
|
||||||
|
pub set: String,
|
||||||
|
pub set_name: String,
|
||||||
|
pub collector_number: String,
|
||||||
|
pub set_search_uri: String,
|
||||||
|
pub scryfall_set_uri: String,
|
||||||
|
pub image_uris: Option<HashMap<String, String>>,
|
||||||
|
pub highres_image: bool,
|
||||||
|
pub reprint: bool,
|
||||||
|
pub digital: bool,
|
||||||
|
pub rarity: String,
|
||||||
|
pub flavor_text: Option<String>,
|
||||||
|
pub artist: Option<String>,
|
||||||
|
pub frame: String,
|
||||||
|
pub full_art: bool,
|
||||||
|
pub watermark: Option<String>,
|
||||||
|
pub border_color: String,
|
||||||
|
pub story_spotlight_number: Option<u32>,
|
||||||
|
pub story_spotlight_uri: Option<String>,
|
||||||
|
pub timeshifted: bool,
|
||||||
|
pub colorshifted: bool,
|
||||||
|
pub futureshifted: bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type Colors = Vec<String>;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub struct RelatedCard {
|
||||||
|
pub id: String,
|
||||||
|
pub name: String,
|
||||||
|
pub uri: String
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub struct CardFace {
|
||||||
|
pub name: String,
|
||||||
|
pub type_line: String,
|
||||||
|
pub oracle_text: Option<String>,
|
||||||
|
pub mana_cost: String,
|
||||||
|
pub colors: Colors,
|
||||||
|
pub color_indicator: Option<Colors>,
|
||||||
|
pub power: Option<String>,
|
||||||
|
pub toughness: Option<String>,
|
||||||
|
pub loyalty: Option<String>,
|
||||||
|
pub flavor_text: Option<String>,
|
||||||
|
pub image_uris: Option<HashMap<String, String>>
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Error)]
|
||||||
|
pub enum Error {
|
||||||
|
/// HTTP request failed
|
||||||
|
HTTP(reqwest::Error),
|
||||||
|
/// Failed to parse
|
||||||
|
Parse(serde_json::Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
fn it_works() {
|
||||||
|
assert_eq!(2 + 2, 4);
|
||||||
|
}
|
||||||
|
}
|
9
src/main.rs
Normal file
9
src/main.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
extern crate scryfall;
|
||||||
|
use scryfall::Scryfall;
|
||||||
|
use std::env;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let query = env::args().nth(1).expect("please supply an query");
|
||||||
|
let sf = Scryfall::new();
|
||||||
|
println!("{:?}", sf.search(&query).expect("Search failed"));
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user