scryfall-client 0.1.0

an wrapper for the scryfall API
use serde::export::Formatter;

pub mod artist;
pub mod block;
pub mod cmc;
pub mod collector_number;
pub mod color;
pub mod color_identity;
pub mod devotion;
pub mod flavor_text;
pub mod format;
pub mod include_extras;
pub mod is;
pub mod loyalty;
pub mod magic_type;
pub mod mana;
pub mod name;
pub mod not;
pub mod or;
pub mod oracle_text;
pub mod power;
pub mod produces;
pub mod rarity;
pub mod set;
pub mod toughness;
pub mod watermark;

pub trait SearchBuilderTrait {
    fn stringify(&self) -> String;
}

impl std::fmt::Display for Box<dyn SearchBuilderTrait> {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.to_string())
    }
}

pub struct Builder {
    children: Vec<Box<dyn SearchBuilderTrait>>,
}

impl Builder {
    pub fn new() -> Builder {
        Builder { children: vec![] }
    }

    pub fn add<E: 'static>(mut self, search_builder: E) -> Self
    where
        E: SearchBuilderTrait,
    {
        self.children.push(Box::new(search_builder));
        self
    }

    pub fn all_cards() -> Builder {
        Builder::new()
            .add(color::Color::greater_eq(0))
            .add(include_extras::IncludeExtras)
    }
}

impl SearchBuilderTrait for Builder {
    fn stringify(&self) -> String {
        self.children
            .iter()
            .map(|x| x.stringify())
            .collect::<Vec<String>>()
            .join(" ")
    }
}

#[macro_use]
pub mod macros {
    #[macro_export]
    macro_rules! equality_operator_implementer {
        ($name:ident, $t:tt) => {
            impl $name {
                pub fn eq(value: $t) -> $name {
                    $name::internal_new(value, "=")
                }
                pub fn less(value: $t) -> $name {
                    $name::internal_new(value, "<")
                }
                pub fn less_eq(value: $t) -> $name {
                    $name::internal_new(value, "<=")
                }
                pub fn greater(value: $t) -> $name {
                    $name::internal_new(value, ">")
                }
                pub fn greater_eq(value: $t) -> $name {
                    $name::internal_new(value, ">=")
                }
                pub fn not(value: $t) -> $name {
                    $name::internal_new(value, "!")
                }
            }
        };
        ($name:ident) => {
            crate::equality_operator_implementer!($name, u32);
        };
    }

    #[macro_export]
    macro_rules! equality_operator_implementer_trait {
        ($name:ident, $t:tt) => {
            impl $name {
                pub fn eq<T: $t>(value: T) -> $name {
                    $name::internal_new(value, "=")
                }
                pub fn less<T: $t>(value: T) -> $name {
                    $name::internal_new(value, "<")
                }
                pub fn less_eq<T: $t>(value: T) -> $name {
                    $name::internal_new(value, "<=")
                }
                pub fn greater<T: $t>(value: T) -> $name {
                    $name::internal_new(value, ">")
                }
                pub fn greater_eq<T: $t>(value: T) -> $name {
                    $name::internal_new(value, ">=")
                }
                pub fn not<T: $t>(value: T) -> $name {
                    $name::internal_new(value, "!")
                }
            }
        };
    }
}