use serde::{Deserialize, Serialize};
use typed_builder::TypedBuilder;
use crate::queries::Host;
pub mod brand;
pub mod category;
pub mod category_tree;
pub mod colors;
pub mod country;
pub mod material;
pub mod size;
#[derive(TypedBuilder, Debug, Clone, Serialize, Deserialize)]
pub struct Filter {
#[builder(default, setter(strip_option))]
pub search_text: Option<String>,
#[builder(default, setter(strip_option))]
pub catalog_ids: Option<String>,
#[builder(default, setter(strip_option))]
pub color_ids: Option<String>,
#[builder(default, setter(strip_option))]
pub brand_ids: Option<String>,
#[builder(default, setter(strip_option))]
pub countries_ids: Option<String>,
#[builder(default, setter(strip_option))]
pub material_ids: Option<String>,
#[builder(default, setter(strip_option))]
pub size_ids: Option<String>,
#[builder(default, setter(strip_option))]
pub article_status: Option<Vec<ArticleStatus>>,
#[builder(default, setter(strip_option))]
pub sort_by: Option<SortBy>,
#[builder(default, setter(strip_option))]
pub price_from: Option<u32>,
#[builder(default, setter(strip_option))]
pub price_to: Option<u32>,
}
#[derive(Debug, Clone)]
pub enum Currency {
EUR,
USD,
GBP,
CZK,
PLN,
SEK,
RON,
HUF,
}
impl From<Currency> for Host {
fn from(currency: Currency) -> Self {
match currency {
Currency::USD => Host::Com,
Currency::GBP => Host::Uk,
Currency::CZK => Host::Cz,
Currency::PLN => Host::Pl,
Currency::SEK => Host::Se,
Currency::RON => Host::Ro,
Currency::HUF => Host::Hu,
Currency::EUR => Host::random_euro_host(),
}
}
}
impl From<Currency> for &str {
fn from(currency: Currency) -> Self {
match currency {
Currency::USD => "USD",
Currency::GBP => "GBP",
Currency::CZK => "CZK",
Currency::PLN => "PLN",
Currency::SEK => "SEK",
Currency::RON => "RON",
Currency::HUF => "HUF",
Currency::EUR => "EUR",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum ArticleStatus {
NewTags,
NewNoTags,
VeryGood,
Good,
Satisfactory,
}
impl From<&ArticleStatus> for &str {
fn from(status: &ArticleStatus) -> Self {
match *status {
ArticleStatus::NewTags => "6",
ArticleStatus::NewNoTags => "1",
ArticleStatus::VeryGood => "2",
ArticleStatus::Good => "3",
ArticleStatus::Satisfactory => "4",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum SortBy {
Relevance,
PriceDescendant,
PriceAscendant,
NewestFirst,
}
impl From<&SortBy> for &str {
fn from(sort: &SortBy) -> Self {
match *sort {
SortBy::Relevance => "relevance",
SortBy::PriceDescendant => "price_high_to_low",
SortBy::PriceAscendant => "price_low_to_high",
SortBy::NewestFirst => "newest_first",
}
}
}