scryers 0.1.4

A simple alternative to Scryfall with caching and mass image downloading capabilities.
Documentation
use crate::downloader::DOWNLOADER;
use crate::scryfall_structures::ScryfallCard;

use anyhow::Result;

pub struct Card {
    pub(crate) raw_card: ScryfallCard,
}

impl Card {
    pub fn name(&self) -> &str {
        &self.raw_card.name
    }

    pub fn id(&self) -> &str {
        &self.raw_card.id
    }

    pub fn usd(&self) -> f64 {
        if let Some(Some(price)) = self.raw_card.prices.get("usd") {
            price.parse::<f64>().unwrap()
        } else {
            self.usd_foil()
        }
    }

    pub fn usd_foil(&self) -> f64 {
        if let Some(Some(price)) = self.raw_card.prices.get("usd_foil") {
            price.parse::<f64>().unwrap()
        } else {
            0.0
        }
    }

    pub fn lang(&self) -> &str {
        &self.raw_card.lang
    }

    pub fn promo(&self) -> bool {
        self.raw_card.promo
    }

    pub fn oracle_text(&self) -> &Option<String> {
        &self.raw_card.oracle_text
    }

    pub fn type_line(&self) -> &Option<String> {
        &self.raw_card.type_line
    }

    pub fn keywords(&self) -> &Vec<String> {
        &self.raw_card.keywords
    }

    pub fn artist(&self) -> &Option<String> {
        &self.raw_card.artist
    }

    pub fn flavor_name(&self) -> &Option<String> {
        &self.raw_card.flavor_name
    }

    pub fn flavor_text(&self) -> &Option<String> {
        &self.raw_card.flavor_text
    }

    pub fn set_name(&self) -> &Option<String> {
        &self.raw_card.flavor_text
    }

    pub fn get_images(&self) -> Result<Vec<Vec<u8>>> {
        if let Some(uris) = &self.raw_card.image_uris {
            Ok(vec![DOWNLOADER
                .lock()
                .unwrap()
                .make_request(&uris.normal)?
                .bytes()?
                .to_vec()])
        } else if let Some(faces) = &self.raw_card.card_faces {
            Ok(faces
                .iter()
                .filter_map(|f| {
                    if let Some(uris) = f.image_uris.as_ref() {
                        DOWNLOADER
                            .lock()
                            .unwrap()
                            .make_request(uris.normal.as_str())
                            .ok()
                    } else {
                        None
                    }
                })
                .filter_map(|r| r.bytes().ok())
                .map(|b| b.to_vec())
                .collect())
        } else {
            unreachable!("No images???")
        }
    }
}