use crate::errors::BubbleHearthResult;
#[derive(Debug, Default, Clone, Eq, PartialEq)]
pub struct CardSearchQuery<'a> {
pub set: Option<&'a str>,
pub class: Option<&'a str>,
pub mana_costs: Option<Vec<u32>>,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct CardSearchQueryBuilder<'a> {
query: CardSearchQuery<'a>,
}
impl<'a> Default for CardSearchQueryBuilder<'a> {
fn default() -> Self {
Self::new()
}
}
impl<'a> CardSearchQueryBuilder<'a> {
pub fn new() -> Self {
Self {
query: CardSearchQuery::default(),
}
}
pub fn with_set(self, set: &'a str) -> Self {
Self {
query: CardSearchQuery {
set: Some(set),
..self.query
},
}
}
pub fn with_class(self, slug: &'a str) -> Self {
Self {
query: CardSearchQuery {
class: Some(slug),
..self.query
},
}
}
pub fn with_mana_cost(self, mana_costs: Vec<u32>) -> Self {
match self.query.mana_costs {
None => {
let mut mana_costs = mana_costs.clone();
mana_costs.sort();
Self {
query: CardSearchQuery {
mana_costs: Some(mana_costs),
..self.query
},
}
}
Some(existing_mana_costs) => {
let mut mana_costs = mana_costs.clone();
mana_costs.sort();
let mut updated_mana_costs = [mana_costs, existing_mana_costs].concat();
updated_mana_costs.sort();
Self {
query: CardSearchQuery {
mana_costs: Some(updated_mana_costs),
..self.query
},
}
}
}
}
pub fn build(self) -> BubbleHearthResult<CardSearchQuery<'a>> {
Ok(self.query)
}
}
#[cfg(test)]
mod card_search_queries {
use crate::hearthstone::card_search::CardSearchQueryBuilder;
#[test]
fn returns_ok_when_validly_built() {
let builder = CardSearchQueryBuilder::new();
let query = builder.with_set("set").with_class("slug").build();
let query_ok = query.is_ok();
let query = query.unwrap();
assert!(query_ok);
assert_eq!(query.set, Some("set"));
assert_eq!(query.class, Some("slug"));
}
#[test]
fn returns_ok_when_built_with_lists() {
let expected = vec![100, 200];
let builder = CardSearchQueryBuilder::new();
let query = builder.with_mana_cost(expected.clone()).build();
let query_ok = query.is_ok();
let query = query.unwrap();
dbg!(&query);
assert!(query_ok);
assert_eq!(query.mana_costs, Some(expected));
}
#[test]
fn returns_ok_when_built_with_lists_and_appended() {
let expected = vec![100, 200, 300];
let builder = CardSearchQueryBuilder::new();
let query = builder
.with_mana_cost(vec![100, 200])
.with_mana_cost(vec![300])
.build();
let query_ok = query.is_ok();
let query = query.unwrap();
assert!(query_ok);
assert_eq!(query.mana_costs, Some(expected));
}
#[test]
fn returns_ok_when_built_with_unsorted_lists_and_appended() {
let expected = vec![50, 100, 150, 200];
let builder = CardSearchQueryBuilder::new();
let query = builder
.with_mana_cost(vec![200, 50])
.with_mana_cost(vec![150, 100])
.build();
let query_ok = query.is_ok();
let query = query.unwrap();
assert!(query_ok);
assert_eq!(query.mana_costs, Some(expected));
}
}