use serde::{Serialize, Serializer};
use url::Url;
use crate::search::query::Query;
use crate::search::Search;
#[derive(Serialize, Default, Debug)]
pub struct SearchOptions {
#[serde(skip_serializing_if = "is_default")]
unique: UniqueStrategy,
#[serde(skip_serializing_if = "is_default")]
order: SortOrder,
#[serde(skip_serializing_if = "is_default")]
dir: SortDirection,
#[serde(skip_serializing_if = "is_default")]
page: usize,
#[serde(skip_serializing_if = "is_default")]
include_extras: bool,
#[serde(skip_serializing_if = "is_default")]
include_multilingual: bool,
#[serde(skip_serializing_if = "is_default")]
include_variations: bool,
#[serde(rename = "q", serialize_with = "serialize_query")]
query: Query,
}
fn is_default<T: Default + PartialEq>(value: &T) -> bool {
value == &Default::default()
}
fn serialize_query<S: Serializer>(query: &Query, serializer: S) -> Result<S::Ok, S::Error> {
query.to_string().serialize(serializer)
}
impl Search for SearchOptions {
fn write_query(&self, url: &mut Url) -> crate::Result<()> {
self.serialize(serde_urlencoded::Serializer::new(
&mut url.query_pairs_mut(),
))?;
Ok(())
}
}
impl SearchOptions {
pub fn new() -> Self {
SearchOptions {
page: 1,
..Default::default()
}
}
pub fn with_query(query: Query) -> Self {
SearchOptions {
query,
..Self::new()
}
}
pub fn query(&mut self, query: Query) -> &mut Self {
self.query = query;
self
}
pub fn page(&mut self, page: usize) -> &mut Self {
self.page = page;
self
}
pub fn unique(&mut self, unique: UniqueStrategy) -> &mut Self {
self.unique = unique;
self
}
#[inline]
pub fn sort(&mut self, order: SortOrder, dir: SortDirection) -> &mut Self {
self.order(order).direction(dir)
}
pub fn order(&mut self, order: SortOrder) -> &mut Self {
self.order = order;
self
}
pub fn direction(&mut self, dir: SortDirection) -> &mut Self {
self.dir = dir;
self
}
pub fn extras(&mut self, include_extras: bool) -> &mut Self {
self.include_extras = include_extras;
self
}
pub fn multilingual(&mut self, include_multilingual: bool) -> &mut Self {
self.include_multilingual = include_multilingual;
self
}
pub fn variations(&mut self, include_variations: bool) -> &mut Self {
self.include_variations = include_variations;
self
}
}
#[derive(Serialize, Copy, Clone, Eq, PartialEq, Hash, Debug)]
#[serde(rename_all = "lowercase")]
#[derive(Default)]
pub enum UniqueStrategy {
#[default]
Cards,
Art,
Prints,
}
#[derive(Serialize, Copy, Clone, Eq, PartialEq, Hash, Debug)]
#[serde(rename_all = "lowercase")]
#[derive(Default)]
pub enum SortOrder {
#[default]
Name,
Set,
Released,
Rarity,
Color,
Usd,
Tix,
Eur,
Cmc,
Power,
Toughness,
Edhrec,
Artist,
}
#[derive(Serialize, Copy, Clone, Eq, PartialEq, Hash, Debug)]
#[serde(rename_all = "lowercase")]
#[derive(Default)]
pub enum SortDirection {
#[default]
Auto,
#[serde(rename = "asc")]
Ascending,
#[serde(rename = "desc")]
Descending,
}