use strum::Display;
use crate::{
interface::{FileType, WorkCategory, WorkType},
search::macros::*,
};
#[derive(Default)]
pub struct ProductSearchOptions {
pub language: Language,
pub keyword_creator: Option<String>,
pub sex_category: Option<Vec<SexCategory>>,
pub keyword: Option<String>,
pub regist_date_end: Option<String>,
pub price_low: Option<u32>,
pub price_high: Option<u32>,
pub ana_flg: Option<AnaFlg>,
pub age_category: Option<Vec<crate::interface::AgeCategory>>,
pub work_category: Option<Vec<WorkCategory>>,
pub order: Option<Order>,
pub work_type: Option<Vec<WorkType>>,
pub work_type_category: Option<Vec<WorkTypeCategory>>,
pub genre: Option<Vec<u32>>,
pub options_and_or: Option<OptionAndOr>,
pub options: Option<Vec<String>>,
pub options_not: Option<Vec<String>>,
pub file_type: Option<Vec<FileType>>,
pub rate_average: Option<u32>,
pub per_page: Option<u32>,
pub page: Option<u32>,
pub campagin: Option<bool>,
pub soon: Option<bool>,
pub is_pointup: Option<bool>,
pub is_free: Option<bool>,
pub release_term: Option<ReleaseTerm>,
}
impl ProductSearchOptions {
pub(super) fn to_path(&self) -> String {
let mut path = "/fsr/ajax/=".to_string();
push!(path, self, language);
push_option!(path, self, keyword_creator);
push_option_array!(path, self, sex_category);
push_option!(path, self, keyword);
push_option!(path, self, regist_date_end);
push_option!(path, self, price_low);
push_option!(path, self, price_high);
push_option!(path, self, ana_flg);
push_option_array!(path, self, age_category);
push_option_array!(path, self, work_category);
push_option!(path, self, order);
push_option_array!(path, self, work_type);
push_option_array!(path, self, work_type_category);
push_option_array!(path, self, genre);
push_option!(path, self, options_and_or);
push_option_array!(path, self, options);
push_option_array!(path, self, options_not);
push_option_array!(path, self, file_type);
push_option!(path, self, rate_average);
push_option!(path, self, per_page);
push_option!(path, self, page);
push_option_bool!(path, self, campagin);
push_option_bool!(path, self, soon);
push_option_bool!(path, self, is_pointup);
push_option_bool!(path, self, is_free);
push_option!(path, self, release_term);
path
}
}
#[derive(Display, Default)]
#[strum(serialize_all = "snake_case")]
pub enum Language {
#[default]
Jp,
}
#[derive(Display)]
#[strum(serialize_all = "snake_case")]
pub enum SexCategory {
Male,
Female,
}
#[derive(Display)]
#[strum(serialize_all = "snake_case")]
pub enum AnaFlg {
Off,
On,
Reserve,
All,
}
#[derive(Display)]
#[strum(serialize_all = "snake_case")]
pub enum Order {
Trend,
Release,
ReleaseD,
DlD,
Dl,
Price,
PriceD,
RateD,
ReviewD,
}
#[derive(Display)]
#[strum(serialize_all = "snake_case")]
pub enum WorkTypeCategory {
Game,
Comic,
Illust,
Novel,
MovieAudio,
Music,
Tool,
Etc,
}
#[derive(Display)]
#[strum(serialize_all = "snake_case")]
pub enum OptionAndOr {
And,
Or,
}
#[derive(Display)]
pub enum ReleaseTerm {
None,
Week,
Month,
Year,
Old,
}
#[cfg(test)]
mod tests {
use crate::search::options::*;
#[test]
fn product_search_param_default() {
assert_eq!(
"/fsr/ajax/=/language/jp",
super::ProductSearchOptions::default().to_path()
);
}
#[test]
fn product_search_param_1() {
assert_eq!(
"/fsr/ajax/=/language/jp/sex_category[0]/male/price_low/801/file_type[0]/PNG/file_type[1]/EXE/soon/1",
super::ProductSearchOptions {
sex_category: Some(vec![SexCategory::Male]),
price_low: Some(801),
file_type: Some(vec![FileType::PNG, FileType::EXE]),
soon: Some(true),
is_free: Some(false),
..Default::default()
}
.to_path()
);
}
}